Title: [290549] trunk
Revision
290549
Author
za...@apple.com
Date
2022-02-26 10:44:03 -0800 (Sat, 26 Feb 2022)

Log Message

[RenderTreeBuilder] Clean up descendant floats when a block container becomes float
https://bugs.webkit.org/show_bug.cgi?id=237238
<rdar://79960422>

Reviewed by Antti Koivisto.

Source/WebCore:

When a block box becomes float, it forms a "lockdown" container for the descendant floats by establishing a BFC.
What it means is that such descendant floats can't intrude to sibling block containers anymore.
This patch ensures that we remove such floats from sibling (and their descendant) renderers.

Test: fast/block/float/float-merge-anon-parent-crash.html

* rendering/updating/RenderTreeBuilder.cpp:
(WebCore::RenderTreeBuilder::normalizeTreeAfterStyleChange):

LayoutTests:

* fast/block/float/float-merge-anon-parent-crash-expected.txt: Added.
* fast/block/float/float-merge-anon-parent-crash.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (290548 => 290549)


--- trunk/LayoutTests/ChangeLog	2022-02-26 18:43:07 UTC (rev 290548)
+++ trunk/LayoutTests/ChangeLog	2022-02-26 18:44:03 UTC (rev 290549)
@@ -1,3 +1,14 @@
+2022-02-26  Alan Bujtas  <za...@apple.com>
+
+        [RenderTreeBuilder] Clean up descendant floats when a block container becomes float
+        https://bugs.webkit.org/show_bug.cgi?id=237238
+        <rdar://79960422>
+
+        Reviewed by Antti Koivisto.
+
+        * fast/block/float/float-merge-anon-parent-crash-expected.txt: Added.
+        * fast/block/float/float-merge-anon-parent-crash.html: Added.
+
 2022-02-26  Simon Fraser  <simon.fra...@apple.com>
 
         No animation when scroll snap scroller is navigated with the keyboard

Added: trunk/LayoutTests/fast/block/float/float-merge-anon-parent-crash-expected.txt (0 => 290549)


--- trunk/LayoutTests/fast/block/float/float-merge-anon-parent-crash-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/block/float/float-merge-anon-parent-crash-expected.txt	2022-02-26 18:44:03 UTC (rev 290549)
@@ -0,0 +1,2 @@
+
+

Added: trunk/LayoutTests/fast/block/float/float-merge-anon-parent-crash.html (0 => 290549)


--- trunk/LayoutTests/fast/block/float/float-merge-anon-parent-crash.html	                        (rev 0)
+++ trunk/LayoutTests/fast/block/float/float-merge-anon-parent-crash.html	2022-02-26 18:44:03 UTC (rev 290549)
@@ -0,0 +1,35 @@
+<style>
+  html {
+    -webkit-user-modify: read-write;
+  }
+  span {
+    padding: 1px;
+  }
+  div {
+    padding: 123456789px;
+  }
+  div:only-child, div:nth-child(2) {
+    float: left;
+  }
+</style>
+<body>
+<!-- PASS if no crash or assert. -->
+<span></span><div><div></body>
+<script>
+if (window.testRunner)
+  testRunner.dumpAsText();
+    
+let firstDiv = document.createElement('div');
+document.body.appendChild(firstDiv);
+firstDiv.appendChild(document.createElement('div'));
+let middleDiv = document.createElement('div');
+document.body.appendChild(middleDiv);
+middleDiv.appendChild(document.createElement('span'));
+middleDiv.appendChild(document.createElement('div'));
+let lastDiv = document.createElement('div');
+middleDiv.appendChild(lastDiv);
+lastDiv.appendChild(document.createElement('div'));
+
+document.execCommand('SelectAll');
+document.execCommand('Delete');
+</script>

Modified: trunk/Source/WebCore/ChangeLog (290548 => 290549)


--- trunk/Source/WebCore/ChangeLog	2022-02-26 18:43:07 UTC (rev 290548)
+++ trunk/Source/WebCore/ChangeLog	2022-02-26 18:44:03 UTC (rev 290549)
@@ -1,3 +1,20 @@
+2022-02-26  Alan Bujtas  <za...@apple.com>
+
+        [RenderTreeBuilder] Clean up descendant floats when a block container becomes float
+        https://bugs.webkit.org/show_bug.cgi?id=237238
+        <rdar://79960422>
+
+        Reviewed by Antti Koivisto.
+
+        When a block box becomes float, it forms a "lockdown" container for the descendant floats by establishing a BFC.
+        What it means is that such descendant floats can't intrude to sibling block containers anymore.
+        This patch ensures that we remove such floats from sibling (and their descendant) renderers.
+
+        Test: fast/block/float/float-merge-anon-parent-crash.html
+
+        * rendering/updating/RenderTreeBuilder.cpp:
+        (WebCore::RenderTreeBuilder::normalizeTreeAfterStyleChange):
+
 2022-02-26  Simon Fraser  <simon.fra...@apple.com>
 
         No animation when scroll snap scroller is navigated with the keyboard

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp (290548 => 290549)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2022-02-26 18:43:07 UTC (rev 290548)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2022-02-26 18:44:03 UTC (rev 290549)
@@ -641,10 +641,18 @@
     if (noLongerAffectsParent) {
         childFlowStateChangesAndNoLongerAffectsParentBlock(renderer);
 
-        if (is<RenderBlockFlow>(renderer)) {
+        if (isFloating && is<RenderBlockFlow>(renderer)) {
+            auto clearDescendantFloats = [&] {
+                // These descendent floats can not intrude other, sibling block containers anymore.
+                for (auto& descendant : descendantsOfType<RenderBox>(renderer)) {
+                    if (descendant.isFloatingOrOutOfFlowPositioned())
+                        descendant.removeFloatingOrPositionedChildFromBlockLists();
+                }
+            };
+            clearDescendantFloats();
             // Fresh floats need to be reparented if they actually belong to the previous anonymous block.
             // It copies the logic of RenderBlock::addChildIgnoringContinuation
-            if (isFloating && renderer.previousSibling() && renderer.previousSibling()->isAnonymousBlock())
+            if (renderer.previousSibling() && renderer.previousSibling()->isAnonymousBlock())
                 move(downcast<RenderBoxModelObject>(parent), downcast<RenderBoxModelObject>(*renderer.previousSibling()), renderer, RenderTreeBuilder::NormalizeAfterInsertion::No);
         }
     }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to