diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
commit | ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (patch) | |
tree | b34b0daceb7c8e7fdde4b4ec43650ab7caadb0a9 /Source/WebCore/dom/ContainerNode.cpp | |
parent | 03e12282df9aa1e1fb05a8b90f1cfc2e08764cec (diff) | |
download | qtwebkit-ad0d549d4cc13433f77c1ac8f0ab379c83d93f28.tar.gz |
Imported WebKit commit bb52bf3c0119e8a128cd93afe5572413a8617de9 (http://svn.webkit.org/repository/webkit/trunk@108790)
Diffstat (limited to 'Source/WebCore/dom/ContainerNode.cpp')
-rw-r--r-- | Source/WebCore/dom/ContainerNode.cpp | 28 |
1 files changed, 7 insertions, 21 deletions
diff --git a/Source/WebCore/dom/ContainerNode.cpp b/Source/WebCore/dom/ContainerNode.cpp index dbd2b7259..0a81c6dea 100644 --- a/Source/WebCore/dom/ContainerNode.cpp +++ b/Source/WebCore/dom/ContainerNode.cpp @@ -69,7 +69,7 @@ static inline void collectNodes(Node* node, NodeVector& nodes) static void collectTargetNodes(Node* node, NodeVector& nodes) { - if (node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE) { + if (node->nodeType() != Node::DOCUMENT_FRAGMENT_NODE || node->isShadowRoot()) { nodes.append(node); return; } @@ -158,11 +158,6 @@ bool ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, Exce if (ec) return false; - // FIXME: After sending the mutation events, "this" could be destroyed. - // We can prevent that by doing a "ref", but first we have to make sure - // that no callers call with ref count == 0 and parent = 0 (as of this - // writing, there are definitely callers who call that way). - // Due to arbitrary code running in response to a DOM mutation event it's // possible that "next" is no longer a child of "this". // It's also possible that "child" has been inserted elsewhere. @@ -293,12 +288,7 @@ bool ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, Exce if (ec) return false; - // FIXME: After sending the mutation events, "this" could be destroyed. - // We can prevent that by doing a "ref", but first we have to make sure - // that no callers call with ref count == 0 and parent = 0 (as of this - // writing, there are definitely callers who call that way). - - bool isFragment = newChild->nodeType() == DOCUMENT_FRAGMENT_NODE; + bool isFragment = newChild->nodeType() == DOCUMENT_FRAGMENT_NODE && !newChild->isShadowRoot(); // Add the new child(ren) RefPtr<Node> child = isFragment ? newChild->firstChild() : newChild; @@ -469,24 +459,19 @@ bool ContainerNode::removeChild(Node* oldChild, ExceptionCode& ec) return false; } - // FIXME: After sending the mutation events, "this" could be destroyed. - // We can prevent that by doing a "ref", but first we have to make sure - // that no callers call with ref count == 0 and parent = 0 (as of this - // writing, there are definitely callers who call that way). - Node* prev = child->previousSibling(); Node* next = child->nextSibling(); removeBetween(prev, next, child.get()); - // Dispatch post-removal mutation events childrenChanged(false, prev, next, -1); - dispatchSubtreeModifiedEvent(); if (child->inDocument()) child->removedFromDocument(); else child->removedFromTree(true); + dispatchSubtreeModifiedEvent(); + return child; } @@ -592,11 +577,10 @@ void ContainerNode::removeChildren() removedChild->detach(); } + // FIXME: This should be just above dispatchSubtreeModifiedEvent(); allowEventDispatch(); - // Dispatch a single post-removal mutation event denoting a modified subtree. childrenChanged(false, 0, 0, -static_cast<int>(removedChildrenCount)); - dispatchSubtreeModifiedEvent(); for (i = 0; i < removedChildrenCount; ++i) { Node* removedChild = removedChildren[i].get(); @@ -606,6 +590,8 @@ void ContainerNode::removeChildren() // document. There is no explanation for this discrepancy between removeChild() // and its optimized version removeChildren(). } + + dispatchSubtreeModifiedEvent(); } bool ContainerNode::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec, bool shouldLazyAttach) |