Bug 1410624: Integrate QuerySelectorAll in Gecko. r=heycam
MozReview-Commit-ID: 2Jf3Z6ikjXB
--- a/dom/base/nsINode.cpp
+++ b/dom/base/nsINode.cpp
@@ -2940,26 +2940,33 @@ nsINode::QuerySelector(const nsAString&
return holder.mElement;
}
already_AddRefed<nsINodeList>
nsINode::QuerySelectorAll(const nsAString& aSelector, ErrorResult& aResult)
{
RefPtr<nsSimpleContentList> contentList = new nsSimpleContentList(this);
- nsCSSSelectorList* selectorList = ParseSelectorList(aSelector, aResult);
- if (selectorList) {
- FindMatchingElements<false, AutoTArray<Element*, 128>>(this,
- selectorList,
- *contentList,
- aResult);
- } else {
- // Either we failed (and aResult already has the exception), or this
- // is a pseudo-element-only selector that matches nothing.
- }
+ WithSelectorList<void>(
+ aSelector,
+ aResult,
+ [&](const RawServoSelectorList* aList) {
+ if (!aList) {
+ return;
+ }
+ Servo_SelectorList_QueryAll(this, aList, contentList.get());
+ },
+ [&](nsCSSSelectorList* aList) {
+ if (!aList) {
+ return;
+ }
+ FindMatchingElements<false, AutoTArray<Element*, 128>>(
+ this, aList, *contentList, aResult);
+ }
+ );
return contentList.forget();
}
Element*
nsINode::GetElementById(const nsAString& aId)
{
MOZ_ASSERT(IsElement() || IsNodeOfType(eDOCUMENT_FRAGMENT),
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -2861,12 +2861,13 @@ Gecko_ContentList_AppendAll(
const Element** aElements,
size_t aLength)
{
MOZ_ASSERT(aElements);
MOZ_ASSERT(aLength);
MOZ_ASSERT(aList);
aList->SetCapacity(aLength);
+
for (size_t i = 0; i < aLength; ++i) {
aList->AppendElement(const_cast<Element*>(aElements[i]));
}
}