OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2000 Frederik Holljen (frederik.holljen@hig.no) | 3 * Copyright (C) 2000 Frederik Holljen (frederik.holljen@hig.no) |
4 * Copyright (C) 2001 Peter Kelly (pmk@post.com) | 4 * Copyright (C) 2001 Peter Kelly (pmk@post.com) |
5 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 5 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
6 * Copyright (C) 2004, 2008 Apple Inc. All rights reserved. | 6 * Copyright (C) 2004, 2008 Apple Inc. 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 } | 60 } |
61 node = NodeTraversal::previous(*node, root); | 61 node = NodeTraversal::previous(*node, root); |
62 return node; | 62 return node; |
63 } | 63 } |
64 | 64 |
65 NodeIterator::NodeIterator(Node* rootNode, | 65 NodeIterator::NodeIterator(Node* rootNode, |
66 unsigned whatToShow, | 66 unsigned whatToShow, |
67 NodeFilter* filter) | 67 NodeFilter* filter) |
68 : NodeIteratorBase(rootNode, whatToShow, filter), | 68 : NodeIteratorBase(rootNode, whatToShow, filter), |
69 m_referenceNode(root(), true) { | 69 m_referenceNode(root(), true) { |
70 // If NodeIterator target is Attr node, don't subscribe for nodeWillBeRemoved,
as it would never have child nodes. | 70 // If NodeIterator target is Attr node, don't subscribe for nodeWillBeRemoved, |
| 71 // as it would never have child nodes. |
71 if (!root()->isAttributeNode()) | 72 if (!root()->isAttributeNode()) |
72 root()->document().attachNodeIterator(this); | 73 root()->document().attachNodeIterator(this); |
73 } | 74 } |
74 | 75 |
75 Node* NodeIterator::nextNode(ExceptionState& exceptionState) { | 76 Node* NodeIterator::nextNode(ExceptionState& exceptionState) { |
76 Node* result = nullptr; | 77 Node* result = nullptr; |
77 | 78 |
78 m_candidateNode = m_referenceNode; | 79 m_candidateNode = m_referenceNode; |
79 while (m_candidateNode.moveToNext(root())) { | 80 while (m_candidateNode.moveToNext(root())) { |
80 // NodeIterators treat the DOM tree as a flat list of nodes. | 81 // NodeIterators treat the DOM tree as a flat list of nodes. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 | 127 |
127 void NodeIterator::nodeWillBeRemoved(Node& removedNode) { | 128 void NodeIterator::nodeWillBeRemoved(Node& removedNode) { |
128 updateForNodeRemoval(removedNode, m_candidateNode); | 129 updateForNodeRemoval(removedNode, m_candidateNode); |
129 updateForNodeRemoval(removedNode, m_referenceNode); | 130 updateForNodeRemoval(removedNode, m_referenceNode); |
130 } | 131 } |
131 | 132 |
132 void NodeIterator::updateForNodeRemoval(Node& removedNode, | 133 void NodeIterator::updateForNodeRemoval(Node& removedNode, |
133 NodePointer& referenceNode) const { | 134 NodePointer& referenceNode) const { |
134 DCHECK_EQ(root()->document(), removedNode.document()); | 135 DCHECK_EQ(root()->document(), removedNode.document()); |
135 | 136 |
136 // Iterator is not affected if the removed node is the reference node and is t
he root. | 137 // Iterator is not affected if the removed node is the reference node and is |
137 // or if removed node is not the reference node, or the ancestor of the refere
nce node. | 138 // the root. or if removed node is not the reference node, or the ancestor of |
| 139 // the reference node. |
138 if (!removedNode.isDescendantOf(root())) | 140 if (!removedNode.isDescendantOf(root())) |
139 return; | 141 return; |
140 bool willRemoveReferenceNode = removedNode == referenceNode.node.get(); | 142 bool willRemoveReferenceNode = removedNode == referenceNode.node.get(); |
141 bool willRemoveReferenceNodeAncestor = | 143 bool willRemoveReferenceNodeAncestor = |
142 referenceNode.node && referenceNode.node->isDescendantOf(&removedNode); | 144 referenceNode.node && referenceNode.node->isDescendantOf(&removedNode); |
143 if (!willRemoveReferenceNode && !willRemoveReferenceNodeAncestor) | 145 if (!willRemoveReferenceNode && !willRemoveReferenceNodeAncestor) |
144 return; | 146 return; |
145 | 147 |
146 if (referenceNode.isPointerBeforeNode) { | 148 if (referenceNode.isPointerBeforeNode) { |
147 Node* node = NodeTraversal::next(removedNode, root()); | 149 Node* node = NodeTraversal::next(removedNode, root()); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 visitor->trace(m_referenceNode); | 202 visitor->trace(m_referenceNode); |
201 visitor->trace(m_candidateNode); | 203 visitor->trace(m_candidateNode); |
202 NodeIteratorBase::trace(visitor); | 204 NodeIteratorBase::trace(visitor); |
203 } | 205 } |
204 | 206 |
205 DEFINE_TRACE_WRAPPERS(NodeIterator) { | 207 DEFINE_TRACE_WRAPPERS(NodeIterator) { |
206 NodeIteratorBase::traceWrappers(visitor); | 208 NodeIteratorBase::traceWrappers(visitor); |
207 } | 209 } |
208 | 210 |
209 } // namespace blink | 211 } // namespace blink |
OLD | NEW |