Title: [267503] trunk
Revision
267503
Author
obru...@igalia.com
Date
2020-09-23 15:31:47 -0700 (Wed, 23 Sep 2020)

Log Message

[css-grid] Clear the override width for computing percent margins
https://bugs.webkit.org/show_bug.cgi?id=209461

Reviewed by Manuel Rego Casasnovas.

LayoutTests/imported/w3c:

Update test expectations.

The 2 grid-items-percentage-paddings tests are now expected to have some
failures because of bug 191964. In fact they were already failing before
this patch, as can be seen in wpt.fyi:
https://wpt.fyi/results/css/css-grid/grid-items?q=grid-items-percentage-paddings-vertical-%20-002.html
It's just that the bug that is being fixed made the test runner think
that the tests were passing, probably some racy condition or such.

* web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt:
* web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt:
* web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt:
* web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt:
* web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt:

Source/WebCore:

When calculating the min-content contribution of a grid item of an auto
sized grid track we must consider the grid item's margin. When the grid
item's area is indefinite, a percent margin is resolved to zero.
However, when performing a relayout, the percent margin may be solved
against the previously computed grid area, since the grid item has
already an OverrideContainingBlockLogicalWidth value.

In order to re-compute the percent margin properly, we need to clear
the previously override value. It's important to be careful of not
clearing the override value set during intrinsic size, since we need
it for the actual layout phase. Hence, we only reset the 'override'
value when we are executing a definite strategy.

This is a reland of r261841, which was reverted because it broke spotify.
This problem is now avoided thanks to bug 210089.

Tests: imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-003.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-004.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-005.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-006.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-007.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-008.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-009.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-010.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-005.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-006.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-009.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-010.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002.html
       imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002.html

* rendering/GridTrackSizingAlgorithm.cpp:
(WebCore::hasRelativeMarginOrPaddingForChild):
(WebCore::hasRelativeOrIntrinsicSizeForChild):
(WebCore::shouldClearOverrideContainingBlockContentSizeForChild):
(WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
(WebCore::GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild const):
(WebCore::DefiniteSizeStrategy::minLogicalSizeForChild const):
(WebCore::DefiniteSizeStrategy::minContentForChild const):
* rendering/GridTrackSizingAlgorithm.h:

LayoutTests:

Update test expectations.

* TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (267502 => 267503)


--- trunk/LayoutTests/ChangeLog	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/ChangeLog	2020-09-23 22:31:47 UTC (rev 267503)
@@ -1,3 +1,14 @@
+2020-09-23  obru...@igalia.com  <obru...@igalia.com>
+
+        [css-grid] Clear the override width for computing percent margins
+        https://bugs.webkit.org/show_bug.cgi?id=209461
+
+        Reviewed by Manuel Rego Casasnovas.
+
+        Update test expectations.
+
+        * TestExpectations:
+
 2020-09-23  Tadeu Zagallo  <tzaga...@apple.com>
 
         Missing scope release in JSDOMBuiltinConstructorBase

Modified: trunk/LayoutTests/TestExpectations (267502 => 267503)


--- trunk/LayoutTests/TestExpectations	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/TestExpectations	2020-09-23 22:31:47 UTC (rev 267503)
@@ -1164,18 +1164,6 @@
 webkit.org/b/216145 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-8.html [ ImageOnlyFailure ]
 webkit.org/b/216145 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-9.html [ ImageOnlyFailure ]
 webkit.org/b/216145 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-10.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-003.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-004.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-005.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-006.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-007.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-008.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-009.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-010.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-005.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-006.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-009.html [ ImageOnlyFailure ]
-webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-010.html [ ImageOnlyFailure ]
 webkit.org/b/191461 imported/w3c/web-platform-tests/css/css-grid/grid-items/percentage-size-subitems-001.html [ ImageOnlyFailure ]
 webkit.org/b/191462 imported/w3c/web-platform-tests/css/css-grid/grid-items/percentage-size-replaced-subitems-001.html [ ImageOnlyFailure ]
 webkit.org/b/191463 imported/w3c/web-platform-tests/css/css-grid/grid-items/explicitly-sized-grid-item-as-table.html [ ImageOnlyFailure ]

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (267502 => 267503)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2020-09-23 22:31:47 UTC (rev 267503)
@@ -1,3 +1,25 @@
+2020-09-23  obru...@igalia.com  <obru...@igalia.com>
+
+        [css-grid] Clear the override width for computing percent margins
+        https://bugs.webkit.org/show_bug.cgi?id=209461
+
+        Reviewed by Manuel Rego Casasnovas.
+
+        Update test expectations.
+
+        The 2 grid-items-percentage-paddings tests are now expected to have some
+        failures because of bug 191964. In fact they were already failing before
+        this patch, as can be seen in wpt.fyi:
+        https://wpt.fyi/results/css/css-grid/grid-items?q=grid-items-percentage-paddings-vertical-%20-002.html
+        It's just that the bug that is being fixed made the test runner think
+        that the tests were passing, probably some racy condition or such.
+
+        * web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt:
+        * web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt:
+        * web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt:
+        * web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt:
+        * web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt:
+
 2020-09-23  Youenn Fablet  <you...@apple.com>
 
         Add support for HTMLMediaElement.setSinkId

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt (267502 => 267503)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt	2020-09-23 22:31:47 UTC (rev 267503)
@@ -2,17 +2,17 @@
 PASS auto - columns 
 PASS auto - rows 
 PASS min - columns 
-FAIL min - rows assert_equals: grid-template-rows expected "50px" but got "150px"
+PASS min - rows 
 PASS max - columns 
 PASS max - rows 
 PASS size - columns 
 PASS size - rows 
 PASS min max - columns 
-FAIL min max - rows assert_equals: grid-template-rows expected "50px" but got "150px"
+PASS min max - rows 
 PASS min size - columns 
-FAIL min size - rows assert_equals: grid-template-rows expected "50px" but got "200px"
+PASS min size - rows 
 PASS max size - columns 
 PASS max size - rows 
 PASS min max size - columns 
-FAIL min max size - rows assert_equals: grid-template-rows expected "50px" but got "150px"
+PASS min max size - rows 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt (267502 => 267503)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt	2020-09-23 22:31:47 UTC (rev 267503)
@@ -2,8 +2,8 @@
 PASS Minimum size: auto 
 PASS Minimum size: 0% 
 PASS Minimum size: 100% 
-FAIL Minimum size: 200% assert_equals: height expected "200px" but got "400px"
-FAIL Minimum size: 300% assert_equals: height expected "300px" but got "5400px"
+PASS Minimum size: 200% 
+PASS Minimum size: 300% 
 PASS Minimum size: 400px 
 PASS Minimum size: 500px 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt (267502 => 267503)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt	2020-09-23 22:31:47 UTC (rev 267503)
@@ -2,32 +2,12 @@
 PASS .grid 1 
 PASS .grid 2 
 PASS .grid 3 
-FAIL .grid 4 assert_equals: 
-<div class="grid">
-  <div class="minHeight60 marginTop5" data-expected-height="60"></div>
-  <div data-expected-height="65"></div>
-</div>
-height expected 65 but got 60
-FAIL .grid 5 assert_equals: 
-<div class="grid">
-  <div class="minHeight60 marginTop5 marginLeftAuto" data-expected-height="60"></div>
-  <div data-expected-height="65"></div>
-</div>
-height expected 65 but got 60
+PASS .grid 4 
+PASS .grid 5 
 PASS .grid 6 
-FAIL .grid 7 assert_equals: 
-<div class="grid">
-  <div class="minHeight60 marginBottom10" data-expected-height="60"></div>
-  <div data-expected-height="70"></div>
-</div>
-height expected 70 but got 60
+PASS .grid 7 
 PASS .grid 8 
-FAIL .grid 9 assert_equals: 
-<div class="grid">
-  <div class="minHeight60 marginTop5 marginBottom10" data-expected-height="60"></div>
-  <div data-expected-height="75"></div>
-</div>
-height expected 75 but got 60
+PASS .grid 9 
 PASS .grid 10 
 PASS .grid 11 
 PASS .grid 12 
@@ -41,41 +21,16 @@
 PASS .grid 20 
 PASS .grid 21 
 PASS .grid 22 
-FAIL .grid 23 assert_equals: 
-<div class="grid">
-  <div class="minHeight60 marginTop5 marginBottom10 paddingTop6 paddingBottom3 borderTop2 borderBottom4" data-expected-height="75"></div>
-  <div data-expected-height="90"></div>
-</div>
-height expected 90 but got 75
+PASS .grid 23 
 PASS .grid 24 
 PASS .grid 25 
 PASS .grid 26 
-FAIL .grid 27 assert_equals: 
-<div class="grid directionRTL">
-  <div class="minHeight60 marginTop5" data-expected-height="60"></div>
-  <div data-expected-height="65"></div>
-</div>
-height expected 65 but got 60
-FAIL .grid 28 assert_equals: 
-<div class="grid directionRTL">
-  <div class="minHeight60 marginTop5 marginLeftAuto" data-expected-height="60"></div>
-  <div data-expected-height="65"></div>
-</div>
-height expected 65 but got 60
+PASS .grid 27 
+PASS .grid 28 
 PASS .grid 29 
-FAIL .grid 30 assert_equals: 
-<div class="grid directionRTL">
-  <div class="minHeight60 marginBottom10" data-expected-height="60"></div>
-  <div data-expected-height="70"></div>
-</div>
-height expected 70 but got 60
+PASS .grid 30 
 PASS .grid 31 
-FAIL .grid 32 assert_equals: 
-<div class="grid directionRTL">
-  <div class="minHeight60 marginTop5 marginBottom10" data-expected-height="60"></div>
-  <div data-expected-height="75"></div>
-</div>
-height expected 75 but got 60
+PASS .grid 32 
 PASS .grid 33 
 PASS .grid 34 
 PASS .grid 35 
@@ -89,12 +44,7 @@
 PASS .grid 43 
 PASS .grid 44 
 PASS .grid 45 
-FAIL .grid 46 assert_equals: 
-<div class="grid directionRTL">
-  <div class="minHeight60 marginTop5 marginBottom10 paddingTop6 paddingBottom3 borderTop2 borderBottom4" data-expected-height="75"></div>
-  <div data-expected-height="90"></div>
-</div>
-height expected 90 but got 75
+PASS .grid 46 
 Direction LTR
 
 Item height: 60px;

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt (267502 => 267503)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt	2020-09-23 22:31:47 UTC (rev 267503)
@@ -1,12 +1,32 @@
 
 PASS .grid 1 
 PASS .grid 2 
-PASS .grid 3 
-PASS .grid 4 
+FAIL .grid 3 assert_equals: 
+<div class="grid">
+  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="10" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
+FAIL .grid 4 assert_equals: 
+<div class="grid">
+  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="10" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
 PASS .grid 5 
 PASS .grid 6 
-PASS .grid 7 
-PASS .grid 8 
+FAIL .grid 7 assert_equals: 
+<div class="grid directionRTL">
+  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="10" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
+FAIL .grid 8 assert_equals: 
+<div class="grid directionRTL">
+  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="10" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
 Direction LTR
 
 Item padding-left: 50%;

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt (267502 => 267503)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt	2020-09-23 22:31:47 UTC (rev 267503)
@@ -1,12 +1,32 @@
 
 PASS .grid 1 
 PASS .grid 2 
-PASS .grid 3 
-PASS .grid 4 
+FAIL .grid 3 assert_equals: 
+<div class="grid">
+  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="0" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
+FAIL .grid 4 assert_equals: 
+<div class="grid">
+  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="0" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
 PASS .grid 5 
 PASS .grid 6 
-PASS .grid 7 
-PASS .grid 8 
+FAIL .grid 7 assert_equals: 
+<div class="grid directionRTL">
+  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="0" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
+FAIL .grid 8 assert_equals: 
+<div class="grid directionRTL">
+  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
+  <div data-offset-x="0" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
+</div>
+height expected 60 but got 50
 Direction LTR
 
 Item padding-left: 50%;

Modified: trunk/Source/WebCore/ChangeLog (267502 => 267503)


--- trunk/Source/WebCore/ChangeLog	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/Source/WebCore/ChangeLog	2020-09-23 22:31:47 UTC (rev 267503)
@@ -1,3 +1,54 @@
+2020-09-23  obru...@igalia.com  <obru...@igalia.com>
+
+        [css-grid] Clear the override width for computing percent margins
+        https://bugs.webkit.org/show_bug.cgi?id=209461
+
+        Reviewed by Manuel Rego Casasnovas.
+
+        When calculating the min-content contribution of a grid item of an auto
+        sized grid track we must consider the grid item's margin. When the grid
+        item's area is indefinite, a percent margin is resolved to zero.
+        However, when performing a relayout, the percent margin may be solved
+        against the previously computed grid area, since the grid item has
+        already an OverrideContainingBlockLogicalWidth value.
+
+        In order to re-compute the percent margin properly, we need to clear
+        the previously override value. It's important to be careful of not
+        clearing the override value set during intrinsic size, since we need
+        it for the actual layout phase. Hence, we only reset the 'override'
+        value when we are executing a definite strategy.
+
+        This is a reland of r261841, which was reverted because it broke spotify.
+        This problem is now avoided thanks to bug 210089.
+
+        Tests: imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-003.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-004.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-005.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-006.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-007.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-008.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-009.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-010.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-005.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-006.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-009.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-010.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002.html
+               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002.html
+
+        * rendering/GridTrackSizingAlgorithm.cpp:
+        (WebCore::hasRelativeMarginOrPaddingForChild):
+        (WebCore::hasRelativeOrIntrinsicSizeForChild):
+        (WebCore::shouldClearOverrideContainingBlockContentSizeForChild):
+        (WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
+        (WebCore::GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild const):
+        (WebCore::DefiniteSizeStrategy::minLogicalSizeForChild const):
+        (WebCore::DefiniteSizeStrategy::minContentForChild const):
+        * rendering/GridTrackSizingAlgorithm.h:
+
 2020-09-23  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK][WPE] Move TLS errors API from WebKitContext to WebKitWebsiteDataManager

Modified: trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp (267502 => 267503)


--- trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp	2020-09-23 22:31:47 UTC (rev 267503)
@@ -106,13 +106,25 @@
     return axis == GridRowAxis ? ForColumns : ForRows;
 }
 
-static bool shouldClearOverrideContainingBlockContentSizeForChild(const RenderBox& child, GridTrackSizingDirection direction)
+static bool hasRelativeMarginOrPaddingForChild(const RenderBox& child, GridTrackSizingDirection direction)
 {
     if (direction == ForColumns)
+        return child.style().marginStart().isPercentOrCalculated() || child.style().marginEnd().isPercentOrCalculated() || child.style().paddingStart().isPercentOrCalculated() || child.style().paddingEnd().isPercentOrCalculated();
+    return child.style().marginBefore().isPercentOrCalculated() || child.style().marginAfter().isPercentOrCalculated() || child.style().paddingBefore().isPercentOrCalculated() || child.style().paddingAfter().isPercentOrCalculated();
+}
+
+static bool hasRelativeOrIntrinsicSizeForChild(const RenderBox& child, GridTrackSizingDirection direction)
+{
+    if (direction == ForColumns)
         return child.hasRelativeLogicalWidth() || child.style().logicalWidth().isIntrinsicOrAuto();
     return child.hasRelativeLogicalHeight() || child.style().logicalHeight().isIntrinsicOrAuto();
 }
 
+static bool shouldClearOverrideContainingBlockContentSizeForChild(const RenderBox& child, GridTrackSizingDirection direction)
+{
+    return hasRelativeOrIntrinsicSizeForChild(child, direction) || hasRelativeMarginOrPaddingForChild(child, direction);
+}
+
 static void setOverrideContainingBlockContentSizeForChild(RenderBox& child, GridTrackSizingDirection direction, Optional<LayoutUnit> size)
 {
     if (direction == ForColumns)
@@ -121,22 +133,6 @@
         child.setOverrideContainingBlockContentLogicalHeight(size);
 }
 
-// FIXME: we borrowed this from RenderBlock. We cannot call it from here because it's protected for RenderObjects.
-static LayoutUnit marginIntrinsicLogicalWidthForChild(const RenderGrid* renderGrid, RenderBox& child)
-{
-    // A margin has three types: fixed, percentage, and auto (variable).
-    // Auto and percentage margins become 0 when computing min/max width.
-    // Fixed margins can be added in as is.
-    Length marginLeft = child.style().marginStartUsing(&renderGrid->style());
-    Length marginRight = child.style().marginEndUsing(&renderGrid->style());
-    LayoutUnit margin;
-    if (marginLeft.isFixed())
-        margin += marginLeft.value();
-    if (marginRight.isFixed())
-        margin += marginRight.value();
-    return margin;
-}
-
 // GridTrackSizingAlgorithm private.
 
 void GridTrackSizingAlgorithm::setFreeSpace(GridTrackSizingDirection direction, Optional<LayoutUnit> freeSpace)
@@ -832,13 +828,7 @@
     }
 
     LayoutUnit gridAreaSize = m_algorithm.gridAreaBreadthForChild(child, childInlineDirection);
-    if (isRowAxis)
-        return minLogicalWidthForChild(child, childMinSize, gridAreaSize) + baselineShim;
-
-    bool overrideSizeHasChanged = updateOverrideContainingBlockContentSizeForChild(child, childInlineDirection, gridAreaSize);
-    layoutGridItemForMinSizeComputation(child, overrideSizeHasChanged);
-
-    return child.computeLogicalHeightUsing(MinSize, childMinSize, WTF::nullopt).valueOr(0) + child.marginLogicalHeight() + child.scrollbarLogicalHeight() + baselineShim;
+    return minLogicalSizeForChild(child, childMinSize, gridAreaSize) + baselineShim;
 }
 
 bool GridTrackSizingAlgorithm::canParticipateInBaselineAlignment(const RenderBox& child, GridAxis baselineAxis) const
@@ -920,6 +910,18 @@
     return true;
 }
 
+LayoutUnit GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild(RenderBox& child, const Length& childMinSize, LayoutUnit availableSize) const
+{
+    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
+    bool isRowAxis = direction() == childInlineDirection;
+    if (isRowAxis)
+        return child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize, *renderGrid(), nullptr) + GridLayoutFunctions::marginLogicalSizeForChild(*renderGrid(), childInlineDirection, child);
+    bool overrideSizeHasChanged = updateOverrideContainingBlockContentSizeForChild(child, childInlineDirection, availableSize);
+    layoutGridItemForMinSizeComputation(child, overrideSizeHasChanged);
+    GridTrackSizingDirection childBlockDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForRows);
+    return child.computeLogicalHeightUsing(MinSize, childMinSize, WTF::nullopt).valueOr(0) + GridLayoutFunctions::marginLogicalSizeForChild(*renderGrid(), childBlockDirection, child);
+}
+
 class IndefiniteSizeStrategy final : public GridTrackSizingAlgorithmStrategy {
 public:
     IndefiniteSizeStrategy(GridTrackSizingAlgorithm& algorithm)
@@ -926,7 +928,6 @@
         : GridTrackSizingAlgorithmStrategy(algorithm) { }
 
 private:
-    LayoutUnit minLogicalWidthForChild(RenderBox&, Length childMinSize, LayoutUnit availableSize) const override;
     void layoutGridItemForMinSizeComputation(RenderBox&, bool overrideSizeHasChanged) const override;
     void maximizeTracks(Vector<GridTrack>&, Optional<LayoutUnit>& freeSpace) override;
     double findUsedFlexFraction(Vector<unsigned>& flexibleSizedTracksIndex, GridTrackSizingDirection, Optional<LayoutUnit> freeSpace) const override;
@@ -934,11 +935,6 @@
     LayoutUnit freeSpaceForStretchAutoTracksStep() const override;
 };
 
-LayoutUnit IndefiniteSizeStrategy::minLogicalWidthForChild(RenderBox& child, Length childMinSize, LayoutUnit availableSize) const
-{
-    return child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize, *renderGrid(), nullptr) + marginIntrinsicLogicalWidthForChild(renderGrid(), child);
-}
-
 void IndefiniteSizeStrategy::layoutGridItemForMinSizeComputation(RenderBox& child, bool overrideSizeHasChanged) const
 {
     if (overrideSizeHasChanged && direction() != ForColumns)
@@ -1027,12 +1023,13 @@
         : GridTrackSizingAlgorithmStrategy(algorithm) { }
 
 private:
-    LayoutUnit minLogicalWidthForChild(RenderBox&, Length childMinSize, LayoutUnit availableSize) const override;
     void layoutGridItemForMinSizeComputation(RenderBox&, bool overrideSizeHasChanged) const override;
     void maximizeTracks(Vector<GridTrack>&, Optional<LayoutUnit>& freeSpace) override;
     double findUsedFlexFraction(Vector<unsigned>& flexibleSizedTracksIndex, GridTrackSizingDirection, Optional<LayoutUnit> freeSpace) const override;
     bool recomputeUsedFlexFractionIfNeeded(double& flexFraction, LayoutUnit& totalGrowth) const override;
     LayoutUnit freeSpaceForStretchAutoTracksStep() const override;
+    LayoutUnit minContentForChild(RenderBox&) const override;
+    LayoutUnit minLogicalSizeForChild(RenderBox&, const Length& childMinSize, LayoutUnit availableSize) const override;
 };
 
 LayoutUnit IndefiniteSizeStrategy::freeSpaceForStretchAutoTracksStep() const
@@ -1047,11 +1044,14 @@
     return minSize.value() - computeTrackBasedSize();
 }
 
-LayoutUnit DefiniteSizeStrategy::minLogicalWidthForChild(RenderBox& child, Length childMinSize, LayoutUnit availableSize) const
+LayoutUnit DefiniteSizeStrategy::minLogicalSizeForChild(RenderBox& child, const Length& childMinSize, LayoutUnit availableSize) const
 {
-    LayoutUnit marginLogicalWidth =
-        GridLayoutFunctions::computeMarginLogicalSizeForChild(*renderGrid(), ForColumns, child);
-    return child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize, *renderGrid(), nullptr) + marginLogicalWidth;
+    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
+    LayoutUnit indefiniteSize = direction() == childInlineDirection ? LayoutUnit() : LayoutUnit(-1);
+    GridTrackSizingDirection flowAwareDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, direction());
+    if (hasRelativeMarginOrPaddingForChild(child, flowAwareDirection) || (direction() != childInlineDirection && hasRelativeOrIntrinsicSizeForChild(child, flowAwareDirection)))
+        setOverrideContainingBlockContentSizeForChild(child, direction(), indefiniteSize);
+    return GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild(child, childMinSize, availableSize);
 }
 
 void DefiniteSizeStrategy::maximizeTracks(Vector<GridTrack>& tracks, Optional<LayoutUnit>& freeSpace)
@@ -1090,6 +1090,14 @@
     return m_algorithm.freeSpace(direction()).value();
 }
 
+LayoutUnit DefiniteSizeStrategy::minContentForChild(RenderBox& child) const
+{
+    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
+    if (direction() == childInlineDirection && child.needsLayout() && shouldClearOverrideContainingBlockContentSizeForChild(child, ForColumns))
+        setOverrideContainingBlockContentSizeForChild(child, childInlineDirection, LayoutUnit());
+    return GridTrackSizingAlgorithmStrategy::minContentForChild(child);
+}
+
 bool DefiniteSizeStrategy::recomputeUsedFlexFractionIfNeeded(double& flexFraction, LayoutUnit& totalGrowth) const
 {
     UNUSED_PARAM(flexFraction);

Modified: trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h (267502 => 267503)


--- trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h	2020-09-23 22:14:15 UTC (rev 267502)
+++ trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h	2020-09-23 22:31:47 UTC (rev 267503)
@@ -252,7 +252,7 @@
 class GridTrackSizingAlgorithmStrategy {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    LayoutUnit minContentForChild(RenderBox&) const;
+    virtual LayoutUnit minContentForChild(RenderBox&) const;
     LayoutUnit maxContentForChild(RenderBox&) const;
     LayoutUnit minSizeForChild(RenderBox&) const;
 
@@ -267,7 +267,7 @@
     GridTrackSizingAlgorithmStrategy(GridTrackSizingAlgorithm& algorithm)
         : m_algorithm(algorithm) { }
 
-    virtual LayoutUnit minLogicalWidthForChild(RenderBox&, Length childMinSize, LayoutUnit availableSize) const = 0;
+    virtual LayoutUnit minLogicalSizeForChild(RenderBox&, const Length& childMinSize, LayoutUnit availableSize) const;
     virtual void layoutGridItemForMinSizeComputation(RenderBox&, bool overrideSizeHasChanged) const = 0;
 
     LayoutUnit logicalHeightForChild(RenderBox&) const;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to