| Index: Source/WebCore/dom/ContainerNode.cpp
|
| ===================================================================
|
| --- Source/WebCore/dom/ContainerNode.cpp (revision 86864)
|
| +++ Source/WebCore/dom/ContainerNode.cpp (working copy)
|
| @@ -534,21 +534,31 @@
|
| m_firstChild = next;
|
| if (n == m_lastChild)
|
| m_lastChild = 0;
|
| + removedChildren.append(n.release());
|
| + }
|
|
|
| - if (n->attached())
|
| - n->detach();
|
| + size_t removedChildrenCount = removedChildren.size();
|
| + size_t i;
|
|
|
| - removedChildren.append(n.release());
|
| + // Detach the nodes only after properly removed from the tree because
|
| + // a. detaching requires a proper DOM tree (for counters and quotes for
|
| + // example) and during the previous loop the next sibling still points to
|
| + // the node being removed while the node being removed does not point back
|
| + // and does not point to the same parent as its next sibling.
|
| + // b. destroying Renderers of standalone nodes is sometimes faster.
|
| + for (i = 0; i < removedChildrenCount; ++i) {
|
| + Node* removedChild = removedChildren[i].get();
|
| + if (removedChild->attached())
|
| + removedChild->detach();
|
| }
|
| +
|
| allowEventDispatch();
|
|
|
| - size_t removedChildrenCount = removedChildren.size();
|
| -
|
| // Dispatch a single post-removal mutation event denoting a modified subtree.
|
| childrenChanged(false, 0, 0, -static_cast<int>(removedChildrenCount));
|
| dispatchSubtreeModifiedEvent();
|
|
|
| - for (size_t i = 0; i < removedChildrenCount; ++i) {
|
| + for (i = 0; i < removedChildrenCount; ++i) {
|
| Node* removedChild = removedChildren[i].get();
|
| if (removedChild->inDocument())
|
| removedChild->removedFromDocument();
|
|
|