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;