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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 return result.release(); | 146 return result.release(); |
147 } | 147 } |
148 | 148 |
149 void NodeIterator::detach() | 149 void NodeIterator::detach() |
150 { | 150 { |
151 root()->document().detachNodeIterator(this); | 151 root()->document().detachNodeIterator(this); |
152 m_detached = true; | 152 m_detached = true; |
153 m_referenceNode.node.clear(); | 153 m_referenceNode.node.clear(); |
154 } | 154 } |
155 | 155 |
156 void NodeIterator::nodeWillBeRemoved(Node* removedNode) | 156 void NodeIterator::nodeWillBeRemoved(Node& removedNode) |
157 { | 157 { |
158 updateForNodeRemoval(removedNode, m_candidateNode); | 158 updateForNodeRemoval(removedNode, m_candidateNode); |
159 updateForNodeRemoval(removedNode, m_referenceNode); | 159 updateForNodeRemoval(removedNode, m_referenceNode); |
160 } | 160 } |
161 | 161 |
162 void NodeIterator::updateForNodeRemoval(Node* removedNode, NodePointer& referenc
eNode) const | 162 void NodeIterator::updateForNodeRemoval(Node& removedNode, NodePointer& referenc
eNode) const |
163 { | 163 { |
164 ASSERT(!m_detached); | 164 ASSERT(!m_detached); |
165 ASSERT(removedNode); | 165 ASSERT(root()->document() == removedNode.document()); |
166 ASSERT(root()->document() == removedNode->document()); | |
167 | 166 |
168 // Iterator is not affected if the removed node is the reference node and is
the root. | 167 // Iterator is not affected if the removed node is the reference node and is
the root. |
169 // or if removed node is not the reference node, or the ancestor of the refe
rence node. | 168 // or if removed node is not the reference node, or the ancestor of the refe
rence node. |
170 if (!removedNode->isDescendantOf(root())) | 169 if (!removedNode.isDescendantOf(root())) |
171 return; | 170 return; |
172 bool willRemoveReferenceNode = removedNode == referenceNode.node; | 171 bool willRemoveReferenceNode = removedNode == referenceNode.node; |
173 bool willRemoveReferenceNodeAncestor = referenceNode.node && referenceNode.n
ode->isDescendantOf(removedNode); | 172 bool willRemoveReferenceNodeAncestor = referenceNode.node && referenceNode.n
ode->isDescendantOf(&removedNode); |
174 if (!willRemoveReferenceNode && !willRemoveReferenceNodeAncestor) | 173 if (!willRemoveReferenceNode && !willRemoveReferenceNodeAncestor) |
175 return; | 174 return; |
176 | 175 |
177 if (referenceNode.isPointerBeforeNode) { | 176 if (referenceNode.isPointerBeforeNode) { |
178 Node* node = NodeTraversal::next(removedNode, root()); | 177 Node* node = NodeTraversal::next(&removedNode, root()); |
179 if (node) { | 178 if (node) { |
180 // Move out from under the node being removed if the new reference | 179 // Move out from under the node being removed if the new reference |
181 // node is a descendant of the node being removed. | 180 // node is a descendant of the node being removed. |
182 while (node && node->isDescendantOf(removedNode)) | 181 while (node && node->isDescendantOf(&removedNode)) |
183 node = NodeTraversal::next(node, root()); | 182 node = NodeTraversal::next(node, root()); |
184 if (node) | 183 if (node) |
185 referenceNode.node = node; | 184 referenceNode.node = node; |
186 } else { | 185 } else { |
187 node = NodeTraversal::previous(removedNode, root()); | 186 node = NodeTraversal::previous(&removedNode, root()); |
188 if (node) { | 187 if (node) { |
189 // Move out from under the node being removed if the reference n
ode is | 188 // Move out from under the node being removed if the reference n
ode is |
190 // a descendant of the node being removed. | 189 // a descendant of the node being removed. |
191 if (willRemoveReferenceNodeAncestor) { | 190 if (willRemoveReferenceNodeAncestor) { |
192 while (node && node->isDescendantOf(removedNode)) | 191 while (node && node->isDescendantOf(&removedNode)) |
193 node = NodeTraversal::previous(node, root()); | 192 node = NodeTraversal::previous(node, root()); |
194 } | 193 } |
195 if (node) { | 194 if (node) { |
196 // Removing last node. | 195 // Removing last node. |
197 // Need to move the pointer after the node preceding the | 196 // Need to move the pointer after the node preceding the |
198 // new reference node. | 197 // new reference node. |
199 referenceNode.node = node; | 198 referenceNode.node = node; |
200 referenceNode.isPointerBeforeNode = false; | 199 referenceNode.isPointerBeforeNode = false; |
201 } | 200 } |
202 } | 201 } |
203 } | 202 } |
204 } else { | 203 } else { |
205 Node* node = NodeTraversal::previous(removedNode, root()); | 204 Node* node = NodeTraversal::previous(&removedNode, root()); |
206 if (node) { | 205 if (node) { |
207 // Move out from under the node being removed if the reference node
is | 206 // Move out from under the node being removed if the reference node
is |
208 // a descendant of the node being removed. | 207 // a descendant of the node being removed. |
209 if (willRemoveReferenceNodeAncestor) { | 208 if (willRemoveReferenceNodeAncestor) { |
210 while (node && node->isDescendantOf(removedNode)) | 209 while (node && node->isDescendantOf(&removedNode)) |
211 node = NodeTraversal::previous(node, root()); | 210 node = NodeTraversal::previous(node, root()); |
212 } | 211 } |
213 if (node) | 212 if (node) |
214 referenceNode.node = node; | 213 referenceNode.node = node; |
215 } else { | 214 } else { |
216 // FIXME: This branch doesn't appear to have any LayoutTests. | 215 // FIXME: This branch doesn't appear to have any LayoutTests. |
217 node = NodeTraversal::next(removedNode, root()); | 216 node = NodeTraversal::next(&removedNode, root()); |
218 // Move out from under the node being removed if the reference node
is | 217 // Move out from under the node being removed if the reference node
is |
219 // a descendant of the node being removed. | 218 // a descendant of the node being removed. |
220 if (willRemoveReferenceNodeAncestor) { | 219 if (willRemoveReferenceNodeAncestor) { |
221 while (node && node->isDescendantOf(removedNode)) | 220 while (node && node->isDescendantOf(&removedNode)) |
222 node = NodeTraversal::previous(node, root()); | 221 node = NodeTraversal::previous(node, root()); |
223 } | 222 } |
224 if (node) | 223 if (node) |
225 referenceNode.node = node; | 224 referenceNode.node = node; |
226 } | 225 } |
227 } | 226 } |
228 } | 227 } |
229 | 228 |
230 | 229 |
231 } // namespace WebCore | 230 } // namespace WebCore |
OLD | NEW |