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

Side by Side Diff: Source/core/dom/SelectorQuery.cpp

Issue 67473002: Have ElementTraversal / NodeTraversal's next() methods take a reference (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase on master Created 7 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « Source/core/dom/Range.cpp ('k') | Source/core/dom/TreeScope.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 { 75 {
76 Node* current = m_currentElement; 76 Node* current = m_currentElement;
77 ASSERT(current); 77 ASSERT(current);
78 m_currentElement = nextInternal(ElementTraversal::nextSkippingChildren(m _currentElement, m_rootNode)); 78 m_currentElement = nextInternal(ElementTraversal::nextSkippingChildren(m _currentElement, m_rootNode));
79 return current; 79 return current;
80 } 80 }
81 81
82 private: 82 private:
83 Element* nextInternal(Element* element) 83 Element* nextInternal(Element* element)
84 { 84 {
85 for (; element; element = ElementTraversal::next(element, m_rootNode)) { 85 for (; element; element = ElementTraversal::next(*element, m_rootNode)) {
86 if (element->hasClass() && element->classNames().contains(m_classNam e)) 86 if (element->hasClass() && element->classNames().contains(m_classNam e))
87 return element; 87 return element;
88 } 88 }
89 return 0; 89 return 0;
90 } 90 }
91 91
92 const AtomicString& m_className; 92 const AtomicString& m_className;
93 Node* m_rootNode; 93 Node* m_rootNode;
94 Element* m_currentElement; 94 Element* m_currentElement;
95 }; 95 };
96 96
97 class ClassElementList : public SimpleNodeList { 97 class ClassElementList : public SimpleNodeList {
98 public: 98 public:
99 ClassElementList(Node* rootNode, const AtomicString& className) 99 ClassElementList(Node* rootNode, const AtomicString& className)
100 : m_className(className) 100 : m_className(className)
101 , m_rootNode(rootNode) 101 , m_rootNode(rootNode)
102 , m_currentElement(nextInternal(ElementTraversal::firstWithin(rootNode)) ) { } 102 , m_currentElement(nextInternal(ElementTraversal::firstWithin(rootNode)) ) { }
103 103
104 bool isEmpty() const { return !m_currentElement; } 104 bool isEmpty() const { return !m_currentElement; }
105 105
106 Node* next() 106 Node* next()
107 { 107 {
108 Node* current = m_currentElement; 108 Node* current = m_currentElement;
109 ASSERT(current); 109 ASSERT(current);
110 m_currentElement = nextInternal(ElementTraversal::next(m_currentElement, m_rootNode)); 110 m_currentElement = nextInternal(ElementTraversal::next(*m_currentElement , m_rootNode));
111 return current; 111 return current;
112 } 112 }
113 113
114 private: 114 private:
115 Element* nextInternal(Element* element) 115 Element* nextInternal(Element* element)
116 { 116 {
117 for (; element; element = ElementTraversal::next(element, m_rootNode)) { 117 for (; element; element = ElementTraversal::next(*element, m_rootNode)) {
118 if (element->hasClass() && element->classNames().contains(m_classNam e)) 118 if (element->hasClass() && element->classNames().contains(m_classNam e))
119 return element; 119 return element;
120 } 120 }
121 return 0; 121 return 0;
122 } 122 }
123 123
124 const AtomicString& m_className; 124 const AtomicString& m_className;
125 Node* m_rootNode; 125 Node* m_rootNode;
126 Element* m_currentElement; 126 Element* m_currentElement;
127 }; 127 };
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 } 180 }
181 181
182 static inline bool isTreeScopeRoot(Node* node) 182 static inline bool isTreeScopeRoot(Node* node)
183 { 183 {
184 ASSERT(node); 184 ASSERT(node);
185 return node->isDocumentNode() || node->isShadowRoot(); 185 return node->isDocumentNode() || node->isShadowRoot();
186 } 186 }
187 187
188 void SelectorDataList::collectElementsByClassName(Node& rootNode, const AtomicSt ring& className, Vector<RefPtr<Node> >& traversalRoots) const 188 void SelectorDataList::collectElementsByClassName(Node& rootNode, const AtomicSt ring& className, Vector<RefPtr<Node> >& traversalRoots) const
189 { 189 {
190 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(element, &rootNode)) { 190 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(*element, &rootNode)) {
191 if (element->hasClass() && element->classNames().contains(className)) 191 if (element->hasClass() && element->classNames().contains(className))
192 traversalRoots.append(element); 192 traversalRoots.append(element);
193 } 193 }
194 } 194 }
195 195
196 void SelectorDataList::collectElementsByTagName(Node& rootNode, const QualifiedN ame& tagName, Vector<RefPtr<Node> >& traversalRoots) const 196 void SelectorDataList::collectElementsByTagName(Node& rootNode, const QualifiedN ame& tagName, Vector<RefPtr<Node> >& traversalRoots) const
197 { 197 {
198 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(element, &rootNode)) { 198 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(*element, &rootNode)) {
199 if (SelectorChecker::tagMatches(*element, tagName)) 199 if (SelectorChecker::tagMatches(*element, tagName))
200 traversalRoots.append(element); 200 traversalRoots.append(element);
201 } 201 }
202 } 202 }
203 203
204 Element* SelectorDataList::findElementByClassName(Node& rootNode, const AtomicSt ring& className) const 204 Element* SelectorDataList::findElementByClassName(Node& rootNode, const AtomicSt ring& className) const
205 { 205 {
206 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(element, &rootNode)) { 206 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(*element, &rootNode)) {
207 if (element->hasClass() && element->classNames().contains(className)) 207 if (element->hasClass() && element->classNames().contains(className))
208 return element; 208 return element;
209 } 209 }
210 return 0; 210 return 0;
211 } 211 }
212 212
213 Element* SelectorDataList::findElementByTagName(Node& rootNode, const QualifiedN ame& tagName) const 213 Element* SelectorDataList::findElementByTagName(Node& rootNode, const QualifiedN ame& tagName) const
214 { 214 {
215 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(element, &rootNode)) { 215 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(*element, &rootNode)) {
216 if (SelectorChecker::tagMatches(*element, tagName)) 216 if (SelectorChecker::tagMatches(*element, tagName))
217 return element; 217 return element;
218 } 218 }
219 return 0; 219 return 0;
220 } 220 }
221 221
222 inline bool SelectorDataList::canUseFastQuery(const Node& rootNode) const 222 inline bool SelectorDataList::canUseFastQuery(const Node& rootNode) const
223 { 223 {
224 return m_selectors.size() == 1 && rootNode.inDocument() && !rootNode.documen t().inQuirksMode(); 224 return m_selectors.size() == 1 && rootNode.inDocument() && !rootNode.documen t().inQuirksMode();
225 } 225 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 else 296 else
297 startFromParent = false; 297 startFromParent = false;
298 } 298 }
299 299
300 matchTraverseRoots = false; 300 matchTraverseRoots = false;
301 return adoptPtr(new SingleNodeList(rootNode)); 301 return adoptPtr(new SingleNodeList(rootNode));
302 } 302 }
303 303
304 void SelectorDataList::executeSlowQueryAll(Node& rootNode, Vector<RefPtr<Node> > & matchedElements) const 304 void SelectorDataList::executeSlowQueryAll(Node& rootNode, Vector<RefPtr<Node> > & matchedElements) const
305 { 305 {
306 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(element, &rootNode)) { 306 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(*element, &rootNode)) {
307 for (unsigned i = 0; i < m_selectors.size(); ++i) { 307 for (unsigned i = 0; i < m_selectors.size(); ++i) {
308 if (selectorMatches(m_selectors[i], *element, rootNode)) { 308 if (selectorMatches(m_selectors[i], *element, rootNode)) {
309 matchedElements.append(element); 309 matchedElements.append(element);
310 break; 310 break;
311 } 311 }
312 } 312 }
313 } 313 }
314 } 314 }
315 315
316 void SelectorDataList::executeQueryAll(Node& rootNode, Vector<RefPtr<Node> >& ma tchedElements) const 316 void SelectorDataList::executeQueryAll(Node& rootNode, Vector<RefPtr<Node> >& ma tchedElements) const
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 Node& node = *traverseRoots->next(); 357 Node& node = *traverseRoots->next();
358 Element& element = toElement(node); 358 Element& element = toElement(node);
359 if (selectorMatches(selector, element, rootNode)) 359 if (selectorMatches(selector, element, rootNode))
360 matchedElements.append(&element); 360 matchedElements.append(&element);
361 } 361 }
362 return; 362 return;
363 } 363 }
364 364
365 while (!traverseRoots->isEmpty()) { 365 while (!traverseRoots->isEmpty()) {
366 Node* traverseRoot = traverseRoots->next(); 366 Node* traverseRoot = traverseRoots->next();
367 for (Element* element = ElementTraversal::firstWithin(traverseRoot); ele ment; element = ElementTraversal::next(element, traverseRoot)) { 367 for (Element* element = ElementTraversal::firstWithin(traverseRoot); ele ment; element = ElementTraversal::next(*element, traverseRoot)) {
368 if (selectorMatches(selector, *element, rootNode)) 368 if (selectorMatches(selector, *element, rootNode))
369 matchedElements.append(element); 369 matchedElements.append(element);
370 } 370 }
371 } 371 }
372 } 372 }
373 373
374 // If matchTraverseRoot is true, the returned Node is the single Element that ma y match the selector query. 374 // If matchTraverseRoot is true, the returned Node is the single Element that ma y match the selector query.
375 // 375 //
376 // If matchTraverseRoot is false, the returned Node is the rootNode parameter or a descendant of rootNode representing 376 // If matchTraverseRoot is false, the returned Node is the rootNode parameter or a descendant of rootNode representing
377 // the subtree for which we can limit the querySelector traversal. 377 // the subtree for which we can limit the querySelector traversal.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 startFromParent = true; 411 startFromParent = true;
412 else 412 else
413 startFromParent = false; 413 startFromParent = false;
414 } 414 }
415 matchTraverseRoot = false; 415 matchTraverseRoot = false;
416 return &rootNode; 416 return &rootNode;
417 } 417 }
418 418
419 Element* SelectorDataList::executeSlowQueryFirst(Node& rootNode) const 419 Element* SelectorDataList::executeSlowQueryFirst(Node& rootNode) const
420 { 420 {
421 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(element, &rootNode)) { 421 for (Element* element = ElementTraversal::firstWithin(&rootNode); element; e lement = ElementTraversal::next(*element, &rootNode)) {
422 for (unsigned i = 0; i < m_selectors.size(); ++i) { 422 for (unsigned i = 0; i < m_selectors.size(); ++i) {
423 if (selectorMatches(m_selectors[i], *element, rootNode)) 423 if (selectorMatches(m_selectors[i], *element, rootNode))
424 return element; 424 return element;
425 } 425 }
426 } 426 }
427 return 0; 427 return 0;
428 } 428 }
429 429
430 Element* SelectorDataList::executeQueryFirst(Node& rootNode) const 430 Element* SelectorDataList::executeQueryFirst(Node& rootNode) const
431 { 431 {
(...skipping 28 matching lines...) Expand all
460 Node* traverseRootNode = findTraverseRoot(rootNode, matchTraverseRoot); 460 Node* traverseRootNode = findTraverseRoot(rootNode, matchTraverseRoot);
461 if (!traverseRootNode) 461 if (!traverseRootNode)
462 return 0; 462 return 0;
463 if (matchTraverseRoot) { 463 if (matchTraverseRoot) {
464 ASSERT(m_selectors.size() == 1); 464 ASSERT(m_selectors.size() == 1);
465 ASSERT(traverseRootNode->isElementNode()); 465 ASSERT(traverseRootNode->isElementNode());
466 Element& element = toElement(*traverseRootNode); 466 Element& element = toElement(*traverseRootNode);
467 return selectorMatches(m_selectors[0], element, rootNode) ? &element : 0 ; 467 return selectorMatches(m_selectors[0], element, rootNode) ? &element : 0 ;
468 } 468 }
469 469
470 for (Element* element = ElementTraversal::firstWithin(traverseRootNode); ele ment; element = ElementTraversal::next(element, traverseRootNode)) { 470 for (Element* element = ElementTraversal::firstWithin(traverseRootNode); ele ment; element = ElementTraversal::next(*element, traverseRootNode)) {
471 if (selectorMatches(m_selectors[0], *element, rootNode)) 471 if (selectorMatches(m_selectors[0], *element, rootNode))
472 return element; 472 return element;
473 } 473 }
474 return 0; 474 return 0;
475 } 475 }
476 476
477 SelectorQuery::SelectorQuery(const CSSSelectorList& selectorList) 477 SelectorQuery::SelectorQuery(const CSSSelectorList& selectorList)
478 : m_selectorList(selectorList) 478 : m_selectorList(selectorList)
479 { 479 {
480 m_selectors.initialize(m_selectorList); 480 m_selectors.initialize(m_selectorList);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 m_entries.add(selectors, selectorQuery.release()); 525 m_entries.add(selectors, selectorQuery.release());
526 return rawSelectorQuery; 526 return rawSelectorQuery;
527 } 527 }
528 528
529 void SelectorQueryCache::invalidate() 529 void SelectorQueryCache::invalidate()
530 { 530 {
531 m_entries.clear(); 531 m_entries.clear();
532 } 532 }
533 533
534 } 534 }
OLDNEW
« no previous file with comments | « Source/core/dom/Range.cpp ('k') | Source/core/dom/TreeScope.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698