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

Side by Side Diff: Source/core/dom/NodeIterator.cpp

Issue 48803004: Have Document::nodeWillBeRemoved() take a reference (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 1 month 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
« no previous file with comments | « Source/core/dom/NodeIterator.h ('k') | Source/core/dom/Range.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 * 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
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
OLDNEW
« no previous file with comments | « Source/core/dom/NodeIterator.h ('k') | Source/core/dom/Range.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698