Bug 1410624: Integrate QuerySelectorAll in Gecko. r=heycam draft
authorEmilio Cobos Álvarez <emilio@crisal.io>
Sun, 22 Oct 2017 02:19:14 +0200
changeset 690475 7917c3ad070820bf7bac54fab17ba7c0424143b7
parent 690453 41cbd2998e63fcaf12b1aea6411c6b7da5ee3ef6
child 690476 f893dff589cbc67625109afce0a3b39ccc0be836
push id87308
push userbmo:emilio@crisal.io
push dateThu, 02 Nov 2017 01:16:37 +0000
reviewersheycam
bugs1410624
milestone58.0a1
Bug 1410624: Integrate QuerySelectorAll in Gecko. r=heycam MozReview-Commit-ID: 2Jf3Z6ikjXB
dom/base/nsINode.cpp
layout/style/ServoBindings.cpp
--- 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]));
   }
 }