Title: [225776] trunk
Revision
225776
Author
[email protected]
Date
2017-12-11 23:11:04 -0800 (Mon, 11 Dec 2017)

Log Message

[css-grid] Automatic minimum size is not clamped if min track sizing function is auto
https://bugs.webkit.org/show_bug.cgi?id=180283

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

Update expected result in the following WPT tests, as now everything
is passing there.

* web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-022-expected.txt:
* web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-023-expected.txt:

Source/WebCore:

We were not clamping the automatic minimum size when
the min track sizing function was intrinsic (e.g. minmax(auto, 0px)).
However the spec (https://drafts.csswg.org/css-grid/#min-size-auto)
is very clear regarding that.

This patch modifies
GridTrackSizingAlgorithm::sizeTrackToFitNonSpanningItem(),
so in the case of a fixed max track sizing function it clamps
the automatic minimum size of the item to the stretch fit
of the grid area's size.
It needs to take into account if the item has fixed size, margin, border
and/or padding as those cannot be clamped.

Using WPT tests to verify this behavior,
and corrected a bunch of other tests that were wrong.

Test: imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-017.html
      imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-022.html
      imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-023.html

* rendering/GridTrackSizingAlgorithm.cpp:
(WebCore::GridTrackSizingAlgorithm::sizeTrackToFitNonSpanningItem):
* rendering/GridTrackSizingAlgorithm.h:
(WebCore::GridTrack::growthLimitIsInfinite const):
* rendering/style/GridTrackSize.h:
(WebCore::GridTrackSize::cacheMinMaxTrackBreadthTypes):
(WebCore::GridTrackSize::hasFixedMaxTrackBreadth const):

LayoutTests:

This patch updates a bunch of tests that were wrong
to follow the new behavior.

* TestExpectations: Now we're passing one WPT test more.
* fast/css-grid-layout/min-height-border-box.html:
* fast/css-grid-layout/min-width-margin-box.html:
* fast/css-grid-layout/percent-of-indefinite-track-size-in-auto.html:
* fast/css-grid-layout/percent-of-indefinite-track-size.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (225775 => 225776)


--- trunk/LayoutTests/ChangeLog	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/ChangeLog	2017-12-12 07:11:04 UTC (rev 225776)
@@ -1,3 +1,19 @@
+2017-12-11  Manuel Rego Casasnovas  <[email protected]>
+
+        [css-grid] Automatic minimum size is not clamped if min track sizing function is auto
+        https://bugs.webkit.org/show_bug.cgi?id=180283
+
+        Reviewed by Darin Adler.
+
+        This patch updates a bunch of tests that were wrong
+        to follow the new behavior.
+
+        * TestExpectations: Now we're passing one WPT test more.
+        * fast/css-grid-layout/min-height-border-box.html:
+        * fast/css-grid-layout/min-width-margin-box.html:
+        * fast/css-grid-layout/percent-of-indefinite-track-size-in-auto.html:
+        * fast/css-grid-layout/percent-of-indefinite-track-size.html:
+
 2017-12-11  Eric Carlson  <[email protected]>
 
         Web Inspector: Optionally log WebKit log parameters as JSON

Modified: trunk/LayoutTests/TestExpectations (225775 => 225776)


--- trunk/LayoutTests/TestExpectations	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/TestExpectations	2017-12-12 07:11:04 UTC (rev 225776)
@@ -478,7 +478,6 @@
 webkit.org/b/165062 fast/css-grid-layout/grid-baseline.html [ ImageOnlyFailure ]
 webkit.org/b/165062 fast/css-grid-layout/grid-baseline-margins.html [ ImageOnlyFailure ]
 webkit.org/b/169271 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-sizing-alignment-001.html [ ImageOnlyFailure ]
-webkit.org/b/180283 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-017.html [ ImageOnlyFailure ]
 webkit.org/b/180290 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-gutters-001.html [ ImageOnlyFailure ]
 webkit.org/b/180290 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-gutters-002.html [ ImageOnlyFailure ]
 webkit.org/b/180290 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-gutters-003.html [ ImageOnlyFailure ]

Modified: trunk/LayoutTests/fast/css-grid-layout/min-height-border-box.html (225775 => 225776)


--- trunk/LayoutTests/fast/css-grid-layout/min-height-border-box.html	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/fast/css-grid-layout/min-height-border-box.html	2017-12-12 07:11:04 UTC (rev 225776)
@@ -29,14 +29,14 @@
 
 <h3>min-height: auto. grid height: auto</h3>
 <div class="container">
-    <div class="grid" data-expected-width="150" data-expected-height="35">
-        <div class="item" data-expected-width="140" data-expected-height="25">XXXX</div>
+    <div class="grid" data-expected-width="150" data-expected-height="10">
+        <div class="item" data-expected-width="140" data-expected-height="0">XXXX</div>
     </div>
 </div>
 
 <div class="container">
-    <div class="grid" data-expected-width="150" data-expected-height="77">
-        <div class="item borderPaddingMargin" data-expected-width="116" data-expected-height="48">XXX</div>
+    <div class="grid" data-expected-width="150" data-expected-height="52">
+        <div class="item borderPaddingMargin" data-expected-width="116" data-expected-height="23">XXX</div>
     </div>
 </div>
 

Modified: trunk/LayoutTests/fast/css-grid-layout/min-width-margin-box.html (225775 => 225776)


--- trunk/LayoutTests/fast/css-grid-layout/min-width-margin-box.html	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/fast/css-grid-layout/min-width-margin-box.html	2017-12-12 07:11:04 UTC (rev 225776)
@@ -38,15 +38,15 @@
 <h3>grid width: auto</h3>
 <div class="container">
     <div class="grid" data-expected-width="150" data-expected-height="50">
-        <div class="item" data-expected-width="100" data-expected-height="25">XXXX</div>
-        <div class="stretchedItem" data-expected-width="100" data-expected-height="15"></div>
+        <div class="item" data-expected-width="0" data-expected-height="25">XXXX</div>
+        <div class="stretchedItem" data-expected-width="0" data-expected-height="15"></div>
     </div>
 </div>
 
 <div class="container">
     <div class="grid" data-expected-width="150" data-expected-height="92">
-        <div class="item borderPaddingMargin" data-expected-width="141" data-expected-height="48">XXXX</div>
-        <div class="stretchedItem" data-expected-width="165" data-expected-height="15"></div>
+        <div class="item borderPaddingMargin" data-expected-width="41" data-expected-height="48">XXXX</div>
+        <div class="stretchedItem" data-expected-width="65" data-expected-height="15"></div>
     </div>
 </div>
 

Modified: trunk/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-auto.html (225775 => 225776)


--- trunk/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-auto.html	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size-in-auto.html	2017-12-12 07:11:04 UTC (rev 225776)
@@ -39,7 +39,7 @@
     </div>
 </div>
 <div style="position: relative;">
-    <div class="grid min-content gridWithPercentInMinOfMinMax" data-expected-width="30" data-expected-height="20">
+    <div class="grid min-content gridWithPercentInMinOfMinMax" data-expected-width="30" data-expected-height="15">
 	<div class="firstRowFirstColumn">XXX</div>
 	<div class="firstRowFirstColumn">XX XX</div>
     </div>

Modified: trunk/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size.html (225775 => 225776)


--- trunk/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size.html	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size.html	2017-12-12 07:11:04 UTC (rev 225776)
@@ -39,7 +39,7 @@
     </div>
 </div>
 <div style="position: relative;">
-    <div class="grid min-content gridWithPercentInMinOfMinMax" data-expected-width="30" data-expected-height="20">
+    <div class="grid min-content gridWithPercentInMinOfMinMax" data-expected-width="30" data-expected-height="15">
 	<div class="firstRowFirstColumn">XXX</div>
 	<div class="firstRowFirstColumn">XX XX</div>
     </div>

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (225775 => 225776)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2017-12-12 07:11:04 UTC (rev 225776)
@@ -1,5 +1,18 @@
 2017-12-11  Manuel Rego Casasnovas  <[email protected]>
 
+        [css-grid] Automatic minimum size is not clamped if min track sizing function is auto
+        https://bugs.webkit.org/show_bug.cgi?id=180283
+
+        Reviewed by Darin Adler.
+
+        Update expected result in the following WPT tests, as now everything
+        is passing there.
+
+        * web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-022-expected.txt:
+        * web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-023-expected.txt:
+
+2017-12-11  Manuel Rego Casasnovas  <[email protected]>
+
         REGRESSION(r221931): Row stretch doesn't work for grid container with min-height
         https://bugs.webkit.org/show_bug.cgi?id=180287
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-022-expected.txt (225775 => 225776)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-022-expected.txt	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-022-expected.txt	2017-12-12 07:11:04 UTC (rev 225776)
@@ -9,18 +9,8 @@
 PASS .grid 8 
 PASS .grid 9 
 PASS .grid 10 
-FAIL .grid 11 assert_equals: 
-<div class="grid" style="grid-template-columns: minmax(auto, 25px);">
-  <div data-expected-width="25">XXXXXXXXXX</div>
-  <div data-expected-width="25"></div>
-</div>
-width expected 25 but got 100
-FAIL .grid 12 assert_equals: 
-<div class="grid" style="grid-template-columns: minmax(auto, 0px);">
-  <div data-expected-width="0">XXXXXXXXXX</div>
-  <div data-expected-width="0"></div>
-</div>
-width expected 0 but got 100
+PASS .grid 11 
+PASS .grid 12 
 PASS .grid 13 
 PASS .grid 14 
 PASS .grid 15 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-023-expected.txt (225775 => 225776)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-023-expected.txt	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-023-expected.txt	2017-12-12 07:11:04 UTC (rev 225776)
@@ -9,18 +9,8 @@
 PASS .grid 8 
 PASS .grid 9 
 PASS .grid 10 
-FAIL .grid 11 assert_equals: 
-<div class="grid" style="grid-template-rows: minmax(auto, 25px);">
-  <div class="verticalRL" data-expected-height="25">XXXXXXXXXX</div>
-  <div data-expected-height="25"></div>
-</div>
-height expected 25 but got 100
-FAIL .grid 12 assert_equals: 
-<div class="grid" style="grid-template-rows: minmax(auto, 0px);">
-  <div class="verticalRL" data-expected-height="0">XXXXXXXXXX</div>
-  <div data-expected-height="0"></div>
-</div>
-height expected 0 but got 100
+PASS .grid 11 
+PASS .grid 12 
 PASS .grid 13 
 PASS .grid 14 
 PASS .grid 15 
@@ -34,18 +24,8 @@
 PASS .grid 23 
 PASS .grid 24 
 PASS .grid 25 
-FAIL .grid 26 assert_equals: 
-<div class="grid" style="grid-template-rows: minmax(auto, 25px);">
-  <div class="verticalLR" data-expected-height="25">XXXXXXXXXX</div>
-  <div data-expected-height="25"></div>
-</div>
-height expected 25 but got 100
-FAIL .grid 27 assert_equals: 
-<div class="grid" style="grid-template-rows: minmax(auto, 0px);">
-  <div class="verticalLR" data-expected-height="0">XXXXXXXXXX</div>
-  <div data-expected-height="0"></div>
-</div>
-height expected 0 but got 100
+PASS .grid 26 
+PASS .grid 27 
 PASS .grid 28 
 PASS .grid 29 
 PASS .grid 30 

Modified: trunk/Source/WebCore/ChangeLog (225775 => 225776)


--- trunk/Source/WebCore/ChangeLog	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/Source/WebCore/ChangeLog	2017-12-12 07:11:04 UTC (rev 225776)
@@ -1,3 +1,38 @@
+2017-12-11  Manuel Rego Casasnovas  <[email protected]>
+
+        [css-grid] Automatic minimum size is not clamped if min track sizing function is auto
+        https://bugs.webkit.org/show_bug.cgi?id=180283
+
+        Reviewed by Darin Adler.
+
+        We were not clamping the automatic minimum size when
+        the min track sizing function was intrinsic (e.g. minmax(auto, 0px)).
+        However the spec (https://drafts.csswg.org/css-grid/#min-size-auto)
+        is very clear regarding that.
+
+        This patch modifies
+        GridTrackSizingAlgorithm::sizeTrackToFitNonSpanningItem(),
+        so in the case of a fixed max track sizing function it clamps
+        the automatic minimum size of the item to the stretch fit
+        of the grid area's size.
+        It needs to take into account if the item has fixed size, margin, border
+        and/or padding as those cannot be clamped.
+
+        Using WPT tests to verify this behavior,
+        and corrected a bunch of other tests that were wrong.
+
+        Test: imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-017.html
+              imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-022.html
+              imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-minimum-size-grid-items-023.html
+
+        * rendering/GridTrackSizingAlgorithm.cpp:
+        (WebCore::GridTrackSizingAlgorithm::sizeTrackToFitNonSpanningItem):
+        * rendering/GridTrackSizingAlgorithm.h:
+        (WebCore::GridTrack::growthLimitIsInfinite const):
+        * rendering/style/GridTrackSize.h:
+        (WebCore::GridTrackSize::cacheMinMaxTrackBreadthTypes):
+        (WebCore::GridTrackSize::hasFixedMaxTrackBreadth const):
+
 2017-12-11  Zan Dobersek  <[email protected]>
 
         [Cairo] Cairo::clipToImageBuffer() should operate on a cairo_surface_t

Modified: trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp (225775 => 225776)


--- trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp	2017-12-12 07:11:04 UTC (rev 225776)
@@ -235,13 +235,29 @@
     unsigned trackPosition = span.startLine();
     GridTrackSize trackSize = gridTrackSize(m_direction, trackPosition);
 
-    if (trackSize.hasMinContentMinTrackBreadth())
+    if (trackSize.hasMinContentMinTrackBreadth()) {
         track.setBaseSize(std::max(track.baseSize(), m_strategy->minContentForChild(gridItem)));
-    else if (trackSize.hasMaxContentMinTrackBreadth())
+    } else if (trackSize.hasMaxContentMinTrackBreadth()) {
         track.setBaseSize(std::max(track.baseSize(), m_strategy->maxContentForChild(gridItem)));
-    else if (trackSize.hasAutoMinTrackBreadth())
-        track.setBaseSize(std::max(track.baseSize(), m_strategy->minSizeForChild(gridItem)));
+    } else if (trackSize.hasAutoMinTrackBreadth()) {
+        auto minSize = m_strategy->minSizeForChild(gridItem);
+        bool isRowAxis = m_direction == GridLayoutFunctions::flowAwareDirectionForChild(*m_renderGrid, gridItem, ForColumns);
+        Length gridItemSize = isRowAxis ? gridItem.style().logicalWidth() : gridItem.style().logicalHeight();
+        Length gridItemMinSize = isRowAxis ? gridItem.style().logicalMinWidth() : gridItem.style().logicalMinHeight();
+        bool overflowIsVisible = isRowAxis ? gridItem.style().overflowInlineDirection() == OVISIBLE : gridItem.style().overflowBlockDirection() == OVISIBLE;
 
+        if (gridItemSize.isAuto() && gridItemMinSize.isAuto() && overflowIsVisible && trackSize.hasFixedMaxTrackBreadth()) {
+            auto maxTrackBreadth = valueForLength(trackSize.maxTrackBreadth().length(), availableSpace().value_or(LayoutUnit()));
+            if (minSize > maxTrackBreadth) {
+                auto marginAndBorderAndPadding = GridLayoutFunctions::marginLogicalSizeForChild(*m_renderGrid, m_direction, gridItem);
+                marginAndBorderAndPadding += isRowAxis ? gridItem.borderAndPaddingLogicalWidth() : gridItem.borderAndPaddingLogicalHeight();
+                minSize = std::max(maxTrackBreadth, marginAndBorderAndPadding);
+            }
+        }
+
+        track.setBaseSize(std::max(track.baseSize(), minSize));
+    }
+
     if (trackSize.hasMinContentMaxTrackBreadth()) {
         track.setGrowthLimit(std::max(track.growthLimit(), m_strategy->minContentForChild(gridItem)));
     } else if (trackSize.hasMaxContentOrAutoMaxTrackBreadth()) {

Modified: trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h (225775 => 225776)


--- trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h	2017-12-12 07:11:04 UTC (rev 225776)
@@ -53,6 +53,7 @@
     void setBaseSize(LayoutUnit);
 
     const LayoutUnit& growthLimit() const;
+    bool growthLimitIsInfinite() const { return m_growthLimit == infinity; }
     void setGrowthLimit(LayoutUnit);
 
     bool infiniteGrowthPotential() const { return growthLimitIsInfinite() || m_infinitelyGrowable; }
@@ -72,7 +73,6 @@
     std::optional<LayoutUnit> growthLimitCap() const { return m_growthLimitCap; }
 
 private:
-    bool growthLimitIsInfinite() const { return m_growthLimit == infinity; }
     bool isGrowthLimitBiggerThanBaseSize() const { return growthLimitIsInfinite() || m_growthLimit >= m_baseSize; }
 
     void ensureGrowthLimitIsBiggerThanBaseSize();

Modified: trunk/Source/WebCore/rendering/style/GridTrackSize.h (225775 => 225776)


--- trunk/Source/WebCore/rendering/style/GridTrackSize.h	2017-12-12 07:06:16 UTC (rev 225775)
+++ trunk/Source/WebCore/rendering/style/GridTrackSize.h	2017-12-12 07:11:04 UTC (rev 225776)
@@ -102,6 +102,7 @@
         m_maxTrackBreadthIsMaxContent = maxTrackBreadth().isLength() && maxTrackBreadth().length().isMaxContent();
         m_maxTrackBreadthIsMinContent = maxTrackBreadth().isLength() && maxTrackBreadth().length().isMinContent();
         m_maxTrackBreadthIsAuto = maxTrackBreadth().isLength() && maxTrackBreadth().length().isAuto();
+        m_maxTrackBreadthIsFixed = maxTrackBreadth().isLength() && maxTrackBreadth().length().isSpecified();
 
         // These values depend on the above ones so keep them here.
         m_minTrackBreadthIsIntrinsic = m_minTrackBreadthIsMaxContent || m_minTrackBreadthIsMinContent
@@ -123,6 +124,7 @@
     bool hasMinContentMinTrackBreadth() const { return m_minTrackBreadthIsMinContent; }
     bool hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth() const { return m_minTrackBreadthIsMaxContent && m_maxTrackBreadthIsMaxContent; }
     bool hasAutoOrMinContentMinTrackBreadthAndIntrinsicMaxTrackBreadth() const { return (m_minTrackBreadthIsMinContent || m_minTrackBreadthIsAuto) && m_maxTrackBreadthIsIntrinsic; }
+    bool hasFixedMaxTrackBreadth() const { return m_maxTrackBreadthIsFixed; }
 
 private:
     GridTrackSizeType m_type;
@@ -138,6 +140,7 @@
     bool m_maxTrackBreadthIsMinContent : 1;
     bool m_minTrackBreadthIsIntrinsic : 1;
     bool m_maxTrackBreadthIsIntrinsic : 1;
+    bool m_maxTrackBreadthIsFixed : 1;
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to