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

Side by Side Diff: Source/core/dom/ElementTraversal.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 | « no previous file | Source/core/dom/LiveNodeList.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) 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, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Appl e Inc. All rights reserved. 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Appl e Inc. All rights reserved.
6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
7 * Copyright (C) 2014 Samsung Electronics. All rights reserved. 7 * Copyright (C) 2014 Samsung Electronics. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 19 matching lines...) Expand all
30 #include "core/dom/NodeTraversal.h" 30 #include "core/dom/NodeTraversal.h"
31 31
32 namespace blink { 32 namespace blink {
33 33
34 template <class ElementType> 34 template <class ElementType>
35 class Traversal { 35 class Traversal {
36 public: 36 public:
37 // First or last ElementType child of the node. 37 // First or last ElementType child of the node.
38 static ElementType* firstChild(const ContainerNode& current) { return firstC hildTemplate(current); } 38 static ElementType* firstChild(const ContainerNode& current) { return firstC hildTemplate(current); }
39 static ElementType* firstChild(const Node& current) { return firstChildTempl ate(current); } 39 static ElementType* firstChild(const Node& current) { return firstChildTempl ate(current); }
40 template <class MatchFunc>
41 static ElementType* firstChild(const ContainerNode&, MatchFunc);
40 static ElementType* lastChild(const ContainerNode& current) { return lastChi ldTemplate(current); } 42 static ElementType* lastChild(const ContainerNode& current) { return lastChi ldTemplate(current); }
41 static ElementType* lastChild(const Node& current) { return lastChildTemplat e(current); } 43 static ElementType* lastChild(const Node& current) { return lastChildTemplat e(current); }
44 template <class MatchFunc>
45 static ElementType* lastChild(const ContainerNode&, MatchFunc);
42 46
43 // First ElementType ancestor of the node. 47 // First ElementType ancestor of the node.
44 static ElementType* firstAncestor(const Node& current); 48 static ElementType* firstAncestor(const Node& current);
45 static ElementType* firstAncestorOrSelf(Node& current) { return firstAncesto rOrSelfTemplate(current); } 49 static ElementType* firstAncestorOrSelf(Node& current) { return firstAncesto rOrSelfTemplate(current); }
46 static ElementType* firstAncestorOrSelf(Element& current) { return firstAnce storOrSelfTemplate(current); } 50 static ElementType* firstAncestorOrSelf(Element& current) { return firstAnce storOrSelfTemplate(current); }
47 static const ElementType* firstAncestorOrSelf(const Node& current) { return firstAncestorOrSelfTemplate(const_cast<Node&>(current)); } 51 static const ElementType* firstAncestorOrSelf(const Node& current) { return firstAncestorOrSelfTemplate(const_cast<Node&>(current)); }
48 static const ElementType* firstAncestorOrSelf(const Element& current) { retu rn firstAncestorOrSelfTemplate(const_cast<Element&>(current)); } 52 static const ElementType* firstAncestorOrSelf(const Element& current) { retu rn firstAncestorOrSelfTemplate(const_cast<Element&>(current)); }
49 53
50 // First or last ElementType descendant of the node. 54 // First or last ElementType descendant of the node.
51 // For Elements firstWithin() is always the same as firstChild(). 55 // For Elements firstWithin() is always the same as firstChild().
52 static ElementType* firstWithin(const ContainerNode& current) { return first WithinTemplate(current); } 56 static ElementType* firstWithin(const ContainerNode& current) { return first WithinTemplate(current); }
53 static ElementType* firstWithin(const Node& current) { return firstWithinTem plate(current); } 57 static ElementType* firstWithin(const Node& current) { return firstWithinTem plate(current); }
58 template <typename MatchFunc>
59 static ElementType* firstWithin(const ContainerNode&, MatchFunc);
54 static ElementType* lastWithin(const ContainerNode& current) { return lastWi thinTemplate(current); } 60 static ElementType* lastWithin(const ContainerNode& current) { return lastWi thinTemplate(current); }
55 static ElementType* lastWithin(const Node& current) { return lastWithinTempl ate(current); } 61 static ElementType* lastWithin(const Node& current) { return lastWithinTempl ate(current); }
62 template <class MatchFunc>
63 static ElementType* lastWithin(const ContainerNode&, MatchFunc);
56 64
57 // Pre-order traversal skipping non-element nodes. 65 // Pre-order traversal skipping non-element nodes.
58 static ElementType* next(const ContainerNode& current) { return nextTemplate (current); } 66 static ElementType* next(const ContainerNode& current) { return nextTemplate (current); }
59 static ElementType* next(const Node& current) { return nextTemplate(current) ; } 67 static ElementType* next(const Node& current) { return nextTemplate(current) ; }
60 static ElementType* next(const ContainerNode& current, const Node* stayWithi n) { return nextTemplate(current, stayWithin); } 68 static ElementType* next(const ContainerNode& current, const Node* stayWithi n) { return nextTemplate(current, stayWithin); }
61 static ElementType* next(const Node& current, const Node* stayWithin) { retu rn nextTemplate(current, stayWithin); } 69 static ElementType* next(const Node& current, const Node* stayWithin) { retu rn nextTemplate(current, stayWithin); }
70 template <class MatchFunc>
71 static ElementType* next(const ContainerNode& current, const Node* stayWithi n, MatchFunc);
62 static ElementType* previous(const Node&); 72 static ElementType* previous(const Node&);
63 static ElementType* previous(const Node&, const Node* stayWithin); 73 static ElementType* previous(const Node&, const Node* stayWithin);
74 template <class MatchFunc>
75 static ElementType* previous(const ContainerNode& current, const Node* stayW ithin, MatchFunc);
64 76
65 // Like next, but skips children. 77 // Like next, but skips children.
66 static ElementType* nextSkippingChildren(const Node&); 78 static ElementType* nextSkippingChildren(const Node&);
67 static ElementType* nextSkippingChildren(const Node&, const Node* stayWithin ); 79 static ElementType* nextSkippingChildren(const Node&, const Node* stayWithin );
68 80
69 // Pre-order traversal including the pseudo-elements. 81 // Pre-order traversal including the pseudo-elements.
70 static ElementType* previousIncludingPseudo(const Node&, const Node* stayWit hin = 0); 82 static ElementType* previousIncludingPseudo(const Node&, const Node* stayWit hin = 0);
71 static ElementType* nextIncludingPseudo(const Node&, const Node* stayWithin = 0); 83 static ElementType* nextIncludingPseudo(const Node&, const Node* stayWithin = 0);
72 static ElementType* nextIncludingPseudoSkippingChildren(const Node&, const N ode* stayWithin = 0); 84 static ElementType* nextIncludingPseudoSkippingChildren(const Node&, const N ode* stayWithin = 0);
73 85
74 // Utility function to traverse only the element and pseudo-element siblings of a node. 86 // Utility function to traverse only the element and pseudo-element siblings of a node.
75 static ElementType* pseudoAwarePreviousSibling(const Node&); 87 static ElementType* pseudoAwarePreviousSibling(const Node&);
76 88
77 // Previous / Next sibling. 89 // Previous / Next sibling.
78 static ElementType* previousSibling(const Node&); 90 static ElementType* previousSibling(const Node&);
91 template <class MatchFunc>
92 static ElementType* previousSibling(const Node&, MatchFunc);
79 static ElementType* nextSibling(const Node&); 93 static ElementType* nextSibling(const Node&);
94 template <class MatchFunc>
95 static ElementType* nextSibling(const Node&, MatchFunc);
80 96
81 private: 97 private:
82 template <class NodeType> 98 template <class NodeType>
83 static ElementType* firstChildTemplate(NodeType&); 99 static ElementType* firstChildTemplate(NodeType&);
84 template <class NodeType> 100 template <class NodeType>
85 static ElementType* lastChildTemplate(NodeType&); 101 static ElementType* lastChildTemplate(NodeType&);
86 template <class NodeType> 102 template <class NodeType>
87 static ElementType* firstAncestorOrSelfTemplate(NodeType&); 103 static ElementType* firstAncestorOrSelfTemplate(NodeType&);
88 template <class NodeType> 104 template <class NodeType>
89 static ElementType* firstWithinTemplate(NodeType&); 105 static ElementType* firstWithinTemplate(NodeType&);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 template <class NodeType> 146 template <class NodeType>
131 inline ElementType* Traversal<ElementType>::firstChildTemplate(NodeType& current ) 147 inline ElementType* Traversal<ElementType>::firstChildTemplate(NodeType& current )
132 { 148 {
133 Node* node = current.firstChild(); 149 Node* node = current.firstChild();
134 while (node && !isElementOfType<const ElementType>(*node)) 150 while (node && !isElementOfType<const ElementType>(*node))
135 node = node->nextSibling(); 151 node = node->nextSibling();
136 return toElement<ElementType>(node); 152 return toElement<ElementType>(node);
137 } 153 }
138 154
139 template <class ElementType> 155 template <class ElementType>
156 template <class MatchFunc>
157 inline ElementType* Traversal<ElementType>::firstChild(const ContainerNode& curr ent, MatchFunc isMatch)
158 {
159 ElementType* element = Traversal<ElementType>::firstChild(current);
160 while (element && !isMatch(*element))
161 element = Traversal<ElementType>::nextSibling(*element);
162 return element;
163 }
164
165 template <class ElementType>
140 inline ElementType* Traversal<ElementType>::firstAncestor(const Node& current) 166 inline ElementType* Traversal<ElementType>::firstAncestor(const Node& current)
141 { 167 {
142 ContainerNode* ancestor = current.parentNode(); 168 ContainerNode* ancestor = current.parentNode();
143 while (ancestor && !isElementOfType<const ElementType>(*ancestor)) 169 while (ancestor && !isElementOfType<const ElementType>(*ancestor))
144 ancestor = ancestor->parentNode(); 170 ancestor = ancestor->parentNode();
145 return toElement<ElementType>(ancestor); 171 return toElement<ElementType>(ancestor);
146 } 172 }
147 173
148 template <class ElementType> 174 template <class ElementType>
149 template <class NodeType> 175 template <class NodeType>
150 inline ElementType* Traversal<ElementType>::firstAncestorOrSelfTemplate(NodeType & current) 176 inline ElementType* Traversal<ElementType>::firstAncestorOrSelfTemplate(NodeType & current)
151 { 177 {
152 if (isElementOfType<const ElementType>(current)) 178 if (isElementOfType<const ElementType>(current))
153 return &toElement<ElementType>(current); 179 return &toElement<ElementType>(current);
154 return firstAncestor(current); 180 return firstAncestor(current);
155 } 181 }
156 182
157 template <class ElementType> 183 template <class ElementType>
158 template <class NodeType> 184 template <class NodeType>
159 inline ElementType* Traversal<ElementType>::lastChildTemplate(NodeType& current) 185 inline ElementType* Traversal<ElementType>::lastChildTemplate(NodeType& current)
160 { 186 {
161 Node* node = current.lastChild(); 187 Node* node = current.lastChild();
162 while (node && !isElementOfType<const ElementType>(*node)) 188 while (node && !isElementOfType<const ElementType>(*node))
163 node = node->previousSibling(); 189 node = node->previousSibling();
164 return toElement<ElementType>(node); 190 return toElement<ElementType>(node);
165 } 191 }
166 192
167 template <class ElementType> 193 template <class ElementType>
194 template <class MatchFunc>
195 inline ElementType* Traversal<ElementType>::lastChild(const ContainerNode& curre nt, MatchFunc isMatch)
196 {
197 ElementType* element = Traversal<ElementType>::lastChild(current);
198 while (element && !isMatch(*element))
199 element = Traversal<ElementType>::previousSibling(*element);
200 return element;
201 }
202
203 template <class ElementType>
168 template <class NodeType> 204 template <class NodeType>
169 inline ElementType* Traversal<ElementType>::firstWithinTemplate(NodeType& curren t) 205 inline ElementType* Traversal<ElementType>::firstWithinTemplate(NodeType& curren t)
170 { 206 {
171 Node* node = current.firstChild(); 207 Node* node = current.firstChild();
172 while (node && !isElementOfType<const ElementType>(*node)) 208 while (node && !isElementOfType<const ElementType>(*node))
173 node = NodeTraversal::next(*node, &current); 209 node = NodeTraversal::next(*node, &current);
174 return toElement<ElementType>(node); 210 return toElement<ElementType>(node);
175 } 211 }
176 212
177 template <class ElementType> 213 template <class ElementType>
214 template <typename MatchFunc>
215 inline ElementType* Traversal<ElementType>::firstWithin(const ContainerNode& cur rent, MatchFunc isMatch)
216 {
217 ElementType* element = Traversal<ElementType>::firstWithin(current);
218 while (element && !isMatch(*element))
219 element = Traversal<ElementType>::next(*element, &current, isMatch);
220 return element;
221 }
222
223 template <class ElementType>
178 template <class NodeType> 224 template <class NodeType>
179 inline ElementType* Traversal<ElementType>::lastWithinTemplate(NodeType& current ) 225 inline ElementType* Traversal<ElementType>::lastWithinTemplate(NodeType& current )
180 { 226 {
181 Node* node = NodeTraversal::lastWithin(current); 227 Node* node = NodeTraversal::lastWithin(current);
182 while (node && !isElementOfType<const ElementType>(*node)) 228 while (node && !isElementOfType<const ElementType>(*node))
183 node = NodeTraversal::previous(*node, &current); 229 node = NodeTraversal::previous(*node, &current);
184 return toElement<ElementType>(node); 230 return toElement<ElementType>(node);
185 } 231 }
186 232
187 template <class ElementType> 233 template <class ElementType>
234 template <class MatchFunc>
235 inline ElementType* Traversal<ElementType>::lastWithin(const ContainerNode& curr ent, MatchFunc isMatch)
236 {
237 ElementType* element = Traversal<ElementType>::lastWithin(current);
238 while (element && !isMatch(*element))
239 element = Traversal<ElementType>::previous(*element, &current, isMatch);
240 return element;
241 }
242
243 template <class ElementType>
188 template <class NodeType> 244 template <class NodeType>
189 inline ElementType* Traversal<ElementType>::nextTemplate(NodeType& current) 245 inline ElementType* Traversal<ElementType>::nextTemplate(NodeType& current)
190 { 246 {
191 Node* node = NodeTraversal::next(current); 247 Node* node = NodeTraversal::next(current);
192 while (node && !isElementOfType<const ElementType>(*node)) 248 while (node && !isElementOfType<const ElementType>(*node))
193 node = NodeTraversal::next(*node); 249 node = NodeTraversal::next(*node);
194 return toElement<ElementType>(node); 250 return toElement<ElementType>(node);
195 } 251 }
196 252
197 template <class ElementType> 253 template <class ElementType>
198 template <class NodeType> 254 template <class NodeType>
199 inline ElementType* Traversal<ElementType>::nextTemplate(NodeType& current, cons t Node* stayWithin) 255 inline ElementType* Traversal<ElementType>::nextTemplate(NodeType& current, cons t Node* stayWithin)
200 { 256 {
201 Node* node = NodeTraversal::next(current, stayWithin); 257 Node* node = NodeTraversal::next(current, stayWithin);
202 while (node && !isElementOfType<const ElementType>(*node)) 258 while (node && !isElementOfType<const ElementType>(*node))
203 node = NodeTraversal::next(*node, stayWithin); 259 node = NodeTraversal::next(*node, stayWithin);
204 return toElement<ElementType>(node); 260 return toElement<ElementType>(node);
205 } 261 }
206 262
207 template <class ElementType> 263 template <class ElementType>
264 template <class MatchFunc>
265 inline ElementType* Traversal<ElementType>::next(const ContainerNode& current, c onst Node* stayWithin, MatchFunc isMatch)
266 {
267 ElementType* element = Traversal<ElementType>::next(current, stayWithin);
268 while (element && !isMatch(*element))
269 element = Traversal<ElementType>::next(*element, stayWithin);
270 return element;
271 }
272
273 template <class ElementType>
208 inline ElementType* Traversal<ElementType>::previous(const Node& current) 274 inline ElementType* Traversal<ElementType>::previous(const Node& current)
209 { 275 {
210 Node* node = NodeTraversal::previous(current); 276 Node* node = NodeTraversal::previous(current);
211 while (node && !isElementOfType<const ElementType>(*node)) 277 while (node && !isElementOfType<const ElementType>(*node))
212 node = NodeTraversal::previous(*node); 278 node = NodeTraversal::previous(*node);
213 return toElement<ElementType>(node); 279 return toElement<ElementType>(node);
214 } 280 }
215 281
216 template <class ElementType> 282 template <class ElementType>
217 inline ElementType* Traversal<ElementType>::previous(const Node& current, const Node* stayWithin) 283 inline ElementType* Traversal<ElementType>::previous(const Node& current, const Node* stayWithin)
218 { 284 {
219 Node* node = NodeTraversal::previous(current, stayWithin); 285 Node* node = NodeTraversal::previous(current, stayWithin);
220 while (node && !isElementOfType<const ElementType>(*node)) 286 while (node && !isElementOfType<const ElementType>(*node))
221 node = NodeTraversal::previous(*node, stayWithin); 287 node = NodeTraversal::previous(*node, stayWithin);
222 return toElement<ElementType>(node); 288 return toElement<ElementType>(node);
223 } 289 }
224 290
225 template <class ElementType> 291 template <class ElementType>
292 template <class MatchFunc>
293 inline ElementType* Traversal<ElementType>::previous(const ContainerNode& curren t, const Node* stayWithin, MatchFunc isMatch)
294 {
295 ElementType* element = Traversal<ElementType>::previous(current, stayWithin) ;
296 while (element && !isMatch(*element))
297 element = Traversal<ElementType>::previous(*element, stayWithin);
298 return element;
299 }
300
301 template <class ElementType>
226 inline ElementType* Traversal<ElementType>::nextSkippingChildren(const Node& cur rent) 302 inline ElementType* Traversal<ElementType>::nextSkippingChildren(const Node& cur rent)
227 { 303 {
228 Node* node = NodeTraversal::nextSkippingChildren(current); 304 Node* node = NodeTraversal::nextSkippingChildren(current);
229 while (node && !isElementOfType<const ElementType>(*node)) 305 while (node && !isElementOfType<const ElementType>(*node))
230 node = NodeTraversal::nextSkippingChildren(*node); 306 node = NodeTraversal::nextSkippingChildren(*node);
231 return toElement<ElementType>(node); 307 return toElement<ElementType>(node);
232 } 308 }
233 309
234 template <class ElementType> 310 template <class ElementType>
235 inline ElementType* Traversal<ElementType>::nextSkippingChildren(const Node& cur rent, const Node* stayWithin) 311 inline ElementType* Traversal<ElementType>::nextSkippingChildren(const Node& cur rent, const Node* stayWithin)
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 template <class ElementType> 355 template <class ElementType>
280 inline ElementType* Traversal<ElementType>::previousSibling(const Node& current) 356 inline ElementType* Traversal<ElementType>::previousSibling(const Node& current)
281 { 357 {
282 Node* node = current.previousSibling(); 358 Node* node = current.previousSibling();
283 while (node && !isElementOfType<const ElementType>(*node)) 359 while (node && !isElementOfType<const ElementType>(*node))
284 node = node->previousSibling(); 360 node = node->previousSibling();
285 return toElement<ElementType>(node); 361 return toElement<ElementType>(node);
286 } 362 }
287 363
288 template <class ElementType> 364 template <class ElementType>
365 template <class MatchFunc>
366 inline ElementType* Traversal<ElementType>::previousSibling(const Node& current, MatchFunc isMatch)
367 {
368 ElementType* element = Traversal<ElementType>::previousSibling(current);
369 while (element && !isMatch(*element))
370 element = Traversal<ElementType>::previousSibling(*element);
371 return element;
372 }
373
374 template <class ElementType>
289 inline ElementType* Traversal<ElementType>::nextSibling(const Node& current) 375 inline ElementType* Traversal<ElementType>::nextSibling(const Node& current)
290 { 376 {
291 Node* node = current.nextSibling(); 377 Node* node = current.nextSibling();
292 while (node && !isElementOfType<const ElementType>(*node)) 378 while (node && !isElementOfType<const ElementType>(*node))
293 node = node->nextSibling(); 379 node = node->nextSibling();
294 return toElement<ElementType>(node); 380 return toElement<ElementType>(node);
295 } 381 }
296 382
383 template <class ElementType>
384 template <class MatchFunc>
385 inline ElementType* Traversal<ElementType>::nextSibling(const Node& current, Mat chFunc isMatch)
386 {
387 ElementType* element = Traversal<ElementType>::nextSibling(current);
388 while (element && !isMatch(*element))
389 element = Traversal<ElementType>::nextSibling(*element);
390 return element;
391 }
392
297 } // namespace blink 393 } // namespace blink
298 394
299 #endif 395 #endif
OLDNEW
« no previous file with comments | « no previous file | Source/core/dom/LiveNodeList.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698