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

Side by Side Diff: Source/core/dom/LiveNodeListBase.h

Issue 468183002: Move matching Element traversal functions from LiveNodeListBase to ElementTraversal (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Use anonymous namespace Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/LiveNodeList.cpp ('k') | Source/core/html/HTMLCollection.h » ('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) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. 5 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
6 * Copyright (C) 2014 Samsung Electronics. All rights reserved. 6 * Copyright (C) 2014 Samsung Electronics. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 virtual void invalidateCache(Document* oldDocument = 0) const = 0; 72 virtual void invalidateCache(Document* oldDocument = 0) const = 0;
73 void invalidateCacheForAttribute(const QualifiedName*) const; 73 void invalidateCacheForAttribute(const QualifiedName*) const;
74 74
75 static bool shouldInvalidateTypeOnAttributeChange(NodeListInvalidationType, const QualifiedName&); 75 static bool shouldInvalidateTypeOnAttributeChange(NodeListInvalidationType, const QualifiedName&);
76 76
77 protected: 77 protected:
78 Document& document() const { return m_ownerNode->document(); } 78 Document& document() const { return m_ownerNode->document(); }
79 79
80 ALWAYS_INLINE NodeListRootType rootType() const { return static_cast<NodeLis tRootType>(m_rootType); } 80 ALWAYS_INLINE NodeListRootType rootType() const { return static_cast<NodeLis tRootType>(m_rootType); }
81 81
82 template <class NodeListType> 82 template <typename MatchFunc>
83 static Element* firstMatchingElement(const NodeListType&); 83 static Element* traverseMatchingElementsForwardToOffset(Element& currentElem ent, const ContainerNode* stayWithin, unsigned offset, unsigned& currentOffset, MatchFunc);
84 template <class NodeListType> 84 template <typename MatchFunc>
85 static Element* lastMatchingElement(const NodeListType&); 85 static Element* traverseMatchingElementsBackwardToOffset(Element& currentEle ment, const ContainerNode* stayWithin, unsigned offset, unsigned& currentOffset, MatchFunc);
86 template <class NodeListType>
87 static Element* nextMatchingElement(const NodeListType&, Element& current);
88 template <class NodeListType>
89 static Element* previousMatchingElement(const NodeListType&, Element& curren t);
90 template <class NodeListType>
91 static Element* traverseMatchingElementsForwardToOffset(const NodeListType&, unsigned offset, Element& currentElement, unsigned& currentOffset);
92 template <class NodeListType>
93 static Element* traverseMatchingElementsBackwardToOffset(const NodeListType& , unsigned offset, Element& currentElement, unsigned& currentOffset);
94 86
95 virtual void trace(Visitor* visitor) { visitor->trace(m_ownerNode); } 87 virtual void trace(Visitor* visitor) { visitor->trace(m_ownerNode); }
96 88
97 private: 89 private:
98 RefPtrWillBeMember<ContainerNode> m_ownerNode; // Cannot be null. 90 RefPtrWillBeMember<ContainerNode> m_ownerNode; // Cannot be null.
99 const unsigned m_rootType : 1; 91 const unsigned m_rootType : 1;
100 const unsigned m_invalidationType : 4; 92 const unsigned m_invalidationType : 4;
101 const unsigned m_collectionType : 5; 93 const unsigned m_collectionType : 5;
102 }; 94 };
103 95
(...skipping 14 matching lines...) Expand all
118 case InvalidateOnHRefAttrChange: 110 case InvalidateOnHRefAttrChange:
119 return attrName == HTMLNames::hrefAttr; 111 return attrName == HTMLNames::hrefAttr;
120 case DoNotInvalidateOnAttributeChanges: 112 case DoNotInvalidateOnAttributeChanges:
121 return false; 113 return false;
122 case InvalidateOnAnyAttrChange: 114 case InvalidateOnAnyAttrChange:
123 return true; 115 return true;
124 } 116 }
125 return false; 117 return false;
126 } 118 }
127 119
128 template <typename NodeListType> 120 template <typename MatchFunc>
129 Element* LiveNodeListBase::lastMatchingElement(const NodeListType& nodeList) 121 Element* LiveNodeListBase::traverseMatchingElementsForwardToOffset(Element& curr entElement, const ContainerNode* stayWithin, unsigned offset, unsigned& currentO ffset, MatchFunc isMatch)
130 {
131 ContainerNode& root = nodeList.rootNode();
132 Element* element = ElementTraversal::lastWithin(root);
133 while (element && !isMatchingElement(nodeList, *element))
134 element = ElementTraversal::previous(*element, &root);
135 return element;
136 }
137
138 template <class NodeListType>
139 Element* LiveNodeListBase::firstMatchingElement(const NodeListType& nodeList)
140 {
141 ContainerNode& root = nodeList.rootNode();
142 Element* element = ElementTraversal::firstWithin(root);
143 while (element && !isMatchingElement(nodeList, *element))
144 element = ElementTraversal::next(*element, &root);
145 return element;
146 }
147
148 template <class NodeListType>
149 Element* LiveNodeListBase::nextMatchingElement(const NodeListType& nodeList, Ele ment& current)
150 {
151 ContainerNode& root = nodeList.rootNode();
152 Element* next = &current;
153 do {
154 next = ElementTraversal::next(*next, &root);
155 } while (next && !isMatchingElement(nodeList, *next));
156 return next;
157 }
158
159 template <class NodeListType>
160 Element* LiveNodeListBase::previousMatchingElement(const NodeListType& nodeList, Element& current)
161 {
162 ContainerNode& root = nodeList.rootNode();
163 Element* previous = &current;
164 do {
165 previous = ElementTraversal::previous(*previous, &root);
166 } while (previous && !isMatchingElement(nodeList, *previous));
167 return previous;
168 }
169
170 template <class NodeListType>
171 Element* LiveNodeListBase::traverseMatchingElementsForwardToOffset(const NodeLis tType& nodeList, unsigned offset, Element& currentElement, unsigned& currentOffs et)
172 { 122 {
173 ASSERT(currentOffset < offset); 123 ASSERT(currentOffset < offset);
174 for (Element* next = nextMatchingElement(nodeList, currentElement); next; ne xt = nextMatchingElement(nodeList, *next)) { 124 for (Element* next = ElementTraversal::next(currentElement, stayWithin, isMa tch); next; next = ElementTraversal::next(*next, stayWithin, isMatch)) {
175 if (++currentOffset == offset) 125 if (++currentOffset == offset)
176 return next; 126 return next;
177 } 127 }
178 return 0; 128 return 0;
179 } 129 }
180 130
181 template <class NodeListType> 131 template <typename MatchFunc>
182 Element* LiveNodeListBase::traverseMatchingElementsBackwardToOffset(const NodeLi stType& nodeList, unsigned offset, Element& currentElement, unsigned& currentOff set) 132 Element* LiveNodeListBase::traverseMatchingElementsBackwardToOffset(Element& cur rentElement, const ContainerNode* stayWithin, unsigned offset, unsigned& current Offset, MatchFunc isMatch)
183 { 133 {
184 ASSERT(currentOffset > offset); 134 ASSERT(currentOffset > offset);
185 for (Element* previous = previousMatchingElement(nodeList, currentElement); previous; previous = previousMatchingElement(nodeList, *previous)) { 135 for (Element* previous = ElementTraversal::previous(currentElement, stayWith in, isMatch); previous; previous = ElementTraversal::previous(*previous, stayWit hin, isMatch)) {
186 if (--currentOffset == offset) 136 if (--currentOffset == offset)
187 return previous; 137 return previous;
188 } 138 }
189 return 0; 139 return 0;
190 } 140 }
191 141
192 } // namespace blink 142 } // namespace blink
193 143
194 #endif // LiveNodeListBase_h 144 #endif // LiveNodeListBase_h
OLDNEW
« no previous file with comments | « Source/core/dom/LiveNodeList.cpp ('k') | Source/core/html/HTMLCollection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698