Chromium Code Reviews| OLD | NEW |
|---|---|
| 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, 2009, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 ASSERT(!nodes.size()); | 277 ASSERT(!nodes.size()); |
| 278 for (Node* child = node->firstChild(); child; child = child->nextSibling()) | 278 for (Node* child = node->firstChild(); child; child = child->nextSibling()) |
| 279 nodes.append(child); | 279 nodes.append(child); |
| 280 } | 280 } |
| 281 | 281 |
| 282 class ChildNodesLazySnapshot { | 282 class ChildNodesLazySnapshot { |
| 283 WTF_MAKE_NONCOPYABLE(ChildNodesLazySnapshot); | 283 WTF_MAKE_NONCOPYABLE(ChildNodesLazySnapshot); |
| 284 WTF_MAKE_FAST_ALLOCATED; | 284 WTF_MAKE_FAST_ALLOCATED; |
| 285 public: | 285 public: |
| 286 explicit ChildNodesLazySnapshot(Node* parentNode) | 286 explicit ChildNodesLazySnapshot(Node* parentNode) |
| 287 : m_currentNode(parentNode->firstChild()) | 287 : m_currentNode(parentNode->lastChild()) |
| 288 , m_currentIndex(0) | 288 , m_currentIndex(0) |
| 289 { | 289 { |
| 290 m_nextSnapshot = latestSnapshot; | 290 m_nextSnapshot = latestSnapshot; |
| 291 latestSnapshot = this; | 291 latestSnapshot = this; |
| 292 } | 292 } |
| 293 | 293 |
| 294 ~ChildNodesLazySnapshot() | 294 ~ChildNodesLazySnapshot() |
| 295 { | 295 { |
| 296 latestSnapshot = m_nextSnapshot; | 296 latestSnapshot = m_nextSnapshot; |
| 297 } | 297 } |
| 298 | 298 |
| 299 // Returns 0 if there is no next Node. | 299 // Returns 0 if there is no next Node. |
|
esprehn
2013/06/05 00:12:26
is no previous node?
| |
| 300 PassRefPtr<Node> nextNode() | 300 PassRefPtr<Node> previousNode() |
| 301 { | 301 { |
| 302 if (LIKELY(!hasSnapshot())) { | 302 if (LIKELY(!hasSnapshot())) { |
| 303 RefPtr<Node> node = m_currentNode; | 303 RefPtr<Node> node = m_currentNode; |
| 304 if (node) | 304 if (node) |
| 305 m_currentNode = node->nextSibling(); | 305 m_currentNode = node->previousSibling(); |
| 306 return node.release(); | 306 return node.release(); |
| 307 } | 307 } |
| 308 Vector<RefPtr<Node> >& nodeVector = *m_childNodes; | 308 Vector<RefPtr<Node> >& nodeVector = *m_childNodes; |
| 309 if (m_currentIndex >= nodeVector.size()) | 309 if (m_currentIndex >= nodeVector.size()) |
| 310 return 0; | 310 return 0; |
| 311 return nodeVector[m_currentIndex++]; | 311 return nodeVector[m_currentIndex++]; |
| 312 } | 312 } |
| 313 | 313 |
| 314 void takeSnapshot() | 314 void takeSnapshot() |
| 315 { | 315 { |
| 316 if (hasSnapshot()) | 316 if (hasSnapshot()) |
| 317 return; | 317 return; |
| 318 m_childNodes = adoptPtr(new Vector<RefPtr<Node> >()); | 318 m_childNodes = adoptPtr(new Vector<RefPtr<Node> >()); |
| 319 Node* node = m_currentNode.get(); | 319 Node* node = m_currentNode.get(); |
| 320 while (node) { | 320 while (node) { |
| 321 m_childNodes->append(node); | 321 m_childNodes->append(node); |
| 322 node = node->nextSibling(); | 322 node = node->previousSibling(); |
| 323 } | 323 } |
| 324 } | 324 } |
| 325 | 325 |
| 326 ChildNodesLazySnapshot* nextSnapshot() { return m_nextSnapshot; } | 326 ChildNodesLazySnapshot* nextSnapshot() { return m_nextSnapshot; } |
| 327 bool hasSnapshot() { return !!m_childNodes.get(); } | 327 bool hasSnapshot() { return !!m_childNodes.get(); } |
| 328 | 328 |
| 329 static void takeChildNodesLazySnapshot() | 329 static void takeChildNodesLazySnapshot() |
| 330 { | 330 { |
| 331 ChildNodesLazySnapshot* snapshot = latestSnapshot; | 331 ChildNodesLazySnapshot* snapshot = latestSnapshot; |
| 332 while (snapshot && !snapshot->hasSnapshot()) { | 332 while (snapshot && !snapshot->hasSnapshot()) { |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 358 m_node->resumePostAttachCallbacks(); | 358 m_node->resumePostAttachCallbacks(); |
| 359 } | 359 } |
| 360 | 360 |
| 361 private: | 361 private: |
| 362 ContainerNode* m_node; | 362 ContainerNode* m_node; |
| 363 }; | 363 }; |
| 364 | 364 |
| 365 } // namespace WebCore | 365 } // namespace WebCore |
| 366 | 366 |
| 367 #endif // ContainerNode_h | 367 #endif // ContainerNode_h |
| OLD | NEW |