Title: [274421] trunk
Revision
274421
Author
za...@apple.com
Date
2021-03-15 08:20:36 -0700 (Mon, 15 Mar 2021)

Log Message

Fit-border-to-line may change the layout constraints between 2 paginated line layouts
https://bugs.webkit.org/show_bug.cgi?id=223169
<rdar://73147358>

Reviewed by Antti Koivisto.

Source/WebCore:

In paginated context, we keep triggering layout until all the widows/orphans are cleared.
This happens within the same layout frame (in practice this is a recursive call in
RenderBlockFlow::layoutBlock -see relayoutToAvoidWidows).
The constraints for these subsequent/recursive layouts should stay the same in order
to be able to clear any potential widows/orphans
(e.g first layout produces 5 lines but we can only have 3 on this page due to the widow/orphan values.
Now the subsequent/recursive layout is going to break the content at the 3rd line,
but if the constraints change in between and this layout only produces 2 lines, we'll keep trying
until we manage to produce at least 3 lines. Fit-border-to-line implemented in such an intrusive way that
it overrides previously computed logical width (mutates the constraint) -see RenderBlockFlow::fitBorderToLinesIfNeeded)

This patch ensures that we bail out of the recursive re-layout if we fail to produce the same set of lines.

Test: fast/multicol/widow-relayout-with-border-fit.html

* rendering/ComplexLineLayout.cpp:
(WebCore::ComplexLineLayout::layoutRunsAndFloatsInRange):

LayoutTests:

* fast/multicol/widow-relayout-with-border-fit-expected.txt: Added.
* fast/multicol/widow-relayout-with-border-fit.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (274420 => 274421)


--- trunk/LayoutTests/ChangeLog	2021-03-15 13:36:50 UTC (rev 274420)
+++ trunk/LayoutTests/ChangeLog	2021-03-15 15:20:36 UTC (rev 274421)
@@ -1,3 +1,14 @@
+2021-03-15  Zalan Bujtas  <za...@apple.com>
+
+        Fit-border-to-line may change the layout constraints between 2 paginated line layouts
+        https://bugs.webkit.org/show_bug.cgi?id=223169
+        <rdar://73147358>
+
+        Reviewed by Antti Koivisto.
+
+        * fast/multicol/widow-relayout-with-border-fit-expected.txt: Added.
+        * fast/multicol/widow-relayout-with-border-fit.html: Added.
+
 2021-03-15  Wenson Hsieh  <wenson_hs...@apple.com>
 
         [macOS] Selecting text via mouse drag in image documents shouldn't trigger click events

Modified: trunk/LayoutTests/TestExpectations (274420 => 274421)


--- trunk/LayoutTests/TestExpectations	2021-03-15 13:36:50 UTC (rev 274420)
+++ trunk/LayoutTests/TestExpectations	2021-03-15 15:20:36 UTC (rev 274421)
@@ -4818,3 +4818,5 @@
 imported/w3c/web-platform-tests/css/css-counter-styles/upper-roman/css3-counter-styles-023.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-counter-styles/upper-roman/css3-counter-styles-024.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-counter-styles/upper-roman/css3-counter-styles-024a.html [ ImageOnlyFailure ]
+
+webkit.org/b/223170 [ Debug ] fast/multicol/widow-relayout-with-border-fit.html [ Skip ]

Added: trunk/LayoutTests/fast/multicol/widow-relayout-with-border-fit-expected.txt (0 => 274421)


--- trunk/LayoutTests/fast/multicol/widow-relayout-with-border-fit-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/multicol/widow-relayout-with-border-fit-expected.txt	2021-03-15 15:20:36 UTC (rev 274421)
@@ -0,0 +1 @@
+

Added: trunk/LayoutTests/fast/multicol/widow-relayout-with-border-fit.html (0 => 274421)


--- trunk/LayoutTests/fast/multicol/widow-relayout-with-border-fit.html	                        (rev 0)
+++ trunk/LayoutTests/fast/multicol/widow-relayout-with-border-fit.html	2021-03-15 15:20:36 UTC (rev 274421)
@@ -0,0 +1,20 @@
+<style>
+  * {
+    -webkit-border-fit: lines;
+    -webkit-column-axis: vertical;
+    columns: 1px 5;
+    float: left;
+    height: 0;
+    max-block-size: 100px;
+    min-height: -webkit-fill-available;
+    shape-outside: ellipse(50% 25% at 50% 25%);
+    widows: 100;
+  }
+  *::after {
+    content: 'PASSi fnoc rasho rasse rt';
+  }
+</style>
+<script>
+if (window.testRunner)
+  testRunner.dumpAsText();
+</script>
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (274420 => 274421)


--- trunk/Source/WebCore/ChangeLog	2021-03-15 13:36:50 UTC (rev 274420)
+++ trunk/Source/WebCore/ChangeLog	2021-03-15 15:20:36 UTC (rev 274421)
@@ -1,3 +1,29 @@
+2021-03-15  Zalan Bujtas  <za...@apple.com>
+
+        Fit-border-to-line may change the layout constraints between 2 paginated line layouts
+        https://bugs.webkit.org/show_bug.cgi?id=223169
+        <rdar://73147358>
+
+        Reviewed by Antti Koivisto.
+
+        In paginated context, we keep triggering layout until all the widows/orphans are cleared.
+        This happens within the same layout frame (in practice this is a recursive call in 
+        RenderBlockFlow::layoutBlock -see relayoutToAvoidWidows).
+        The constraints for these subsequent/recursive layouts should stay the same in order
+        to be able to clear any potential widows/orphans 
+        (e.g first layout produces 5 lines but we can only have 3 on this page due to the widow/orphan values.
+        Now the subsequent/recursive layout is going to break the content at the 3rd line,
+        but if the constraints change in between and this layout only produces 2 lines, we'll keep trying
+        until we manage to produce at least 3 lines. Fit-border-to-line implemented in such an intrusive way that
+        it overrides previously computed logical width (mutates the constraint) -see RenderBlockFlow::fitBorderToLinesIfNeeded)
+
+        This patch ensures that we bail out of the recursive re-layout if we fail to produce the same set of lines.
+
+        Test: fast/multicol/widow-relayout-with-border-fit.html
+
+        * rendering/ComplexLineLayout.cpp:
+        (WebCore::ComplexLineLayout::layoutRunsAndFloatsInRange):
+
 2021-03-15  Wenson Hsieh  <wenson_hs...@apple.com>
 
         [macOS] Selecting text via mouse drag in image documents shouldn't trigger click events

Modified: trunk/Source/WebCore/rendering/ComplexLineLayout.cpp (274420 => 274421)


--- trunk/Source/WebCore/rendering/ComplexLineLayout.cpp	2021-03-15 13:36:50 UTC (rev 274420)
+++ trunk/Source/WebCore/rendering/ComplexLineLayout.cpp	2021-03-15 15:20:36 UTC (rev 274421)
@@ -1552,8 +1552,17 @@
         }
 
         // If there were no breaks in the block, we didn't create any widows.
-        if (!lineBox || !lineBox->isFirstAfterPageBreak() || lineBox == firstLineInBlock)
+        if (!lineBox || !lineBox->isFirstAfterPageBreak() || lineBox == firstLineInBlock) {
+            if (m_flow.shouldBreakAtLineToAvoidWidow()) {
+                // This is the case when the previous line layout marks a line to break at to avoid widows
+                // but the current layout does not produce that line. It happens when layout constraints unexpectedly
+                // change in between layouts (note that these paginated line layouts run within the same layout frame
+                // as opposed to two subsequent full layouts).
+                ASSERT_NOT_REACHED();
+                m_flow.clearShouldBreakAtLineToAvoidWidow();
+            }
             return;
+        }
 
         if (numLinesHanging < style().widows()) {
             // We have detected a widow. Now we need to work out how many
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to