REGRESSION (r159218): FrameView::layout() should destroy TemporaryChange<LayoutPhase>
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Mar 2014 20:02:35 +0000 (20:02 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Mar 2014 20:02:35 +0000 (20:02 +0000)
before destroying Ref<FrameView>
https://bugs.webkit.org/show_bug.cgi?id=130034
<rdar://problem/15664288>

Reviewed by Alexey Proskuryakov.

We should always destroy TemporaryChange<LayoutPhase> before destroying Ref<FrameView>
in FrameView::layout() so as to ensure that the FrameView exists when we restore the
original layout phase value.

The existing test fast/frames/crash-remove-iframe-during-object-beforeload.html covers
this change. Although you must run the test with Guard Malloc enabled (i.e. run-webkit-tests -r).

* page/FrameView.cpp:
(WebCore::FrameView::layout): Move construction of variable protect before the construction of
variable layoutPhaseRestorer. Additionally, add a period to the end of the comment associated
with variable protect.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@165396 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/page/FrameView.cpp

index c21e7f8..e842d44 100644 (file)
@@ -1,3 +1,24 @@
+2014-03-10  Daniel Bates  <dabates@apple.com>
+
+        REGRESSION (r159218): FrameView::layout() should destroy TemporaryChange<LayoutPhase>
+        before destroying Ref<FrameView>
+        https://bugs.webkit.org/show_bug.cgi?id=130034
+        <rdar://problem/15664288>
+
+        Reviewed by Alexey Proskuryakov.
+
+        We should always destroy TemporaryChange<LayoutPhase> before destroying Ref<FrameView>
+        in FrameView::layout() so as to ensure that the FrameView exists when we restore the
+        original layout phase value.
+
+        The existing test fast/frames/crash-remove-iframe-during-object-beforeload.html covers
+        this change. Although you must run the test with Guard Malloc enabled (i.e. run-webkit-tests -r).
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::layout): Move construction of variable protect before the construction of
+        variable layoutPhaseRestorer. Additionally, add a period to the end of the comment associated
+        with variable protect.
+
 2014-03-10  Zsolt Borbely  <borbezs@inf.u-szeged.hu>
 
         ASSERTION FAILED: span >= 1
index ccac111..a42ff8d 100644 (file)
@@ -1056,13 +1056,13 @@ void FrameView::layout(bool allowSubtree)
     if (isInLayout())
         return;
 
+    // Protect the view from being deleted during layout (in recalcStyle).
+    Ref<FrameView> protect(*this);
+
     // Many of the tasks performed during layout can cause this function to be re-entered,
     // so save the layout phase now and restore it on exit.
     TemporaryChange<LayoutPhase> layoutPhaseRestorer(m_layoutPhase, InPreLayout);
 
-    // Protect the view from being deleted during layout (in recalcStyle)
-    Ref<FrameView> protect(*this);
-
     // Every scroll that happens during layout is programmatic.
     TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);