Frame flattening: childframe in FrameView::layout() needs protector.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2012 18:00:50 +0000 (18:00 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Mar 2012 18:00:50 +0000 (18:00 +0000)
https://bugs.webkit.org/show_bug.cgi?id=82345

Patch by Zalan Bujtas <zbujtas@gmail.com> on 2012-03-27
Reviewed by Kenneth Rohde Christiansen.

RefPtr<FrameView> protector(this) is supposed to protect the current frameview in
FrameView::layout() from being destroyed by recalcStyle().
However, when frame flattening is on and a child frame is re-starting layout from
the topmost parent, the protection is missing and parent's recalcStyle()
can destroy the child frame.
Moving the protector before the layout re-starting is initiated makes the child frame
safe.

No new tests. Unable to create a test case, where this scenario is reproducible.

* page/FrameView.cpp:
(WebCore::FrameView::layout):

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

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

index ea8b31ee468440a1b3d91d0c5b9df00837116521..3bcbe9e6210903fcbd8f37c783dda618b1ad054d 100644 (file)
@@ -1,3 +1,23 @@
+2012-03-27  Zalan Bujtas  <zbujtas@gmail.com>
+
+        Frame flattening: childframe in FrameView::layout() needs protector.
+        https://bugs.webkit.org/show_bug.cgi?id=82345
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        RefPtr<FrameView> protector(this) is supposed to protect the current frameview in
+        FrameView::layout() from being destroyed by recalcStyle().
+        However, when frame flattening is on and a child frame is re-starting layout from
+        the topmost parent, the protection is missing and parent's recalcStyle()
+        can destroy the child frame.
+        Moving the protector before the layout re-starting is initiated makes the child frame
+        safe.
+
+        No new tests. Unable to create a test case, where this scenario is reproducible.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::layout):
+
 2012-03-27  Antti Koivisto  <antti@apple.com>
 
         Construct CSSCharsetRule on CSSOM API access only 
index f56c343d95313538669f897b9dac39953b9a43f4..d8c74b6e6938d57eda878ba2aa904c1c2a71c3cc 100644 (file)
@@ -916,6 +916,9 @@ void FrameView::layout(bool allowSubtree)
     if (m_inLayout)
         return;
 
+    // Protect the view from being deleted during layout (in recalcStyle)
+    RefPtr<FrameView> protector(this);
+
     bool inChildFrameLayoutWithFrameFlattening = isInChildFrameWithFrameFlattening();
 
     if (inChildFrameLayoutWithFrameFlattening) {
@@ -936,9 +939,6 @@ void FrameView::layout(bool allowSubtree)
     m_delayedLayout = false;
     m_setNeedsLayoutWasDeferred = false;
 
-    // Protect the view from being deleted during layout (in recalcStyle)
-    RefPtr<FrameView> protector(this);
-
     if (!m_frame) {
         // FIXME: Do we need to set m_size.width here?
         // FIXME: Should we set m_size.height here too?