[iOS WK1] Do not try to layout a subframe if its document has not been constructed...
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 May 2017 20:54:05 +0000 (20:54 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 May 2017 20:54:05 +0000 (20:54 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172042
<rdar://problem/32084098>

Reviewed by Antti Koivisto.

On iOS WK1 we can end up in an inconsistent state, where
1. the web thread is inside a newly injected iframe's document's c'tor and
2. waiting on a delegate callback on the main thread
while the main thread
1. executes a pending didLayout() task
2. triggers layout on the newly injected iframe.

* rendering/RenderWidget.cpp:
(WebCore::RenderWidget::updateWidgetPosition):

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

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderWidget.cpp

index 2b8cecb..468b775 100644 (file)
@@ -1,3 +1,21 @@
+2017-05-12  Zalan Bujtas  <zalan@apple.com>
+
+        [iOS WK1] Do not try to layout a subframe if its document has not been constructed yet.
+        https://bugs.webkit.org/show_bug.cgi?id=172042
+        <rdar://problem/32084098>
+
+        Reviewed by Antti Koivisto.
+
+        On iOS WK1 we can end up in an inconsistent state, where 
+        1. the web thread is inside a newly injected iframe's document's c'tor and 
+        2. waiting on a delegate callback on the main thread
+        while the main thread
+        1. executes a pending didLayout() task
+        2. triggers layout on the newly injected iframe.
+
+        * rendering/RenderWidget.cpp:
+        (WebCore::RenderWidget::updateWidgetPosition):
+
 2017-05-11  Jiewen Tan  <jiewen_tan@apple.com>
 
         Check existence of a page before accessing its plugins
index b5b1888..f69de95 100644 (file)
@@ -324,7 +324,7 @@ RenderWidget::ChildWidgetState RenderWidget::updateWidgetPosition()
     if (is<FrameView>(*m_widget)) {
         FrameView& frameView = downcast<FrameView>(*m_widget);
         // Check the frame's page to make sure that the frame isn't in the process of being destroyed.
-        if ((widgetSizeChanged || frameView.needsLayout()) && frameView.frame().page())
+        if ((widgetSizeChanged || frameView.needsLayout()) && frameView.frame().page() && frameView.frame().document())
             frameView.layout();
     }
     return ChildWidgetState::Valid;