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

Side by Side Diff: Source/core/css/SiblingTraversalStrategies.h

Issue 1023393002: Cache element indices for :nth-child and :nth-last-child selectors. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Back to stack-based cache Created 5 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
(...skipping 13 matching lines...) Expand all
24 * along with this library; see the file COPYING.LIB. If not, write to 24 * along with this library; see the file COPYING.LIB. If not, write to
25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26 * Boston, MA 02110-1301, USA. 26 * Boston, MA 02110-1301, USA.
27 */ 27 */
28 28
29 #ifndef SiblingTraversalStrategies_h 29 #ifndef SiblingTraversalStrategies_h
30 #define SiblingTraversalStrategies_h 30 #define SiblingTraversalStrategies_h
31 31
32 #include "core/dom/Element.h" 32 #include "core/dom/Element.h"
33 #include "core/dom/ElementTraversal.h" 33 #include "core/dom/ElementTraversal.h"
34 #include "core/dom/NthIndexCache.h"
34 #include "core/layout/style/LayoutStyle.h" 35 #include "core/layout/style/LayoutStyle.h"
35 36
36 namespace blink { 37 namespace blink {
37 38
38 class DOMSiblingTraversalStrategy { 39 class DOMSiblingTraversalStrategy {
39 public: 40 public:
40 bool isFirstChild(Element&) const; 41 bool isFirstChild(Element&) const;
41 bool isLastChild(Element&) const; 42 bool isLastChild(Element&) const;
42 bool isFirstOfType(Element&, const QualifiedName&) const; 43 bool isFirstOfType(Element&, const QualifiedName&) const;
43 bool isLastOfType(Element&, const QualifiedName&) const; 44 bool isLastOfType(Element&, const QualifiedName&) const;
(...skipping 28 matching lines...) Expand all
72 return !ElementTraversal::previousSibling(element, HasTagName(type)); 73 return !ElementTraversal::previousSibling(element, HasTagName(type));
73 } 74 }
74 75
75 inline bool DOMSiblingTraversalStrategy::isLastOfType(Element& element, const Qu alifiedName& type) const 76 inline bool DOMSiblingTraversalStrategy::isLastOfType(Element& element, const Qu alifiedName& type) const
76 { 77 {
77 return !ElementTraversal::nextSibling(element, HasTagName(type)); 78 return !ElementTraversal::nextSibling(element, HasTagName(type));
78 } 79 }
79 80
80 inline int DOMSiblingTraversalStrategy::countElementsBefore(Element& element) co nst 81 inline int DOMSiblingTraversalStrategy::countElementsBefore(Element& element) co nst
81 { 82 {
83 if (NthIndexCache::getInstance())
84 return NthIndexCache::getInstance()->nthChildIndex(element) - 1;
85
82 int count = 0; 86 int count = 0;
83 for (const Element* sibling = ElementTraversal::previousSibling(element); si bling; sibling = ElementTraversal::previousSibling(*sibling)) 87 for (const Element* sibling = ElementTraversal::previousSibling(element); si bling; sibling = ElementTraversal::previousSibling(*sibling))
84 count++; 88 count++;
85 89
86 return count; 90 return count;
87 } 91 }
88 92
89 inline int DOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element& eleme nt, const QualifiedName& type) const 93 inline int DOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element& eleme nt, const QualifiedName& type) const
90 { 94 {
91 int count = 0; 95 int count = 0;
92 for (const Element* sibling = ElementTraversal::previousSibling(element, Has TagName(type)); sibling; sibling = ElementTraversal::previousSibling(*sibling, H asTagName(type))) 96 for (const Element* sibling = ElementTraversal::previousSibling(element, Has TagName(type)); sibling; sibling = ElementTraversal::previousSibling(*sibling, H asTagName(type)))
93 ++count; 97 ++count;
94 return count; 98 return count;
95 } 99 }
96 100
97 inline int DOMSiblingTraversalStrategy::countElementsAfter(Element& element) con st 101 inline int DOMSiblingTraversalStrategy::countElementsAfter(Element& element) con st
98 { 102 {
103 if (NthIndexCache::getInstance())
104 return NthIndexCache::getInstance()->nthLastChildIndex(element) - 1;
105
99 int count = 0; 106 int count = 0;
100 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin g; sibling = ElementTraversal::nextSibling(*sibling)) 107 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin g; sibling = ElementTraversal::nextSibling(*sibling))
101 ++count; 108 ++count;
102 return count; 109 return count;
103 } 110 }
104 111
105 inline int DOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element& elemen t, const QualifiedName& type) const 112 inline int DOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element& elemen t, const QualifiedName& type) const
106 { 113 {
107 int count = 0; 114 int count = 0;
108 for (const Element* sibling = ElementTraversal::nextSibling(element, HasTagN ame(type)); sibling; sibling = ElementTraversal::nextSibling(*sibling, HasTagNam e(type))) 115 for (const Element* sibling = ElementTraversal::nextSibling(element, HasTagN ame(type)); sibling; sibling = ElementTraversal::nextSibling(*sibling, HasTagNam e(type)))
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 if (m_siblings[i]->isElementNode() && toElement(m_siblings[i])->hasTagNa me(type)) 237 if (m_siblings[i]->isElementNode() && toElement(m_siblings[i])->hasTagNa me(type))
231 return ++count; 238 return ++count;
232 } 239 }
233 240
234 return count; 241 return count;
235 } 242 }
236 243
237 } 244 }
238 245
239 #endif 246 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698