Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Unified Diff: third_party/WebKit/Source/core/dom/SelectorQuery.cpp

Issue 2797083002: Test cases for querySelector fast paths. (Closed)
Patch Set: Working tests. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 9576ad6c6034a483d379eac48d7938ecfa3be346..d0c4c0677b07f89cdff30ea43d33f2504c20680e 100644
--- a/third_party/WebKit/Source/core/dom/SelectorQuery.cpp
+++ b/third_party/WebKit/Source/core/dom/SelectorQuery.cpp
@@ -45,6 +45,27 @@ namespace blink {
using namespace HTMLNames;
+#if DCHECK_IS_ON()
+static SelectorQuery::QueryStats& currentQueryStats() {
+ DEFINE_STATIC_LOCAL(SelectorQuery::QueryStats, stats, ());
+ return stats;
+}
+
+SelectorQuery::QueryStats SelectorQuery::lastQueryStats() {
+ return currentQueryStats();
+}
+
+#define QUERY_STATS_INCREMENT(name) \
+ (void)(currentQueryStats().totalCount++, currentQueryStats().name++);
+#define QUERY_STATS_RESET() (void)(currentQueryStats() = {});
+
+#else
+
+#define QUERY_STATS_INCREMENT(name)
+#define QUERY_STATS_RESET()
+
+#endif
+
struct SingleElementSelectorQueryTrait {
typedef Element* OutputType;
static const bool shouldOnlyMatchFirstElement = true;
@@ -84,12 +105,14 @@ inline bool selectorMatches(const CSSSelector& selector,
}
bool SelectorQuery::matches(Element& targetElement) const {
+ QUERY_STATS_RESET();
if (m_needsUpdatedDistribution)
targetElement.updateDistribution();
return selectorListMatches(targetElement, targetElement);
}
Element* SelectorQuery::closest(Element& targetElement) const {
+ QUERY_STATS_RESET();
if (m_selectors.isEmpty())
return nullptr;
if (m_needsUpdatedDistribution)
@@ -104,6 +127,7 @@ Element* SelectorQuery::closest(Element& targetElement) const {
}
StaticElementList* SelectorQuery::queryAll(ContainerNode& rootNode) const {
+ QUERY_STATS_RESET();
NthIndexCache nthIndexCache(rootNode.document());
HeapVector<Member<Element>> result;
execute<AllElementsSelectorQueryTrait>(rootNode, result);
@@ -111,6 +135,7 @@ StaticElementList* SelectorQuery::queryAll(ContainerNode& rootNode) const {
}
Element* SelectorQuery::queryFirst(ContainerNode& rootNode) const {
+ QUERY_STATS_RESET();
NthIndexCache nthIndexCache(rootNode.document());
Element* matchedElement = nullptr;
execute<SingleElementSelectorQueryTrait>(rootNode, matchedElement);
@@ -124,6 +149,7 @@ static void collectElementsByClassName(
const CSSSelector* selector,
typename SelectorQueryTrait::OutputType& output) {
for (Element& element : ElementTraversal::descendantsOf(rootNode)) {
+ QUERY_STATS_INCREMENT(fastClass);
if (!hasClassName(element, className))
continue;
if (selector && !selectorMatches(*selector, element, rootNode))
@@ -156,6 +182,7 @@ static void collectElementsByTagName(
typename SelectorQueryTrait::OutputType& output) {
DCHECK_EQ(tagName.namespaceURI(), starAtom);
for (Element& element : ElementTraversal::descendantsOf(rootNode)) {
+ QUERY_STATS_INCREMENT(fastTagName);
if (matchesTagName(tagName, element)) {
SelectorQueryTrait::appendElement(output, element);
if (SelectorQueryTrait::shouldOnlyMatchFirstElement)
@@ -276,6 +303,7 @@ void SelectorQuery::executeForTraverseRoot(
const CSSSelector& selector = *m_selectors[0];
for (Element& element : ElementTraversal::descendantsOf(traverseRoot)) {
+ QUERY_STATS_INCREMENT(fastScan);
if (selectorMatches(selector, element, rootNode)) {
SelectorQueryTrait::appendElement(output, element);
if (SelectorQueryTrait::shouldOnlyMatchFirstElement)
@@ -298,6 +326,7 @@ void SelectorQuery::executeSlow(
ContainerNode& rootNode,
typename SelectorQueryTrait::OutputType& output) const {
for (Element& element : ElementTraversal::descendantsOf(rootNode)) {
+ QUERY_STATS_INCREMENT(slowScan);
if (!selectorListMatches(rootNode, element))
continue;
SelectorQueryTrait::appendElement(output, element);
@@ -358,6 +387,7 @@ void SelectorQuery::executeSlowTraversingShadowTree(
node; node = nextTraversingShadowTree(*node, &rootNode)) {
if (!node->isElementNode())
continue;
+ QUERY_STATS_INCREMENT(slowTraversingShadowTreeScan);
Element* element = toElement(node);
if (!selectorListMatches(rootNode, *element))
continue;
@@ -419,6 +449,7 @@ void SelectorQuery::execute(
for (const auto& element : elements) {
if (!element->isDescendantOf(&rootNode))
continue;
+ QUERY_STATS_INCREMENT(fastId);
if (selectorMatches(selector, *element, rootNode)) {
SelectorQueryTrait::appendElement(output, *element);
if (SelectorQueryTrait::shouldOnlyMatchFirstElement)
@@ -432,6 +463,7 @@ void SelectorQuery::execute(
return;
if (!element->isDescendantOf(&rootNode))
return;
+ QUERY_STATS_INCREMENT(fastId);
if (selectorMatches(selector, *element, rootNode))
SelectorQueryTrait::appendElement(output, *element);
return;
« no previous file with comments | « third_party/WebKit/Source/core/dom/SelectorQuery.h ('k') | third_party/WebKit/Source/core/dom/SelectorQueryTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698