Index: Source/core/dom/ContainerNode.cpp |
diff --git a/Source/core/dom/ContainerNode.cpp b/Source/core/dom/ContainerNode.cpp |
index 651b192dee63a5331d2ac5c1009a1dffc378d8ca..b98275fbb2fc872646d2a7842f88dfe924795c21 100644 |
--- a/Source/core/dom/ContainerNode.cpp |
+++ b/Source/core/dom/ContainerNode.cpp |
@@ -85,11 +85,8 @@ void ContainerNode::removeDetachedChildren() |
void ContainerNode::parserTakeAllChildrenFrom(ContainerNode& oldParent) |
{ |
- while (RefPtrWillBeRawPtr<Node> child = oldParent.firstChild()) { |
- oldParent.parserRemoveChild(*child); |
- treeScope().adoptIfNeeded(*child); |
+ while (RefPtrWillBeRawPtr<Node> child = oldParent.firstChild()) |
parserAppendChild(child.get()); |
- } |
} |
ContainerNode::~ContainerNode() |
@@ -304,6 +301,12 @@ void ContainerNode::parserInsertBefore(PassRefPtrWillBeRawPtr<Node> newChild, No |
RefPtrWillBeRawPtr<Node> protect(this); |
+ // FIXME: parserRemoveChild can run script which could then insert the |
+ // newChild back into the page. Loop until the child is actually removed. |
+ // See: fast/parser/execute-script-during-adoption-agency-removal.html |
+ while (RefPtrWillBeRawPtr<ContainerNode> parent = newChild->parentNode()) |
+ parent->parserRemoveChild(*newChild); |
+ |
if (document() != newChild->document()) |
document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); |
@@ -752,12 +755,17 @@ PassRefPtrWillBeRawPtr<Node> ContainerNode::appendChild(PassRefPtrWillBeRawPtr<N |
void ContainerNode::parserAppendChild(PassRefPtrWillBeRawPtr<Node> newChild) |
{ |
ASSERT(newChild); |
- ASSERT(!newChild->parentNode()); // Use appendChild if you need to handle reparenting (and want DOM mutation events). |
ASSERT(!newChild->isDocumentFragment()); |
ASSERT(!isHTMLTemplateElement(this)); |
RefPtrWillBeRawPtr<Node> protect(this); |
+ // FIXME: parserRemoveChild can run script which could then insert the |
+ // newChild back into the page. Loop until the child is actually removed. |
+ // See: fast/parser/execute-script-during-adoption-agency-removal.html |
+ while (RefPtrWillBeRawPtr<ContainerNode> parent = newChild->parentNode()) |
+ parent->parserRemoveChild(*newChild); |
+ |
if (document() != newChild->document()) |
document().adoptNode(newChild.get(), ASSERT_NO_EXCEPTION); |