Title: [112323] trunk
Revision
112323
Author
[email protected]
Date
2012-03-27 15:13:06 -0700 (Tue, 27 Mar 2012)

Log Message

Hold a reference to refChild in insertBefore before calling collectChildrenAndRemoveFromOldParent
https://bugs.webkit.org/show_bug.cgi?id=82377

Reviewed by Ryosuke Niwa.

Source/WebCore:

This fixes a regression from r111925.

Test: fast/dom/insertBefore-refChild-crash.html

* dom/ContainerNode.cpp:
(WebCore::ContainerNode::insertBefore): Move the 'next' RefPtr above the call to
collectChildrenAndRemoveFromOldParent and rename refChildPreviousSibling
to 'prev' (matching appendChild and replaceChild).

LayoutTests:

* fast/dom/insertBefore-refChild-crash-expected.txt: Added.
* fast/dom/insertBefore-refChild-crash.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (112322 => 112323)


--- trunk/LayoutTests/ChangeLog	2012-03-27 22:07:18 UTC (rev 112322)
+++ trunk/LayoutTests/ChangeLog	2012-03-27 22:13:06 UTC (rev 112323)
@@ -1,3 +1,13 @@
+2012-03-27  Adam Klein  <[email protected]>
+
+        Hold a reference to refChild in insertBefore before calling collectChildrenAndRemoveFromOldParent
+        https://bugs.webkit.org/show_bug.cgi?id=82377
+
+        Reviewed by Ryosuke Niwa.
+
+        * fast/dom/insertBefore-refChild-crash-expected.txt: Added.
+        * fast/dom/insertBefore-refChild-crash.html: Added.
+
 2012-03-27  Ryosuke Niwa  <[email protected]>
 
         cssText should not generate literal 'initial' in shorthand properties

Added: trunk/LayoutTests/fast/dom/insertBefore-refChild-crash-expected.txt (0 => 112323)


--- trunk/LayoutTests/fast/dom/insertBefore-refChild-crash-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/insertBefore-refChild-crash-expected.txt	2012-03-27 22:13:06 UTC (rev 112323)
@@ -0,0 +1,2 @@
+Test passes if it does not crash.
+

Added: trunk/LayoutTests/fast/dom/insertBefore-refChild-crash.html (0 => 112323)


--- trunk/LayoutTests/fast/dom/insertBefore-refChild-crash.html	                        (rev 0)
+++ trunk/LayoutTests/fast/dom/insertBefore-refChild-crash.html	2012-03-27 22:13:06 UTC (rev 112323)
@@ -0,0 +1,18 @@
+<div>Test passes if it does not crash.</div>
+<span id=container><span></span></span>
+<span id=newChild></span>
+<script src=""
+<script>
+if (window.layoutTestController)
+    layoutTestController.dumpAsText();
+
+var container = document.getElementById('container');
+var newChild = document.getElementById('newChild');
+newChild.addEventListener('DOMNodeRemoved', function() {
+    container.innerHTML = '';
+    gc();
+}, false);
+var range = document.createRange();
+range.selectNodeContents(container);
+range.insertNode(newChild);
+</script>

Modified: trunk/Source/WebCore/ChangeLog (112322 => 112323)


--- trunk/Source/WebCore/ChangeLog	2012-03-27 22:07:18 UTC (rev 112322)
+++ trunk/Source/WebCore/ChangeLog	2012-03-27 22:13:06 UTC (rev 112323)
@@ -1,3 +1,19 @@
+2012-03-27  Adam Klein  <[email protected]>
+
+        Hold a reference to refChild in insertBefore before calling collectChildrenAndRemoveFromOldParent
+        https://bugs.webkit.org/show_bug.cgi?id=82377
+
+        Reviewed by Ryosuke Niwa.
+
+        This fixes a regression from r111925.
+
+        Test: fast/dom/insertBefore-refChild-crash.html
+
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::insertBefore): Move the 'next' RefPtr above the call to
+        collectChildrenAndRemoveFromOldParent and rename refChildPreviousSibling
+        to 'prev' (matching appendChild and replaceChild).
+
 2012-03-27  Ryosuke Niwa  <[email protected]>
 
         cssText should not generate literal 'initial' in shorthand properties

Modified: trunk/Source/WebCore/dom/ContainerNode.cpp (112322 => 112323)


--- trunk/Source/WebCore/dom/ContainerNode.cpp	2012-03-27 22:07:18 UTC (rev 112322)
+++ trunk/Source/WebCore/dom/ContainerNode.cpp	2012-03-27 22:13:06 UTC (rev 112323)
@@ -142,6 +142,8 @@
     if (refChild->previousSibling() == newChild || refChild == newChild) // nothing to do
         return true;
 
+    RefPtr<Node> next = refChild;
+
     NodeVector targets;
     collectChildrenAndRemoveFromOldParent(newChild.get(), targets, ec);
     if (ec)
@@ -153,8 +155,7 @@
     ChildListMutationScope mutation(this);
 #endif
 
-    RefPtr<Node> next = refChild;
-    RefPtr<Node> refChildPreviousSibling = refChild->previousSibling();
+    RefPtr<Node> prev = next->previousSibling();
     for (NodeVector::const_iterator it = targets.begin(); it != targets.end(); ++it) {
         Node* child = it->get();
 
@@ -176,7 +177,7 @@
         insertBeforeCommon(next.get(), child);
 
         // Send notification about the children change.
-        childrenChanged(false, refChildPreviousSibling.get(), next.get(), 1);
+        childrenChanged(false, prev.get(), next.get(), 1);
         notifyChildInserted(child);
 
         // Add child to the rendering tree.
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to