Title: [208531] trunk
Revision
208531
Author
svil...@igalia.com
Date
2016-11-10 02:08:19 -0800 (Thu, 10 Nov 2016)

Log Message

[css-grid] Fix fr tracks sizing under min|max-size constraints
https://bugs.webkit.org/show_bug.cgi?id=150674

Reviewed by Darin Adler.

Source/WebCore:

The min|max-sizes must be used to compute the flex fraction for indefinite free
spaces. According to the spec "If using this flex fraction would cause the grid to be
smaller than the grid container’s min-width/height (or larger than the grid container’s
max-width/height), then redo this step, treating the free space as definite and the
available grid space as equal to the grid container’s content box size when it’s sized to
its min-width/height (max-width/height)."

This only affects indefinite heights because during layout both definite sizes and any kind
of widths are properly constrained by min|max-width restrictions.

Tests: fast/css-grid-layout/flex-sizing-columns-min-max-width.html
       fast/css-grid-layout/flex-sizing-rows-min-max-height.html

* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
(WebCore::RenderGrid::computeFlexSizedTracksGrowth):
* rendering/RenderGrid.h:

LayoutTests:

* fast/css-grid-layout/flex-sizing-columns-min-max-width-expected.txt: Added.
* fast/css-grid-layout/flex-sizing-columns-min-max-width.html: Added.
* fast/css-grid-layout/flex-sizing-rows-min-max-height-expected.txt: Added.
* fast/css-grid-layout/flex-sizing-rows-min-max-height.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (208530 => 208531)


--- trunk/LayoutTests/ChangeLog	2016-11-10 09:01:21 UTC (rev 208530)
+++ trunk/LayoutTests/ChangeLog	2016-11-10 10:08:19 UTC (rev 208531)
@@ -1,3 +1,15 @@
+2016-11-08  Sergio Villar Senin  <svil...@igalia.com>
+
+        [css-grid] Fix fr tracks sizing under min|max-size constraints
+        https://bugs.webkit.org/show_bug.cgi?id=150674
+
+        Reviewed by Darin Adler.
+
+        * fast/css-grid-layout/flex-sizing-columns-min-max-width-expected.txt: Added.
+        * fast/css-grid-layout/flex-sizing-columns-min-max-width.html: Added.
+        * fast/css-grid-layout/flex-sizing-rows-min-max-height-expected.txt: Added.
+        * fast/css-grid-layout/flex-sizing-rows-min-max-height.html: Added.
+
 2016-11-09  Ryosuke Niwa  <rn...@webkit.org>
 
         WebHTMLView's _attributeStringFromDOMRange should use HTMLConverter instead of NSAttributedString's _initWithDOMRange

Added: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width-expected.txt (0 => 208531)


--- trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width-expected.txt	2016-11-10 10:08:19 UTC (rev 208531)
@@ -0,0 +1,17 @@
+This test PASS if all the grids in the same row look the same.
+
+PASS
+PASS
+PASS
+
+PASS
+PASS
+PASS
+
+PASS
+PASS
+PASS
+
+PASS
+PASS
+PASS
Property changes on: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width-expected.txt
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width.html (0 => 208531)


--- trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width.html	2016-11-10 10:08:19 UTC (rev 208531)
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML>
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<style>
+.grid {
+   margin: 3px;
+   grid: 50px / minmax(10px, 1fr) minmax(10px, 4fr);
+   grid-column-gap: 33px;
+   border: 5px dashed;
+   padding: 2px;
+}
+
+.float { float: left; }
+
+.item:nth-child(1) { background-color: purple; }
+.item:nth-child(2) { background-color: blue; }
+</style>
+
+<script src=""
+<body _onload_="checkLayout('.grid')">
+
+<p>This test PASS if all the grids in the same row look the same.</p>
+
+<div class="grid float" style="max-width: 70px" data-expected-height="64" data-expected-width="84">
+    <div class="item" data-expected-height="50" data-expected-width="10"></div>
+    <div class="item" data-expected-height="50" data-expected-width="27"></div>
+</div>
+<div class="grid float" style="min-width: 70px; max-width: 60px" data-expected-height="64" data-expected-width="84">
+    <div class="item" data-expected-height="50" data-expected-width="10"></div>
+    <div class="item" data-expected-height="50" data-expected-width="27"></div>
+</div>
+<div class="grid float" style="width: 70px" data-expected-height="64" data-expected-width="84">
+    <div class="item" data-expected-height="50" data-expected-width="10"></div>
+    <div class="item" data-expected-height="50" data-expected-width="27"></div>
+</div>
+
+<br clear="all">
+
+<div class="grid float" style="min-width: 108px" data-expected-height="64" data-expected-width="122">
+    <div class="item" data-expected-height="50" data-expected-width="15"></div>
+    <div class="item" data-expected-height="50" data-expected-width="60"></div>
+</div>
+<div class="grid float" style="min-width: 108px; max-width: 60px" data-expected-height="64" data-expected-width="122">
+    <div class="item" data-expected-height="50" data-expected-width="15"></div>
+    <div class="item" data-expected-height="50" data-expected-width="60"></div>
+</div>
+<div class="grid float" style="width: 108px" data-expected-height="64" data-expected-width="122">
+    <div class="item" data-expected-height="50" data-expected-width="15"></div>
+    <div class="item" data-expected-height="50" data-expected-width="60"></div>
+</div>
+
+<br clear="all">
+
+<div class="grid float min-width-max-content" data-expected-height="64" data-expected-width="97">
+    <div class="item" data-expected-height="50" data-expected-width="10"></div>
+    <div class="item" data-expected-height="50" data-expected-width="40"></div>
+</div>
+<div class="grid float min-width-max-content max-width-min-content" data-expected-height="64" data-expected-width="97">
+    <div class="item" data-expected-height="50" data-expected-width="10"></div>
+    <div class="item" data-expected-height="50" data-expected-width="40"></div>
+</div>
+<div class="grid float max-content" data-expected-height="64" data-expected-width="97">
+    <div class="item" data-expected-height="50" data-expected-width="10"></div>
+    <div class="item" data-expected-height="50" data-expected-width="40"></div>
+</div>
+
+<br clear="all">
+
+<div class="float min-content">
+    <div class="grid min-width-max-content" data-expected-height="64" data-expected-width="97">
+        <div class="item" data-expected-height="50" data-expected-width="10"></div>
+        <div class="item" data-expected-height="50" data-expected-width="40"></div>
+    </div>
+</div>
+<div class="float max-content">
+    <div class="grid min-width-max-content max-width-min-content" data-expected-height="64" data-expected-width="97">
+        <div class="item" data-expected-height="50" data-expected-width="10"></div>
+        <div class="item" data-expected-height="50" data-expected-width="40"></div>
+    </div>
+</div>
+<div class="float fit-content">
+    <div class="grid max-content" data-expected-height="64" data-expected-width="97">
+        <div class="item" data-expected-height="50" data-expected-width="10"></div>
+        <div class="item" data-expected-height="50" data-expected-width="40"></div>
+    </div>
+</div>
+
+</body>
Property changes on: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-columns-min-max-width.html
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: svn:mime-type

+text/html \ No newline at end of property

Added: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height-expected.txt (0 => 208531)


--- trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height-expected.txt	2016-11-10 10:08:19 UTC (rev 208531)
@@ -0,0 +1,17 @@
+This test PASS if all the grids in the same row look the same.
+
+PASS
+PASS
+PASS
+
+PASS
+PASS
+PASS
+
+PASS
+PASS
+PASS
+
+PASS
+PASS
+PASS
Property changes on: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height-expected.txt
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height.html (0 => 208531)


--- trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height.html	2016-11-10 10:08:19 UTC (rev 208531)
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML>
+<link href="" rel="stylesheet">
+<link href="" rel="stylesheet">
+<style>
+.grid {
+   margin: 3px;
+   grid: minmax(10px, 1fr) minmax(10px, 4fr) / 50px;
+   grid-row-gap: 33px;
+   border: 5px dashed;
+   padding: 2px;
+}
+
+.float { float: left; }
+
+.item:nth-child(1) { background-color: purple; }
+.item:nth-child(2) { background-color: blue; }
+</style>
+
+<script src=""
+<body _onload_="checkLayout('.grid')">
+<div id="log"></div>
+
+<p>This test PASS if all the grids in the same row look the same.</p>
+
+<div class="grid float" style="max-height: 70px" data-expected-width="64" data-expected-height="84">
+    <div class="item" data-expected-width="50" data-expected-height="10"></div>
+    <div class="item" data-expected-width="50" data-expected-height="27"></div>
+</div>
+<div class="grid float" style="min-height: 70px; max-height: 60px" data-expected-width="64" data-expected-height="84">
+    <div class="item" data-expected-width="50" data-expected-height="10"></div>
+    <div class="item" data-expected-width="50" data-expected-height="27"></div>
+</div>
+<div class="grid float" style="height: 70px" data-expected-width="64" data-expected-height="84">
+    <div class="item" data-expected-width="50" data-expected-height="10"></div>
+    <div class="item" data-expected-width="50" data-expected-height="27"></div>
+</div>
+
+<br clear="all">
+
+<div class="grid float" style="min-height: 108px" data-expected-width="64" data-expected-height="122">
+    <div class="item" data-expected-width="50" data-expected-height="15"></div>
+    <div class="item" data-expected-width="50" data-expected-height="60"></div>
+</div>
+<div class="grid float" style="min-height: 108px; max-height: 60px" data-expected-width="64" data-expected-height="122">
+    <div class="item" data-expected-width="50" data-expected-height="15"></div>
+    <div class="item" data-expected-width="50" data-expected-height="60"></div>
+</div>
+<div class="grid float" style="height: 108px" data-expected-width="64" data-expected-height="122">
+    <div class="item" data-expected-width="50" data-expected-height="15"></div>
+    <div class="item" data-expected-width="50" data-expected-height="60"></div>
+</div>
+
+<br clear="all">
+
+<div class="grid float min-height-max-content" data-expected-width="64" data-expected-height="97">
+    <div class="item" data-expected-width="50" data-expected-height="10"></div>
+    <div class="item" data-expected-width="50" data-expected-height="40"></div>
+</div>
+<div class="grid float min-height-max-content max-height-min-content" data-expected-width="64" data-expected-height="97">
+    <div class="item" data-expected-width="50" data-expected-height="10"></div>
+    <div class="item" data-expected-width="50" data-expected-height="40"></div>
+</div>
+<div class="grid float max-content" data-expected-width="64" data-expected-height="97">
+    <div class="item" data-expected-width="50" data-expected-height="10"></div>
+    <div class="item" data-expected-width="50" data-expected-height="40"></div>
+</div>
+
+<br clear="all">
+
+<div class="float min-content">
+    <div class="grid min-height-max-content" data-expected-width="64" data-expected-height="97">
+        <div class="item" data-expected-width="50" data-expected-height="10"></div>
+        <div class="item" data-expected-width="50" data-expected-height="40"></div>
+    </div>
+</div>
+<div class="float max-content">
+    <div class="grid min-height-max-content max-height-min-content" data-expected-width="64" data-expected-height="97">
+        <div class="item" data-expected-width="50" data-expected-height="10"></div>
+        <div class="item" data-expected-width="50" data-expected-height="40"></div>
+    </div>
+</div>
+<div class="float fit-content">
+    <div class="grid max-content" data-expected-width="64" data-expected-height="97">
+        <div class="item" data-expected-width="50" data-expected-height="10"></div>
+        <div class="item" data-expected-width="50" data-expected-height="40"></div>
+    </div>
+</div>
+
+</body>
Property changes on: trunk/LayoutTests/fast/css-grid-layout/flex-sizing-rows-min-max-height.html
___________________________________________________________________

Added: svn:eol-style

+LF \ No newline at end of property

Added: svn:mime-type

+text/html \ No newline at end of property

Modified: trunk/Source/WebCore/ChangeLog (208530 => 208531)


--- trunk/Source/WebCore/ChangeLog	2016-11-10 09:01:21 UTC (rev 208530)
+++ trunk/Source/WebCore/ChangeLog	2016-11-10 10:08:19 UTC (rev 208531)
@@ -1,3 +1,28 @@
+2016-11-08  Sergio Villar Senin  <svil...@igalia.com>
+
+        [css-grid] Fix fr tracks sizing under min|max-size constraints
+        https://bugs.webkit.org/show_bug.cgi?id=150674
+
+        Reviewed by Darin Adler.
+
+        The min|max-sizes must be used to compute the flex fraction for indefinite free
+        spaces. According to the spec "If using this flex fraction would cause the grid to be
+        smaller than the grid container’s min-width/height (or larger than the grid container’s
+        max-width/height), then redo this step, treating the free space as definite and the
+        available grid space as equal to the grid container’s content box size when it’s sized to
+        its min-width/height (max-width/height)."
+
+        This only affects indefinite heights because during layout both definite sizes and any kind
+        of widths are properly constrained by min|max-width restrictions.
+
+        Tests: fast/css-grid-layout/flex-sizing-columns-min-max-width.html
+               fast/css-grid-layout/flex-sizing-rows-min-max-height.html
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
+        (WebCore::RenderGrid::computeFlexSizedTracksGrowth):
+        * rendering/RenderGrid.h:
+
 2016-11-10  Alejandro G. Castro  <a...@igalia.com>
 
         [WebRTC] [OpenWebRTC] RTX default parameters broken after r207952

Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (208530 => 208531)


--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-11-10 09:01:21 UTC (rev 208530)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-11-10 10:08:19 UTC (rev 208531)
@@ -799,21 +799,59 @@
             }
         }
     }
+    LayoutUnit totalGrowth;
+    Vector<LayoutUnit> increments;
+    increments.grow(flexibleSizedTracksIndex.size());
+    computeFlexSizedTracksGrowth(direction, sizingData.sizingOperation, tracks, flexibleSizedTracksIndex, flexFraction, increments, totalGrowth);
 
-    for (auto trackIndex : flexibleSizedTracksIndex) {
-        const GridTrackSize& trackSize = gridTrackSize(direction, trackIndex, sizingData.sizingOperation);
-        GridTrack& track = tracks[trackIndex];
-        LayoutUnit oldBaseSize = track.baseSize();
-        LayoutUnit baseSize = std::max<LayoutUnit>(oldBaseSize, flexFraction * trackSize.maxTrackBreadth().flex());
-        if (LayoutUnit increment = baseSize - oldBaseSize) {
-            track.setBaseSize(baseSize);
-            freeSpace -= increment;
-            growthLimitsWithoutMaximization += increment;
+    // We only need to redo the flex fraction computation for indefinite heights (definite sizes are
+    // already constrained by min/max sizes). Regarding widths, they are always definite at layout
+    // time so we shouldn't ever have to do this.
+    if (!hasDefiniteFreeSpace && direction == ForRows) {
+        auto minSize = computeContentLogicalHeight(MinSize, style().logicalMinHeight(), LayoutUnit(-1));
+        auto maxSize = computeContentLogicalHeight(MaxSize, style().logicalMaxHeight(), LayoutUnit(-1));
+
+        // Redo the flex fraction computation using min|max-height as definite available space in
+        // case the total height is smaller than min-height or larger than max-height.
+        LayoutUnit rowsSize = totalGrowth + computeTrackBasedLogicalHeight(sizingData);
+        bool checkMinSize = minSize && rowsSize < minSize.value();
+        bool checkMaxSize = maxSize && rowsSize > maxSize.value();
+        if (checkMinSize || checkMaxSize) {
+            LayoutUnit constrainedFreeSpace = checkMaxSize ? maxSize.value() : LayoutUnit(-1);
+            constrainedFreeSpace = std::max(constrainedFreeSpace, minSize.value()) - guttersSize(ForRows, 0, gridRowCount());
+            flexFraction = findFlexFactorUnitSize(tracks, GridSpan::translatedDefiniteGridSpan(0, tracks.size()), ForRows, sizingData.sizingOperation, constrainedFreeSpace);
+
+            totalGrowth = LayoutUnit(0);
+            computeFlexSizedTracksGrowth(ForRows, sizingData.sizingOperation, tracks, flexibleSizedTracksIndex, flexFraction, increments, totalGrowth);
         }
     }
+
+    for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) {
+        if (LayoutUnit increment = increments[i]) {
+            auto& track = tracks[flexibleSizedTracksIndex[i]];
+            track.setBaseSize(track.baseSize() + increment);
+        }
+    }
+    freeSpace -= totalGrowth;
+    growthLimitsWithoutMaximization += totalGrowth;
     sizingData.setFreeSpace(direction, freeSpace);
 }
 
+void RenderGrid::computeFlexSizedTracksGrowth(GridTrackSizingDirection direction, SizingOperation sizingOperation, Vector<GridTrack>& tracks, const Vector<unsigned>& flexibleSizedTracksIndex, double flexFraction, Vector<LayoutUnit>& increments, LayoutUnit& totalGrowth) const
+{
+    size_t numFlexTracks = flexibleSizedTracksIndex.size();
+    ASSERT(increments.size() == numFlexTracks);
+    for (size_t i = 0; i < numFlexTracks; ++i) {
+        unsigned trackIndex = flexibleSizedTracksIndex[i];
+        auto trackSize = gridTrackSize(direction, trackIndex, sizingOperation);
+        ASSERT(trackSize.maxTrackBreadth().isFlex());
+        LayoutUnit oldBaseSize = tracks[trackIndex].baseSize();
+        LayoutUnit newBaseSize = std::max(oldBaseSize, LayoutUnit(flexFraction * trackSize.maxTrackBreadth().flex()));
+        increments[i] = newBaseSize - oldBaseSize;
+        totalGrowth += increments[i];
+    }
+}
+
 LayoutUnit RenderGrid::computeUsedBreadthOfMinLength(const GridTrackSize& trackSize, LayoutUnit maxSize) const
 {
     const GridLength& gridLength = trackSize.minTrackBreadth();

Modified: trunk/Source/WebCore/rendering/RenderGrid.h (208530 => 208531)


--- trunk/Source/WebCore/rendering/RenderGrid.h	2016-11-10 09:01:21 UTC (rev 208530)
+++ trunk/Source/WebCore/rendering/RenderGrid.h	2016-11-10 10:08:19 UTC (rev 208531)
@@ -84,6 +84,7 @@
     class GridSizingData;
     enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
     void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&, LayoutUnit& baseSizesWithoutMaximization, LayoutUnit& growthLimitsWithoutMaximization) const;
+    void computeFlexSizedTracksGrowth(GridTrackSizingDirection, SizingOperation, Vector<GridTrack>&, const Vector<unsigned>& flexibleSizedTracksIndex, double flexFraction, Vector<LayoutUnit>& increments, LayoutUnit& totalGrowth) const;
     LayoutUnit computeUsedBreadthOfMinLength(const GridTrackSize&, LayoutUnit maxSize) const;
     LayoutUnit computeUsedBreadthOfMaxLength(const GridTrackSize&, LayoutUnit usedBreadth, LayoutUnit maxSize) const;
     void resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection, GridSizingData&) const;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to