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

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: Missing initializer and incorrect assert. 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
« no previous file with comments | « Source/core/core.gypi ('k') | Source/core/dom/ContainerNode.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) 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 11 matching lines...) Expand all
22 * 22 *
23 * You should have received a copy of the GNU Library General Public License 23 * You should have received a copy of the GNU Library General Public License
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/Document.h"
32 #include "core/dom/Element.h" 33 #include "core/dom/Element.h"
33 #include "core/dom/ElementTraversal.h" 34 #include "core/dom/ElementTraversal.h"
35 #include "core/dom/NthIndexCache.h"
34 #include "core/style/ComputedStyle.h" 36 #include "core/style/ComputedStyle.h"
35 37
36 namespace blink { 38 namespace blink {
37 39
38 class DOMSiblingTraversalStrategy { 40 class DOMSiblingTraversalStrategy {
39 public: 41 public:
40 bool isFirstChild(Element&) const; 42 bool isFirstChild(Element&) const;
41 bool isLastChild(Element&) const; 43 bool isLastChild(Element&) const;
42 bool isFirstOfType(Element&, const QualifiedName&) const; 44 bool isFirstOfType(Element&, const QualifiedName&) const;
43 bool isLastOfType(Element&, const QualifiedName&) const; 45 bool isLastOfType(Element&, const QualifiedName&) const;
(...skipping 28 matching lines...) Expand all
72 return !ElementTraversal::previousSibling(element, HasTagName(type)); 74 return !ElementTraversal::previousSibling(element, HasTagName(type));
73 } 75 }
74 76
75 inline bool DOMSiblingTraversalStrategy::isLastOfType(Element& element, const Qu alifiedName& type) const 77 inline bool DOMSiblingTraversalStrategy::isLastOfType(Element& element, const Qu alifiedName& type) const
76 { 78 {
77 return !ElementTraversal::nextSibling(element, HasTagName(type)); 79 return !ElementTraversal::nextSibling(element, HasTagName(type));
78 } 80 }
79 81
80 inline int DOMSiblingTraversalStrategy::countElementsBefore(Element& element) co nst 82 inline int DOMSiblingTraversalStrategy::countElementsBefore(Element& element) co nst
81 { 83 {
84 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache())
85 return nthIndexCache->nthChildIndex(element) - 1;
86
82 int count = 0; 87 int count = 0;
83 for (const Element* sibling = ElementTraversal::previousSibling(element); si bling; sibling = ElementTraversal::previousSibling(*sibling)) 88 for (const Element* sibling = ElementTraversal::previousSibling(element); si bling; sibling = ElementTraversal::previousSibling(*sibling))
84 count++; 89 count++;
85 90
86 return count; 91 return count;
87 } 92 }
88 93
89 inline int DOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element& eleme nt, const QualifiedName& type) const 94 inline int DOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element& eleme nt, const QualifiedName& type) const
90 { 95 {
91 int count = 0; 96 int count = 0;
92 for (const Element* sibling = ElementTraversal::previousSibling(element, Has TagName(type)); sibling; sibling = ElementTraversal::previousSibling(*sibling, H asTagName(type))) 97 for (const Element* sibling = ElementTraversal::previousSibling(element, Has TagName(type)); sibling; sibling = ElementTraversal::previousSibling(*sibling, H asTagName(type)))
93 ++count; 98 ++count;
94 return count; 99 return count;
95 } 100 }
96 101
97 inline int DOMSiblingTraversalStrategy::countElementsAfter(Element& element) con st 102 inline int DOMSiblingTraversalStrategy::countElementsAfter(Element& element) con st
98 { 103 {
104 if (NthIndexCache* nthIndexCache = element.document().nthIndexCache())
105 return nthIndexCache->nthLastChildIndex(element) - 1;
106
99 int count = 0; 107 int count = 0;
100 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin g; sibling = ElementTraversal::nextSibling(*sibling)) 108 for (const Element* sibling = ElementTraversal::nextSibling(element); siblin g; sibling = ElementTraversal::nextSibling(*sibling))
101 ++count; 109 ++count;
102 return count; 110 return count;
103 } 111 }
104 112
105 inline int DOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element& elemen t, const QualifiedName& type) const 113 inline int DOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element& elemen t, const QualifiedName& type) const
106 { 114 {
107 int count = 0; 115 int count = 0;
108 for (const Element* sibling = ElementTraversal::nextSibling(element, HasTagN ame(type)); sibling; sibling = ElementTraversal::nextSibling(*sibling, HasTagNam e(type))) 116 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)) 238 if (m_siblings[i]->isElementNode() && toElement(m_siblings[i])->hasTagNa me(type))
231 return ++count; 239 return ++count;
232 } 240 }
233 241
234 return count; 242 return count;
235 } 243 }
236 244
237 } 245 }
238 246
239 #endif 247 #endif
OLDNEW
« no previous file with comments | « Source/core/core.gypi ('k') | Source/core/dom/ContainerNode.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698