Title: [239645] trunk/Source/WebCore
Revision
239645
Author
[email protected]
Date
2019-01-04 16:08:28 -0800 (Fri, 04 Jan 2019)

Log Message

[iOS] ERROR: post-layout: dirty renderer(s) in WebCore::RenderTreeNeedsLayoutChecker::~RenderTreeNeedsLayoutChecker()
https://bugs.webkit.org/show_bug.cgi?id=189608
<rdar://problem/44473299>

Reviewed by Simon Fraser.

When a frameset/iframe is hidden and we skip layout, clear the dirty flag on its subtree as well.

Covered by fast/frames/invalid-frameset.html.

* rendering/RenderFrameSet.cpp:
(WebCore::clearSiblingSubtrees):
(WebCore::RenderFrameSet::positionFrames):
(WebCore::RenderFrameSet::positionFramesWithFlattening):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (239644 => 239645)


--- trunk/Source/WebCore/ChangeLog	2019-01-05 00:01:43 UTC (rev 239644)
+++ trunk/Source/WebCore/ChangeLog	2019-01-05 00:08:28 UTC (rev 239645)
@@ -1,3 +1,20 @@
+2019-01-04  Zalan Bujtas  <[email protected]>
+
+        [iOS] ERROR: post-layout: dirty renderer(s) in WebCore::RenderTreeNeedsLayoutChecker::~RenderTreeNeedsLayoutChecker()
+        https://bugs.webkit.org/show_bug.cgi?id=189608
+        <rdar://problem/44473299>
+
+        Reviewed by Simon Fraser.
+
+        When a frameset/iframe is hidden and we skip layout, clear the dirty flag on its subtree as well.
+
+        Covered by fast/frames/invalid-frameset.html.
+
+        * rendering/RenderFrameSet.cpp:
+        (WebCore::clearSiblingSubtrees):
+        (WebCore::RenderFrameSet::positionFrames):
+        (WebCore::RenderFrameSet::positionFramesWithFlattening):
+
 2019-01-04  Youenn Fablet  <[email protected]>
 
         [Fetch API] Implement abortable fetch

Modified: trunk/Source/WebCore/rendering/RenderFrameSet.cpp (239644 => 239645)


--- trunk/Source/WebCore/rendering/RenderFrameSet.cpp	2019-01-05 00:01:43 UTC (rev 239644)
+++ trunk/Source/WebCore/rendering/RenderFrameSet.cpp	2019-01-05 00:08:28 UTC (rev 239645)
@@ -494,6 +494,18 @@
     clearNeedsLayout();
 }
 
+static void resetFrameRendererAndDescendents(RenderBox* frameSetChild, RenderFrameSet& parentFrameSet)
+{
+    if (!frameSetChild)
+        return;
+
+    for (auto* descendant = frameSetChild; descendant; descendant = downcast<RenderBox>(RenderObjectTraversal::next(*descendant, &parentFrameSet))) {
+        descendant->setWidth(0);
+        descendant->setHeight(0);
+        descendant->clearNeedsLayout();
+    }
+}
+
 void RenderFrameSet::positionFrames()
 {
     RenderBox* child = firstChildBox();
@@ -534,12 +546,7 @@
         yPos += height + borderThickness;
     }
 
-    // all the remaining frames are hidden to avoid ugly spurious unflowed frames
-    for (auto* descendant = child; descendant; descendant = downcast<RenderBox>(RenderObjectTraversal::next(*descendant, this))) {
-        descendant->setWidth(0);
-        descendant->setHeight(0);
-        descendant->clearNeedsLayout();
-    }
+    resetFrameRendererAndDescendents(child, *this);
 }
 
 void RenderFrameSet::positionFramesWithFlattening()
@@ -642,12 +649,7 @@
     if (repaintNeeded)
         repaint();
 
-    // all the remaining frames are hidden to avoid ugly spurious unflowed frames
-    for (; child; child = child->nextSiblingBox()) {
-        child->setWidth(0);
-        child->setHeight(0);
-        child->clearNeedsLayout();
-    }
+    resetFrameRendererAndDescendents(child, *this);
 }
 
 bool RenderFrameSet::flattenFrameSet() const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to