Index: third_party/WebKit/Source/core/dom/SelectorQuery.cpp |
diff --git a/third_party/WebKit/Source/core/dom/SelectorQuery.cpp b/third_party/WebKit/Source/core/dom/SelectorQuery.cpp |
index 179af326688c79a32b66f4b4c9d1d47a9e46e1b0..83557a094682b77d725f592402854b7f2b5b92b4 100644 |
--- a/third_party/WebKit/Source/core/dom/SelectorQuery.cpp |
+++ b/third_party/WebKit/Source/core/dom/SelectorQuery.cpp |
@@ -121,13 +121,7 @@ inline bool selectorMatches(const CSSSelector& selector, |
bool SelectorQuery::matches(Element& targetElement) const { |
if (m_needsUpdatedDistribution) |
targetElement.updateDistribution(); |
- |
- for (const auto& selector : m_selectors) { |
- if (selectorMatches(*selector, targetElement, targetElement)) |
- return true; |
- } |
- |
- return false; |
+ return selectorListMatches(targetElement, targetElement); |
} |
Element* SelectorQuery::closest(Element& targetElement) const { |
@@ -138,10 +132,8 @@ Element* SelectorQuery::closest(Element& targetElement) const { |
for (Element* currentElement = &targetElement; currentElement; |
currentElement = currentElement->parentElement()) { |
- for (const auto& selector : m_selectors) { |
- if (selectorMatches(*selector, *currentElement, targetElement)) |
- return currentElement; |
- } |
+ if (selectorListMatches(targetElement, *currentElement)) |
+ return currentElement; |
} |
return nullptr; |
} |
@@ -326,16 +318,11 @@ void SelectorQuery::executeForTraverseRoot( |
} |
} |
-template <typename SelectorQueryTrait> |
-bool SelectorQuery::selectorListMatches( |
- ContainerNode& rootNode, |
- Element& element, |
- typename SelectorQueryTrait::OutputType& output) const { |
+bool SelectorQuery::selectorListMatches(ContainerNode& rootNode, |
+ Element& element) const { |
for (const auto& selector : m_selectors) { |
- if (selectorMatches(*selector, element, rootNode)) { |
- SelectorQueryTrait::appendElement(output, element); |
+ if (selectorMatches(*selector, element, rootNode)) |
return true; |
- } |
} |
return false; |
} |
@@ -345,8 +332,10 @@ void SelectorQuery::executeSlow( |
ContainerNode& rootNode, |
typename SelectorQueryTrait::OutputType& output) const { |
for (Element& element : ElementTraversal::descendantsOf(rootNode)) { |
- if (selectorListMatches<SelectorQueryTrait>(rootNode, element, output) && |
- SelectorQueryTrait::shouldOnlyMatchFirstElement) |
+ if (!selectorListMatches(rootNode, element)) |
+ continue; |
+ SelectorQueryTrait::appendElement(output, element); |
+ if (SelectorQueryTrait::shouldOnlyMatchFirstElement) |
return; |
} |
} |
@@ -404,8 +393,10 @@ void SelectorQuery::executeSlowTraversingShadowTree( |
if (!node->isElementNode()) |
continue; |
Element* element = toElement(node); |
- if (selectorListMatches<SelectorQueryTrait>(rootNode, *element, output) && |
- SelectorQueryTrait::shouldOnlyMatchFirstElement) |
+ if (!selectorListMatches(rootNode, *element)) |
+ continue; |
+ SelectorQueryTrait::appendElement(output, *element); |
+ if (SelectorQueryTrait::shouldOnlyMatchFirstElement) |
return; |
} |
} |