- 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