No subject


Tue May 3 15:05:30 PDT 2016


one argument. That forced us to refactor some code because minmax() was the only allowed
function for <track-size>s so far.

The implementation key is a new attribute in GridTrack called growthLimitCap which is
precisely the single attribute of fit-content(). Some parts of the track sizing algorithm
were adapted to this change like for example the sorting of tracks by growth potential (we
need to consider the caps).

Tests: fast/css-grid-layout/fit-content-columns.html
fast/css-grid-layout/fit-content-rows.html

* css/CSSComputedStyleDeclaration.cpp:
(WebCore::specifiedValueForGridTrackSize): Added support for fit-content sizes.
* css/StyleBuilderConverter.h:
(WebCore::StyleBuilderConverter::createGridTrackSize): Added support for fit-content sizes.
* css/parser/CSSParser.cpp:
(WebCore::isGridTrackFixedSized): Added support for fit-content sizes.
(WebCore::CSSParser::parseGridTrackSize): Added support for parsing fit-content() functions.
* css/parser/CSSPropertyParser.cpp: Added support for parsing fit-content() functions so
it'll be available once we switch to the new parser.
* rendering/RenderGrid.cpp:
(WebCore::GridTrack::baseSize): Just return a LayoutUnit, the return value optimization will
keep it fast in any case.
(WebCore::GridTrack::growthLimit): Ditto.
(WebCore::GridTrack::setGrowthLimit): Added an ASSERT to check that the growth limit is
never higher than the cap.
(WebCore::GridTrack::infiniteGrowthPotential):
(WebCore::GridTrack::plannedSize): Just return a LayoutUnit, the return value optimization will
keep it fast in any case.
(WebCore::GridTrack::tempSize): Just return a LayoutUnit, the return value optimization will
keep it fast in any case.
(WebCore::GridTrack::setTempSize): Added as we no longer return a reference in tempSize().
(WebCore::GridTrack::growTempSize): New utility function which increases the tempSize.
(WebCore::GridTrack::setInfinitelyGrowable):
(WebCore::GridTrack::setGrowthLimitCap): Added.
(WebCore::GridTrack::growthLimitCap): Ditto.
(WebCore::GridTrack::growthLimitIsInfinite): Made private.
(WebCore::RenderGrid::GridSizingData::freeSpace): Renamed from freeSpaceForDirection.
(WebCore::RenderGrid::GridSizingData::availableSpace): We now cache the available space as
it is used to compute relative (percentage) sizes.
(WebCore::RenderGrid::GridSizingData::setAvailableSpace): Ditto.
(WebCore::RenderGrid::GridSizingData::setFreeSpace): Renamed from setFreeSpaceForDirection.
(WebCore::RenderGrid::computeTrackSizesForDirection): Receives the available space instead
of the free space.
(WebCore::RenderGrid::computeIntrinsicLogicalWidths): Properly initialize free and available
spaces.
(WebCore::RenderGrid::computeIntrinsicLogicalHeight): Ditto.
(WebCore::RenderGrid::computeUsedBreadthOfGridTracks): Use available space to initialize the
track sizes. Also use sizingOperation to decide whether or not sizes are indefinite. Last
but not least, added support for fit-content tracks.
(WebCore::RenderGrid::computeUsedBreadthOfMinLength): Pass a GridTrackSize instead of a GridLength.
(WebCore::RenderGrid::computeUsedBreadthOfMaxLength): Ditto.
(WebCore::RenderGrid::gridTrackSize): Added support for fit-content.
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions): Ditto.
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems): Ditto.
(WebCore::trackSizeForTrackSizeComputationPhase):
(WebCore::sortByGridTrackGrowthPotential): Reworked the function so it properly sorts tracks
with growth limit caps to support fit-content().
(WebCore::clampGrowthShareIfNeeded): Clamps the given growthShare passed as argument to the
track growth limit cap.
(WebCore::RenderGrid::distributeSpaceToTracks): Use the new setTempSize() method. Also sort
the selected tracks to grow over growth limits in order to respect the track caps eventually
set by fit-content (otherwise those tracks could indefinitely grow over the specified value).
(WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth): Use the new defined functions.
(WebCore::RenderGrid::applyStretchAlignmentToTracksIfNeeded): Use freeSpace().
(WebCore::RenderGrid::populateGridPositionsForDirection): Ditto.
(WebCore::GridTrack::infinitelyGrowable): Deleted.
(WebCore::RenderGrid::GridSizingData::freeSpaceForDirection): Deleted.
(WebCore::RenderGrid::GridSizingData::setFreeSpaceForDirection): Deleted.
(WebCore::RenderGrid::trackSizeForTrackSizeComputationPhase): Deleted.
* rendering/RenderGrid.h: Changed the signature of some methods. Moved
TrackSizeComputationPhase out of the RenderGrid class.
* rendering/style/GridTrackSize.h:
(WebCore::GridTrackSize::GridTrackSize): Added some extra documentation. Added a new
attribute to the constructor to support fit-content GridTrackSizes.
(WebCore::GridTrackSize::fitContentTrackBreadth): New method which returns the growth limit
cap set by fit-content().
(WebCore::GridTrackSize::minTrackBreadth):
(WebCore::GridTrackSize::isFitContent): Added.
(WebCore::GridTrackSize::length): Deleted.
(WebCore::GridTrackSize::isPercentage): Deleted.

LayoutTests:

New tests to verify that fit-content track sizes work as expected for columns and for
rows. Also added some more test cases to verify that we properly parse fit-content().

* fast/css-grid-layout/fit-content-columns-expected.html: Added.
* fast/css-grid-layout/fit-content-columns.html: Added.
* fast/css-grid-layout/fit-content-rows-expected.html: Added.
* fast/css-grid-layout/fit-content-rows.html: Added.
* fast/css-grid-layout/grid-auto-columns-rows-get-set-expected.txt:
* fast/css-grid-layout/grid-auto-columns-rows-get-set.html:
* fast/css-grid-layout/grid-columns-rows-get-set-expected.txt:
* fast/css-grid-layout/grid-columns-rows-get-set.html:
* fast/css-grid-layout/resources/grid-columns-rows-get-set.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutgridautocolumnsrowsgetsetexpectedtxt">trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutgridautocolumnsrowsgetsethtml">trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set.html</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutgridcolumnsrowsgetsetexpectedtxt">trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutgridcolumnsrowsgetsethtml">trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutresourcesgridcolumnsrowsgetsetjs">trunk/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSComputedStyleDeclarationcpp">trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp</a></li>
<li><a href="#trunkSourceWebCorecssStyleBuilderConverterh">trunk/Source/WebCore/css/StyleBuilderConverter.h</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSParsercpp">trunk/Source/WebCore/css/parser/CSSParser.cpp</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSPropertyParsercpp">trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderGridcpp">trunk/Source/WebCore/rendering/RenderGrid.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderGridh">trunk/Source/WebCore/rendering/RenderGrid.h</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleGridTrackSizeh">trunk/Source/WebCore/rendering/style/GridTrackSize.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastcssgridlayoutfitcontentcolumnsexpectedhtml">trunk/LayoutTests/fast/css-grid-layout/fit-content-columns-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutfitcontentcolumnshtml">trunk/LayoutTests/fast/css-grid-layout/fit-content-columns.html</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutfitcontentrowsexpectedhtml">trunk/LayoutTests/fast/css-grid-layout/fit-content-rows-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastcssgridlayoutfitcontentrowshtml">trunk/LayoutTests/fast/css-grid-layout/fit-content-rows.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/LayoutTests/ChangeLog	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-09-07  Sergio Villar Senin  &lt;svillar at igalia.com&gt;
+
+        [css-grid] Implement fit-content track size
+        https://bugs.webkit.org/show_bug.cgi?id=161379
+
+        Reviewed by Manuel Rego Casasnovas.
+
+        New tests to verify that fit-content track sizes work as expected for columns and for
+        rows. Also added some more test cases to verify that we properly parse fit-content().
+
+        * fast/css-grid-layout/fit-content-columns-expected.html: Added.
+        * fast/css-grid-layout/fit-content-columns.html: Added.
+        * fast/css-grid-layout/fit-content-rows-expected.html: Added.
+        * fast/css-grid-layout/fit-content-rows.html: Added.
+        * fast/css-grid-layout/grid-auto-columns-rows-get-set-expected.txt:
+        * fast/css-grid-layout/grid-auto-columns-rows-get-set.html:
+        * fast/css-grid-layout/grid-columns-rows-get-set-expected.txt:
+        * fast/css-grid-layout/grid-columns-rows-get-set.html:
+        * fast/css-grid-layout/resources/grid-columns-rows-get-set.js:
+
</ins><span class="cx"> 2016-09-15  Alejandro G. Castro  &lt;alex at igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebRTC][OpenWebRTC] crash in maybeHandleChangeMutedState
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssgridlayoutfitcontentcolumnsexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css-grid-layout/fit-content-columns-expected.html (0 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/fit-content-columns-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/fit-content-columns-expected.html	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -0,0 +1,346 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;link href=&quot;resources/grid.css&quot; rel=&quot;stylesheet&quot;&gt;
+&lt;style&gt;
+.grid {
+    justify-content: start;
+    width: 100px;
+    position: relative;
+    padding-top: 10px;
+    margin-bottom: 5px;
+    grid-column-gap: 5px;
+}
+
+.fc0 { grid-template-columns: minmax(auto, 0px);}
+.fc40 { grid-template-columns: minmax(auto, 40px); }
+.fc80 { grid-template-columns: minmax(auto, 80px); }
+.fc110 { grid-template-columns: auto; }
+
+.fc0x2 { grid-template-columns: repeat(2, minmax(auto, 0px));}
+.fc40x2 { grid-template-columns: repeat(2, minmax(auto, 40px)); }
+.fc80x2 { grid-template-columns: repeat(2, minmax(auto, 80px)); }
+.fc110x2 { grid-template-columns: auto auto; }
+
+.fc0p { grid-template-columns: minmax(auto, 0%); }
+.fc30p { grid-template-columns: minmax(auto, 30%); }
+.fc90p { grid-template-columns: minmax(auto, 90%); }
+.fc110p { grid-template-columns: auto; }
+
+.fc0px2 { grid-template-columns: repeat(2, minmax(auto, 0%)); }
+.fc30px2 { grid-template-columns: repeat(2, minmax(auto, 30%)); }
+.fc90px2 { grid-template-columns: repeat(2, minmax(auto, 90%)); }
+.fc110px2 { grid-template-columns: auto auto; }
+
+.item {
+    font: 10px/1 Ahem;
+    background: cyan;
+}
+
+.spanningItem {
+    font: 10px/1 Ahem;
+    grid-column: 1 / -1;
+    grid-row: 2;
+    background: salmon;
+}
+
+.test {
+    position: absolute;
+    left: 0; right: 0; top: 0;
+    height: 5px;
+    background: purple;
+}
+.test:nth-child(2n) { background: orange; }
+
+.floatLeft {
+    float: left;
+    width: 190px;
+}
+
+h3 { font-size: 1em; }
+&lt;/style&gt;
+
+&lt;p&gt;This test checks that 'fit-content()' works as expected, i.e., it's similar to 'auto' ('minmax(auto, -webkit-max-content)') except that the growth limit is clamped at the argument of 'fit-content' (if greater that the 'auto' minimum).&lt;/p&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;Only fit-content() and with fixed size tracks.&lt;/h3&gt;
+    &lt;div class=&quot;grid fc0&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc0x2&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc40&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto auto;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(auto, 40px) auto;&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc80&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc80x2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto minmax(auto, 80px)&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(auto, 20px) 50%;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(10px, 40px) minmax(auto, 40px);&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto minmax(10%, 200px);&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+&lt;/div&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;fit-content() with other content-sized tracks.&lt;/h3&gt;
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(auto, 40px) -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(auto, 40px) -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(auto, 40px) -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content minmax(auto, 40px);&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content minmax(auto, 40px);&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content minmax(auto, 40px);&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(auto, 30px) -webkit-min-content -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content minmax(auto, 30px) -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content -webkit-max-content minmax(auto, 30px)&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(auto, 30px) -webkit-min-content -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;item&quot; style=&quot;grid-column: 1&quot;&gt;XXX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content minmax(auto, 30px) -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;item&quot; style=&quot;grid-column: 1&quot;&gt;XXX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content -webkit-max-content minmax(auto, 30px)&quot;&gt;
+        &lt;div class=&quot;item&quot; style=&quot;grid-column: 2&quot;&gt;XXX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;fit-content() with percentage arguments.&lt;/h3&gt;
+    &lt;div class=&quot;grid fc0p&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc0px2&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc30p&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XX XX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc30px2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc30px2&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;X X X&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc90p&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc90px2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto minmax(auto, 90%)&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;-webkit-max-content &lt; fit-content() argument.&lt;/h3&gt;
+
+    &lt;div class=&quot;grid fc110&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc110x2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc110x2&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto auto;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto auto;&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-max-content auto;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto -webkit-min-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-max-content auto -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content auto -webkit-min-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto auto auto;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+&lt;/div&gt;
</ins><span class="cx">Property changes on: trunk/LayoutTests/fast/css-grid-layout/fit-content-columns-expected.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsfastcssgridlayoutfitcontentcolumnshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css-grid-layout/fit-content-columns.html (0 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/fit-content-columns.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/fit-content-columns.html	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -0,0 +1,347 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;link href=&quot;resources/grid.css&quot; rel=&quot;stylesheet&quot;&gt;
+&lt;style&gt;
+.grid {
+    justify-content: start;
+    width: 100px;
+    position: relative;
+    padding-top: 10px;
+    margin-bottom: 5px;
+    grid-column-gap: 5px;
+}
+
+.fc0 { grid-template-columns: fit-content(0px);}
+.fc40 { grid-template-columns: fit-content(40px); }
+.fc80 { grid-template-columns: fit-content(80px); }
+.fc110 { grid-template-columns: fit-content(110px); }
+
+.fc0x2 { grid-template-columns: repeat(2, fit-content(0px));}
+.fc40x2 { grid-template-columns: repeat(2, fit-content(40px)); }
+.fc80x2 { grid-template-columns: repeat(2, fit-content(80px)); }
+.fc110x2 { grid-template-columns: repeat(2, fit-content(110px)); }
+
+.fc0p { grid-template-columns: fit-content(0%); }
+.fc30p { grid-template-columns: fit-content(30%); }
+.fc90p { grid-template-columns: fit-content(90%); }
+.fc110p { grid-template-columns: fit-content(110%); }
+
+.fc0px2 { grid-template-columns: repeat(2, fit-content(0%)); }
+.fc30px2 { grid-template-columns: repeat(2, fit-content(30%)); }
+.fc90px2 { grid-template-columns: repeat(2, fit-content(90%)); }
+.fc110px2 { grid-template-columns: repeat(2, fit-content(110%)); }
+
+.item {
+    font: 10px/1 Ahem;
+    background: cyan;
+}
+
+.spanningItem {
+    font: 10px/1 Ahem;
+    grid-column: 1 / -1;
+    grid-row: 2;
+    background: salmon;
+}
+
+.test {
+    position: absolute;
+    left: 0; right: 0; top: 0;
+    height: 5px;
+    background: purple;
+}
+.test:nth-child(2n) { background: orange; }
+
+.floatLeft {
+    float: left;
+    width: 190px;
+}
+
+h3 { font-size: 1em; }
+
+&lt;/style&gt;
+
+&lt;p&gt;This test checks that 'fit-content()' works as expected, i.e., it's similar to 'auto' ('minmax(auto, -webkit-max-content)') except that the growth limit is clamped at the argument of 'fit-content' (if greater that the 'auto' minimum).&lt;/p&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;Only fit-content() and with fixed size tracks.&lt;/h3&gt;
+    &lt;div class=&quot;grid fc0&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc0x2&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc40&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc40x2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc40x2&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc80&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc80x2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc80x2&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(20px) 50%;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: minmax(10px, 40px) fit-content(40px);&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(40px) minmax(10%, 200px);&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+&lt;/div&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;fit-content() with other content-sized tracks.&lt;/h3&gt;
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(40px) -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(40px) -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(40px) -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content fit-content(40px);&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content fit-content(40px);&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content fit-content(40px);&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXXXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(30px) -webkit-min-content -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content fit-content(30px) -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content -webkit-max-content fit-content(30px)&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(30px) -webkit-min-content -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;item&quot; style=&quot;grid-column: 1&quot;&gt;XXX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content fit-content(30px) -webkit-max-content&quot;&gt;
+        &lt;div class=&quot;item&quot; style=&quot;grid-column: 1&quot;&gt;XXX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content -webkit-max-content fit-content(30px)&quot;&gt;
+        &lt;div class=&quot;item&quot; style=&quot;grid-column: 2&quot;&gt;XXX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;fit-content() with percentage arguments.&lt;/h3&gt;
+    &lt;div class=&quot;grid fc0p&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc0px2&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc30p&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XX XX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc30px2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc30px2&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;X X X&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc90p&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc90px2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc90px2&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;floatLeft&quot;&gt;
+    &lt;h3&gt;-webkit-max-content &lt; fit-content() argument.&lt;/h3&gt;
+
+    &lt;div class=&quot;grid fc110&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc110x2&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid fc110x2&quot;&gt;
+        &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(110px) fit-content(40px);&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(110px) fit-content(40px);&quot;&gt;
+        &lt;div class=&quot;item autoRowSecondColumn&quot;&gt;XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-max-content fit-content(110px);&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: fit-content(110px) -webkit-min-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-max-content fit-content(110px) -webkit-max-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: -webkit-min-content fit-content(110px) -webkit-min-content;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;grid&quot; style=&quot;grid-template-columns: auto fit-content(110px) auto;&quot;&gt;
+        &lt;div class=&quot;spanningItem&quot; style=&quot;grid-row: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+        &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+        &lt;div class=&quot;test autoRowFirstColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowSecondColumn&quot;&gt;&lt;/div&gt;
+        &lt;div class=&quot;test autoRowThirdColumn&quot;&gt;&lt;/div&gt;
+    &lt;/div&gt;
+
+&lt;/div&gt;
</ins><span class="cx">Property changes on: trunk/LayoutTests/fast/css-grid-layout/fit-content-columns.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsfastcssgridlayoutfitcontentrowsexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css-grid-layout/fit-content-rows-expected.html (0 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/fit-content-rows-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/fit-content-rows-expected.html	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -0,0 +1,343 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;link href=&quot;resources/grid.css&quot; rel=&quot;stylesheet&quot;&gt;
+&lt;style&gt;
+.grid {
+    justify-content: start;
+    align-content: start;
+    height: 100px;
+    width: 40px;
+    position: relative;
+    padding-left: 10px;
+    margin-right: 5px;
+    grid-row-gap: 5px;
+    float: left;
+}
+
+.fc0 { grid-template-rows: minmax(auto, 0px);}
+.fc40 { grid-template-rows: minmax(auto, 40px); }
+.fc80 { grid-template-rows: minmax(auto, 80px); }
+.fc110 { grid-template-rows: auto; }
+
+.fc0x2 { grid-template-rows: repeat(2, minmax(auto, 0px));}
+.fc40x2 { grid-template-rows: repeat(2, minmax(auto, 40px)); }
+.fc80x2 { grid-template-rows: repeat(2, minmax(auto, 80px)); }
+.fc110x2 { grid-template-rows: auto auto; }
+
+.fc0p { grid-template-rows: minmax(auto, 0%); }
+.fc30p { grid-template-rows: minmax(auto, 30px); }
+.fc90p { grid-template-rows: minmax(auto, 90px); }
+.fc110p { grid-template-rows: auto; }
+
+.fc0px2 { grid-template-rows: repeat(2, minmax(auto, 0%)); }
+.fc30px2 { grid-template-rows: repeat(2, minmax(auto, 30px)); }
+.fc90px2 { grid-template-rows: repeat(2, minmax(auto, 90px)); }
+.fc110px2 { grid-template-rows: auto auto; }
+
+.item {
+    font: 10px/1 Ahem;
+    background: cyan;
+}
+
+.spanningItem {
+    font: 10px/1 Ahem;
+    grid-row: 1 / -1;
+    grid-column: 2;
+    background: salmon;
+}
+
+.test {
+    position: absolute;
+    left: 0; top: 0; bottom: 0;
+    width: 5px;
+    background: purple;
+}
+.test:nth-child(2n) { background: orange; }
+
+.firstRow { grid-row: 1 / 2; }
+.secondRow { grid-row: 2 / 3; }
+.thirdRow { grid-row: 3 / 4; }
+
+div.grid &gt; div { -webkit-writing-mode: vertical-lr; }
+
+&lt;/style&gt;
+
+&lt;p&gt;This test checks that 'fit-content()' works as expected, i.e., it's similar to 'auto' ('minmax(auto, -webkit-max-content)') except that the growth limit is clamped at the argument of 'fit-content' (if greater that the 'auto' minimum).&lt;/p&gt;
+
+&lt;div class=&quot;grid fc0&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc0x2&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc40&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto auto;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(auto, 40px) auto;&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc80&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc80x2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto minmax(auto, 80px)&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(auto, 20px) 50%;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(10px, 40px) minmax(auto, 40px);&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto minmax(10%, 200px);&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;br clear=&quot;all&quot;&gt;
+&lt;br clear=&quot;all&quot;&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(auto, 40px) -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(auto, 40px) -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(auto, 40px) -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content minmax(auto, 40px);&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content minmax(auto, 40px);&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content minmax(auto, 40px);&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(auto, 30px) -webkit-min-content -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content minmax(auto, 30px) -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content -webkit-max-content minmax(auto, 30px)&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(auto, 30px) -webkit-min-content -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;item&quot; style=&quot;grid-row: 1&quot;&gt;XXX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content minmax(auto, 30px) -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;item&quot; style=&quot;grid-row: 1&quot;&gt;XXX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content -webkit-max-content minmax(auto, 30px)&quot;&gt;
+    &lt;div class=&quot;item&quot; style=&quot;grid-row: 2&quot;&gt;XXX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;br clear=&quot;all&quot;&gt;
+&lt;br clear=&quot;all&quot;&gt;
+
+&lt;div class=&quot;grid fc0p&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc0px2&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc30p&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XX XX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc30px2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc30px2&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;X X X&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc90p&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc90px2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto minmax(auto, 90px)&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;br clear=&quot;all&quot;&gt;
+&lt;br clear=&quot;all&quot;&gt;
+
+&lt;div class=&quot;grid fc110&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc110x2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc110x2&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto auto;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto auto;&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-max-content auto;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto -webkit-min-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-max-content auto -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content auto -webkit-min-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto auto auto;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
</ins><span class="cx">Property changes on: trunk/LayoutTests/fast/css-grid-layout/fit-content-rows-expected.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsfastcssgridlayoutfitcontentrowshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/css-grid-layout/fit-content-rows.html (0 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/fit-content-rows.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/fit-content-rows.html	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -0,0 +1,347 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;link href=&quot;resources/grid.css&quot; rel=&quot;stylesheet&quot;&gt;
+&lt;style&gt;
+.grid {
+    justify-content: start;
+    align-content: start;
+    height: 100px;
+    width: 40px;
+    position: relative;
+    padding-left: 10px;
+    margin-right: 5px;
+    grid-row-gap: 5px;
+    float: left;
+}
+
+.fc0 { grid-template-rows: fit-content(0px);}
+.fc40 { grid-template-rows: fit-content(40px); }
+.fc80 { grid-template-rows: fit-content(80px); }
+.fc110 { grid-template-rows: fit-content(110px); }
+
+.fc0x2 { grid-template-rows: repeat(2, fit-content(0px));}
+.fc40x2 { grid-template-rows: repeat(2, fit-content(40px)); }
+.fc80x2 { grid-template-rows: repeat(2, fit-content(80px)); }
+.fc110x2 { grid-template-rows: repeat(2, fit-content(110px)); }
+
+.fc0p { grid-template-rows: fit-content(0%); }
+.fc30p { grid-template-rows: fit-content(30%); }
+.fc90p { grid-template-rows: fit-content(90%); }
+.fc110p { grid-template-rows: fit-content(110%); }
+
+.fc0px2 { grid-template-rows: repeat(2, fit-content(0%)); }
+.fc30px2 { grid-template-rows: repeat(2, fit-content(30%)); }
+.fc90px2 { grid-template-rows: repeat(2, fit-content(90%)); }
+.fc110px2 { grid-template-rows: repeat(2, fit-content(110%)); }
+
+div.grid &gt; div { -webkit-writing-mode: vertical-lr; }
+
+.item {
+    font: 10px/1 Ahem;
+    background: cyan;
+}
+
+.spanningItem {
+    font: 10px/1 Ahem;
+    grid-row: 1 / -1;
+    grid-column: 2;
+    background: salmon;
+}
+
+.test {
+    position: absolute;
+    left: 0; bottom: 0; top: 0;
+    width: 5px;
+    background: purple;
+}
+.test:nth-child(2n) { background: orange; }
+
+.firstRow { grid-row: 1 / 2; }
+.secondRow { grid-row: 2 / 3; }
+.thirdRow { grid-row: 3 / 4; }
+
+h3 { font-size: 1em; }
+.container { float: left; height: 110px;}
+
+&lt;/style&gt;
+
+&lt;p&gt;This test checks that 'fit-content()' works as expected, i.e., it's similar to 'auto' ('minmax(auto, -webkit-max-content)') except that the growth limit is clamped at the argument of 'fit-content' (if greater that the 'auto' minimum).&lt;/p&gt;
+
+&lt;div class=&quot;grid fc0&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc0x2&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc40&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc40x2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc40x2&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc80&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc80x2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc80x2&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(20px) 50%;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: minmax(10px, 40px) fit-content(40px);&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(40px) minmax(10%, 200px);&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;br clear =&quot;all&quot;&gt;
+&lt;br clear =&quot;all&quot;&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(40px) -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(40px) -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(40px) -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content fit-content(40px);&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content fit-content(40px);&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content fit-content(40px);&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXXXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(30px) -webkit-min-content -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content fit-content(30px) -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content -webkit-max-content fit-content(30px)&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(30px) -webkit-min-content -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;item&quot; style=&quot;grid-row: 1&quot;&gt;XXX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content fit-content(30px) -webkit-max-content&quot;&gt;
+    &lt;div class=&quot;item&quot; style=&quot;grid-row: 1&quot;&gt;XXX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content -webkit-max-content fit-content(30px)&quot;&gt;
+    &lt;div class=&quot;item&quot; style=&quot;grid-row: 2&quot;&gt;XXX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;br clear=&quot;all&quot;&gt;
+&lt;br clear=&quot;all&quot;&gt;
+
+&lt;div class=&quot;grid fc0p&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc0px2&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc30p&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XX XX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc30px2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc30px2&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;X X X&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc90p&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc90px2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc90px2&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;br clear=&quot;all&quot;&gt;
+&lt;br clear=&quot;all&quot;&gt;
+
+&lt;div class=&quot;grid fc110&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc110x2&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid fc110x2&quot;&gt;
+    &lt;div class=&quot;item&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(110px) fit-content(40px);&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(110px) fit-content(40px);&quot;&gt;
+    &lt;div class=&quot;item secondRow&quot;&gt;XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-max-content fit-content(110px);&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: fit-content(110px) -webkit-min-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-max-content fit-content(110px) -webkit-max-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: -webkit-min-content fit-content(110px) -webkit-min-content;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
+
+&lt;div class=&quot;grid&quot; style=&quot;grid-template-rows: auto fit-content(110px) auto;&quot;&gt;
+    &lt;div class=&quot;spanningItem&quot; style=&quot;grid-column: 1;&quot;&gt;XX XX XX XX&lt;/div&gt;
+    &lt;div class=&quot;spanningItem&quot;&gt;XXX XXX&lt;/div&gt;
+    &lt;div class=&quot;test firstRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test secondRow&quot;&gt;&lt;/div&gt;
+    &lt;div class=&quot;test thirdRow&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
</ins><span class="cx">Property changes on: trunk/LayoutTests/fast/css-grid-layout/fit-content-rows.html
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4>Added: svn:eol-style</h4></div>
<ins>+LF
</ins><span class="cx">\ No newline at end of property
</span><a id="svnmimetype"></a>
<div class="addfile"><h4>Added: svn:mime-type</h4></div>
<ins>+text/html
</ins><span class="cx">\ No newline at end of property
</span><a id="trunkLayoutTestsfastcssgridlayoutgridautocolumnsrowsgetsetexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set-expected.txt (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set-expected.txt	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set-expected.txt	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -12,6 +12,8 @@
</span><span class="cx"> PASS window.getComputedStyle(gridAutoMinMaxContent, '').getPropertyValue('grid-auto-columns') is &quot;-webkit-max-content&quot;
</span><span class="cx"> PASS window.getComputedStyle(gridAutoAutoInMinMax, '').getPropertyValue('grid-auto-rows') is &quot;minmax(auto, 48px)&quot;
</span><span class="cx"> PASS window.getComputedStyle(gridAutoAutoInMinMax, '').getPropertyValue('grid-auto-columns') is &quot;minmax(80px, auto)&quot;
</span><ins>+PASS window.getComputedStyle(gridAutoFitContent, '').getPropertyValue('grid-auto-rows') is &quot;fit-content(50%)&quot;
+PASS window.getComputedStyle(gridAutoFitContent, '').getPropertyValue('grid-auto-columns') is &quot;fit-content(30px)&quot;
</ins><span class="cx"> 
</span><span class="cx"> Test that getting grid-template-columns and grid-template-rows set through CSS lists every track listed whether implicitly or explicitly created
</span><span class="cx"> PASS window.getComputedStyle(gridAutoFixedFixedWithChildren, '').getPropertyValue('grid-auto-rows') is &quot;30px&quot;
</span><span class="lines">@@ -48,6 +50,8 @@
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-rows') is &quot;minmax(-webkit-max-content, -webkit-min-content)&quot;
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-columns') is &quot;minmax(-webkit-min-content, 10px) 48px 5%&quot;
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-rows') is &quot;auto 30px minmax(10%, 60%)&quot;
</span><ins>+PASS getComputedStyle(element, '').getPropertyValue('grid-auto-columns') is &quot;fit-content(10px) fit-content(30%)&quot;
+PASS getComputedStyle(element, '').getPropertyValue('grid-auto-rows') is &quot;fit-content(5%) fit-content(40px)&quot;
</ins><span class="cx"> 
</span><span class="cx"> Test setting grid-auto-columns and grid-auto-rows to bad minmax value through JS
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-columns') is &quot;auto&quot;
</span><span class="lines">@@ -62,6 +66,8 @@
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-rows') is &quot;auto&quot;
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-columns') is &quot;auto&quot;
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-rows') is &quot;auto&quot;
</span><ins>+PASS getComputedStyle(element, '').getPropertyValue('grid-auto-columns') is &quot;auto&quot;
+PASS getComputedStyle(element, '').getPropertyValue('grid-auto-rows') is &quot;auto&quot;
</ins><span class="cx"> 
</span><span class="cx"> Test setting grid-auto-columns and grid-auto-rows to 'inherit' through JS
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-auto-columns') is '50px'
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssgridlayoutgridautocolumnsrowsgetsethtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set.html (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set.html	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set.html	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -38,6 +38,12 @@
</span><span class="cx">     grid-auto-columns: 25px 50px 100px;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+.gridAutoFitContent {
+    height: 50px;
+    grid-auto-columns: fit-content(30px);
+    grid-auto-rows: fit-content(50%);
+}
+
</ins><span class="cx"> &lt;/style&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;resources/grid-definitions-parsing-utils.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -66,6 +72,7 @@
</span><span class="cx">     &lt;div style=&quot;grid-column: -4; grid-row: -4&quot;&gt;&lt;/div&gt;
</span><span class="cx">     &lt;div style=&quot;grid-column: -5; grid-row: -5&quot;&gt;&lt;/div&gt;
</span><span class="cx"> &lt;/div&gt;
</span><ins>+&lt;div class=&quot;grid gridAutoFitContent&quot; id=&quot;gridAutoFitContent&quot;&gt;&lt;/div&gt;
</ins><span class="cx"> 
</span><span class="cx"> &lt;script&gt;
</span><span class="cx"> description('Test that setting and getting grid-auto-columns and grid-auto-rows works as expected');
</span><span class="lines">@@ -75,6 +82,7 @@
</span><span class="cx"> testGridAutoDefinitionsValues(document.getElementById(&quot;gridAutoMinMax&quot;), &quot;minmax(10%, 15px)&quot;, &quot;minmax(30%, 100px)&quot;);
</span><span class="cx"> testGridAutoDefinitionsValues(document.getElementById(&quot;gridAutoMinMaxContent&quot;), &quot;-webkit-min-content&quot;, &quot;-webkit-max-content&quot;);
</span><span class="cx"> testGridAutoDefinitionsValues(document.getElementById(&quot;gridAutoAutoInMinMax&quot;), &quot;minmax(auto, 48px)&quot;, &quot;minmax(80px, auto)&quot;);
</span><ins>+testGridAutoDefinitionsValues(document.getElementById(&quot;gridAutoFitContent&quot;), &quot;fit-content(50%)&quot;, &quot;fit-content(30px)&quot;);
</ins><span class="cx"> 
</span><span class="cx"> debug(&quot;&quot;);
</span><span class="cx"> debug(&quot;Test that getting grid-template-columns and grid-template-rows set through CSS lists every track listed whether implicitly or explicitly created&quot;);
</span><span class="lines">@@ -114,6 +122,7 @@
</span><span class="cx"> testAutoValues(&quot;minmax(-webkit-min-content, 8vh)&quot;, &quot;minmax(10vw, -webkit-min-content)&quot;, &quot;minmax(-webkit-min-content, 48px)&quot;, &quot;minmax(80px, -webkit-min-content)&quot;);
</span><span class="cx"> testAutoValues(&quot;minmax(-webkit-min-content, -webkit-max-content)&quot;, &quot;minmax(-webkit-max-content, -webkit-min-content)&quot;);
</span><span class="cx"> testAutoValues(&quot;minmax(-webkit-min-content, 10px) 48px 5%&quot;, &quot;auto 30px minmax(10%, 60%)&quot;);
</span><ins>+testAutoValues(&quot;fit-content(10px) fit-content(30%)&quot;, &quot;fit-content(5%) fit-content(calc(20px + 2em))&quot;, &quot;fit-content(10px) fit-content(30%)&quot;, &quot;fit-content(5%) fit-content(40px)&quot;);
</ins><span class="cx"> 
</span><span class="cx"> debug(&quot;&quot;);
</span><span class="cx"> debug(&quot;Test setting grid-auto-columns and grid-auto-rows to bad minmax value through JS&quot;);
</span><span class="lines">@@ -123,6 +132,7 @@
</span><span class="cx"> testAutoValues(&quot;none&quot;, &quot;none&quot;, &quot;auto&quot;, &quot;auto&quot;);
</span><span class="cx"> testAutoValues(&quot;10px [a] 20px&quot;, &quot;[z] auto [y] -webkit-min-content&quot;, &quot;auto&quot;, &quot;auto&quot;);
</span><span class="cx"> testAutoValues(&quot;repeat(2, 10px [a] 20px)&quot;, &quot;[z] repeat(auto-fit, 100px)&quot;, &quot;auto&quot;, &quot;auto&quot;);
</span><ins>+testAutoValues(&quot;fit-content(min-content) fit-content(auto)&quot;, &quot;fit-content(fit-content(3%)) fit-content(minmax(2px, 30px))&quot;, &quot;auto&quot;, &quot;auto&quot;);
</ins><span class="cx"> 
</span><span class="cx"> function testInherit()
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssgridlayoutgridcolumnsrowsgetsetexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -44,6 +44,8 @@
</span><span class="cx"> PASS window.getComputedStyle(gridWithCalcComplexInsideMinMaxElement, '').getPropertyValue('grid-template-rows') is &quot;300px&quot;
</span><span class="cx"> PASS window.getComputedStyle(gridWithAutoInsideMinMaxElement, '').getPropertyValue('grid-template-columns') is &quot;20px&quot;
</span><span class="cx"> PASS window.getComputedStyle(gridWithAutoInsideMinMaxElement, '').getPropertyValue('grid-template-rows') is &quot;11px&quot;
</span><ins>+PASS window.getComputedStyle(gridWithFitContentFunctionElement, '').getPropertyValue('grid-template-columns') is &quot;7px&quot;
+PASS window.getComputedStyle(gridWithFitContentFunctionElement, '').getPropertyValue('grid-template-rows') is &quot;11px&quot;
</ins><span class="cx"> 
</span><span class="cx"> Test getting wrong values for grid-template-columns and grid-template-rows through CSS (they should resolve to the default: 'none')
</span><span class="cx"> PASS window.getComputedStyle(gridWithFitContentElement, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
</span><span class="lines">@@ -80,6 +82,10 @@
</span><span class="cx"> PASS element.style.gridTemplateColumns is &quot;-webkit-max-content&quot;
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;0px&quot;
</span><span class="cx"> PASS element.style.gridTemplateRows is &quot;-webkit-max-content&quot;
</span><ins>+PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;0px&quot;
+PASS element.style.gridTemplateColumns is &quot;fit-content(100px)&quot;
+PASS getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;0px&quot;
+PASS element.style.gridTemplateRows is &quot;fit-content(25%)&quot;
</ins><span class="cx"> 
</span><span class="cx"> Test getting and setting grid-template-columns and grid-template-rows to minmax() values through JS
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;440px&quot;
</span><span class="lines">@@ -166,6 +172,22 @@
</span><span class="cx"> PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
</span><span class="cx"> PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
</span><span class="cx"> PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
</span><ins>+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;none&quot;
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is &quot;none&quot;
</ins><span class="cx"> 
</span><span class="cx"> Test setting grid-template-columns and grid-template-rows back to 'none' through JS
</span><span class="cx"> PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is &quot;18px&quot;
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssgridlayoutgridcolumnsrowsgetsethtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -91,6 +91,10 @@
</span><span class="cx">     grid-template-columns: minmax(auto, 20px);
</span><span class="cx">     grid-template-rows: minmax(max-content, auto);
</span><span class="cx"> }
</span><ins>+.gridWithFitContentFunction {
+    grid-template-columns: fit-content(30%);
+    grid-template-rows: fit-content(20px):
+}
</ins><span class="cx"> &lt;/style&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;/head&gt;
</span><span class="lines">@@ -130,6 +134,9 @@
</span><span class="cx"> &lt;div class=&quot;grid definite gridWithAutoInsideMinMax contentStart&quot; id=&quot;gridWithAutoInsideMinMaxElement&quot;&gt;
</span><span class="cx">     &lt;div class=&quot;gridItem&quot;&gt;&lt;/div&gt;
</span><span class="cx"> &lt;/div&gt;
</span><ins>+&lt;div class=&quot;grid definite gridWithFitContentFunction contentStart&quot; id=&quot;gridWithFitContentFunctionElement&quot;&gt;
+    &lt;div class=&quot;gridItem&quot;&gt;&lt;/div&gt;
+&lt;/div&gt;
</ins><span class="cx"> &lt;script src=&quot;resources/grid-definitions-parsing-utils.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;resources/grid-columns-rows-get-set.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsfastcssgridlayoutresourcesgridcolumnsrowsgetsetjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -21,6 +21,7 @@
</span><span class="cx"> testGridTemplatesValues(document.getElementById(&quot;gridWithCalcInsideMinMaxElement&quot;), &quot;minmax(10%, 15px)&quot;, &quot;minmax(20px, 50%)&quot;, &quot;80px&quot;, &quot;300px&quot;);
</span><span class="cx"> testGridTemplatesValues(document.getElementById(&quot;gridWithCalcComplexInsideMinMaxElement&quot;), &quot;minmax(10%, 415px)&quot;, &quot;minmax(80px, 50%)&quot;, &quot;415px&quot;, &quot;300px&quot;);
</span><span class="cx"> testGridTemplatesValues(document.getElementById(&quot;gridWithAutoInsideMinMaxElement&quot;), &quot;20px&quot;, &quot;11px&quot;);
</span><ins>+testGridTemplatesValues(document.getElementById(&quot;gridWithFitContentFunctionElement&quot;), &quot;7px&quot;, &quot;11px&quot;);
</ins><span class="cx"> 
</span><span class="cx"> debug(&quot;&quot;);
</span><span class="cx"> debug(&quot;Test getting wrong values for grid-template-columns and grid-template-rows through CSS (they should resolve to the default: 'none')&quot;);
</span><span class="lines">@@ -44,6 +45,7 @@
</span><span class="cx"> testGridTemplatesSetJSValues(&quot;10vw&quot;, &quot;25vh&quot;, &quot;80px&quot;, &quot;150px&quot;);
</span><span class="cx"> testGridTemplatesSetJSValues(&quot;-webkit-min-content&quot;, &quot;-webkit-min-content&quot;, &quot;0px&quot;, &quot;0px&quot;);
</span><span class="cx"> testGridTemplatesSetJSValues(&quot;-webkit-max-content&quot;, &quot;-webkit-max-content&quot;, &quot;0px&quot;, &quot;0px&quot;);
</span><ins>+testGridTemplatesSetJSValues(&quot;fit-content(100px)&quot;, &quot;fit-content(25%)&quot;, &quot;0px&quot;, &quot;0px&quot;);
</ins><span class="cx"> 
</span><span class="cx"> debug(&quot;&quot;);
</span><span class="cx"> debug(&quot;Test getting and setting grid-template-columns and grid-template-rows to minmax() values through JS&quot;);
</span><span class="lines">@@ -80,6 +82,14 @@
</span><span class="cx"> // Flexible lengths are invalid on the min slot of minmax().
</span><span class="cx"> testGridTemplatesSetBadJSValues(&quot;minmax(0fr, 100px)&quot;, &quot;minmax(.0fr, 200px)&quot;);
</span><span class="cx"> testGridTemplatesSetBadJSValues(&quot;minmax(1fr, 100px)&quot;, &quot;minmax(2.5fr, 200px)&quot;);
</span><ins>+testGridTemplatesSetBadJSValues(&quot;fit-content()&quot;, &quot;fit-content( )&quot;);
+testGridTemplatesSetBadJSValues(&quot;fit-content(-10em)&quot;, &quot;fit-content(-2px)&quot;);
+testGridTemplatesSetBadJSValues(&quot;fit-content(10px 2%)&quot;, &quot;fit-content(5% 10em)&quot;);
+testGridTemplatesSetBadJSValues(&quot;fit-content(-webkit-max-content)&quot;, &quot;fit-content(-webkit-min-content)&quot;);
+testGridTemplatesSetBadJSValues(&quot;fit-content(auto)&quot;, &quot;fit-content(3fr)&quot;);
+testGridTemplatesSetBadJSValues(&quot;fit-content(repeat(2, 100px))&quot;, &quot;fit-content(repeat(auto-fit), 1%)&quot;);
+testGridTemplatesSetBadJSValues(&quot;fit-content(fit-content(10px))&quot;, &quot;fit-content(fit-content(30%))&quot;);
+testGridTemplatesSetBadJSValues(&quot;fit-content([a] 100px)&quot;, &quot;fit-content(30px [b c])&quot;);
</ins><span class="cx"> 
</span><span class="cx"> testGridTemplatesSetBadJSValues(&quot;-2fr&quot;, &quot;3ffr&quot;);
</span><span class="cx"> testGridTemplatesSetBadJSValues(&quot;-2.05fr&quot;, &quot;+-3fr&quot;);
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/ChangeLog	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -1,3 +1,98 @@
</span><ins>+2016-09-07  Sergio Villar Senin  &lt;svillar at igalia.com&gt;
+
+        [css-grid] Implement fit-content track size
+        https://bugs.webkit.org/show_bug.cgi?id=161379
+
+        Reviewed by Manuel Rego Casasnovas.
+
+        This implements the new &lt;fit-content&gt; track size which is defined as follows: &quot;Represents
+        the formula min(max-content, max(auto, argument)), which is calculated similar to auto
+        (i.e. minmax(auto, max-content)), except that the track size is clamped at argument if it is
+        greater than the auto minimum.&quot;
+
+        From the parsing POV fit-content was implemented as a new type of function which only takes
+        one argument. That forced us to refactor some code because minmax() was the only allowed
+        function for &lt;track-size&gt;s so far.
+
+        The implementation key is a new attribute in GridTrack called growthLimitCap which is
+        precisely the single attribute of fit-content(). Some parts of the track sizing algorithm
+        were adapted to this change like for example the sorting of tracks by growth potential (we
+        need to consider the caps).
+
+        Tests: fast/css-grid-layout/fit-content-columns.html
+        fast/css-grid-layout/fit-content-rows.html
+
+        * css/CSSComputedStyleDeclaration.cpp:
+        (WebCore::specifiedValueForGridTrackSize): Added support for fit-content sizes.
+        * css/StyleBuilderConverter.h:
+        (WebCore::StyleBuilderConverter::createGridTrackSize): Added support for fit-content sizes.
+        * css/parser/CSSParser.cpp:
+        (WebCore::isGridTrackFixedSized): Added support for fit-content sizes.
+        (WebCore::CSSParser::parseGridTrackSize): Added support for parsing fit-content() functions.
+        * css/parser/CSSPropertyParser.cpp: Added support for parsing fit-content() functions so
+        it'll be available once we switch to the new parser.
+        * rendering/RenderGrid.cpp:
+        (WebCore::GridTrack::baseSize): Just return a LayoutUnit, the return value optimization will
+        keep it fast in any case.
+        (WebCore::GridTrack::growthLimit): Ditto.
+        (WebCore::GridTrack::setGrowthLimit): Added an ASSERT to check that the growth limit is
+        never higher than the cap.
+        (WebCore::GridTrack::infiniteGrowthPotential):
+        (WebCore::GridTrack::plannedSize): Just return a LayoutUnit, the return value optimization will
+        keep it fast in any case.
+        (WebCore::GridTrack::tempSize): Just return a LayoutUnit, the return value optimization will
+        keep it fast in any case.
+        (WebCore::GridTrack::setTempSize): Added as we no longer return a reference in tempSize().
+        (WebCore::GridTrack::growTempSize): New utility function which increases the tempSize.
+        (WebCore::GridTrack::setInfinitelyGrowable):
+        (WebCore::GridTrack::setGrowthLimitCap): Added.
+        (WebCore::GridTrack::growthLimitCap): Ditto.
+        (WebCore::GridTrack::growthLimitIsInfinite): Made private.
+        (WebCore::RenderGrid::GridSizingData::freeSpace): Renamed from freeSpaceForDirection.
+        (WebCore::RenderGrid::GridSizingData::availableSpace): We now cache the available space as
+        it is used to compute relative (percentage) sizes.
+        (WebCore::RenderGrid::GridSizingData::setAvailableSpace): Ditto.
+        (WebCore::RenderGrid::GridSizingData::setFreeSpace): Renamed from setFreeSpaceForDirection.
+        (WebCore::RenderGrid::computeTrackSizesForDirection): Receives the available space instead
+        of the free space.
+        (WebCore::RenderGrid::computeIntrinsicLogicalWidths): Properly initialize free and available
+        spaces.
+        (WebCore::RenderGrid::computeIntrinsicLogicalHeight): Ditto.
+        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks): Use available space to initialize the
+        track sizes. Also use sizingOperation to decide whether or not sizes are indefinite. Last
+        but not least, added support for fit-content tracks.
+        (WebCore::RenderGrid::computeUsedBreadthOfMinLength): Pass a GridTrackSize instead of a GridLength.
+        (WebCore::RenderGrid::computeUsedBreadthOfMaxLength): Ditto.
+        (WebCore::RenderGrid::gridTrackSize): Added support for fit-content.
+        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions): Ditto.
+        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems): Ditto.
+        (WebCore::trackSizeForTrackSizeComputationPhase):
+        (WebCore::sortByGridTrackGrowthPotential): Reworked the function so it properly sorts tracks
+        with growth limit caps to support fit-content().
+        (WebCore::clampGrowthShareIfNeeded): Clamps the given growthShare passed as argument to the
+        track growth limit cap.
+        (WebCore::RenderGrid::distributeSpaceToTracks): Use the new setTempSize() method. Also sort
+        the selected tracks to grow over growth limits in order to respect the track caps eventually
+        set by fit-content (otherwise those tracks could indefinitely grow over the specified value).
+        (WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth): Use the new defined functions.
+        (WebCore::RenderGrid::applyStretchAlignmentToTracksIfNeeded): Use freeSpace().
+        (WebCore::RenderGrid::populateGridPositionsForDirection): Ditto.
+        (WebCore::GridTrack::infinitelyGrowable): Deleted.
+        (WebCore::RenderGrid::GridSizingData::freeSpaceForDirection): Deleted.
+        (WebCore::RenderGrid::GridSizingData::setFreeSpaceForDirection): Deleted.
+        (WebCore::RenderGrid::trackSizeForTrackSizeComputationPhase): Deleted.
+        * rendering/RenderGrid.h: Changed the signature of some methods. Moved
+        TrackSizeComputationPhase out of the RenderGrid class.
+        * rendering/style/GridTrackSize.h:
+        (WebCore::GridTrackSize::GridTrackSize): Added some extra documentation. Added a new
+        attribute to the constructor to support fit-content GridTrackSizes.
+        (WebCore::GridTrackSize::fitContentTrackBreadth): New method which returns the growth limit
+        cap set by fit-content().
+        (WebCore::GridTrackSize::minTrackBreadth):
+        (WebCore::GridTrackSize::isFitContent): Added.
+        (WebCore::GridTrackSize::length): Deleted.
+        (WebCore::GridTrackSize::isPercentage): Deleted.
+
</ins><span class="cx"> 2016-09-15  Alejandro G. Castro  &lt;alex at igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix build warnings in the mediastream code
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSComputedStyleDeclarationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -1013,7 +1013,12 @@
</span><span class="cx"> {
</span><span class="cx">     switch (trackSize.type()) {
</span><span class="cx">     case LengthTrackSizing:
</span><del>-        return specifiedValueForGridTrackBreadth(trackSize.length(), style);
</del><ins>+        return specifiedValueForGridTrackBreadth(trackSize.minTrackBreadth(), style);
+    case FitContentTrackSizing: {
+        auto fitContentTrackSize = CSSValueList::createCommaSeparated();
+        fitContentTrackSize-&gt;append(zoomAdjustedPixelValueForLength(trackSize.fitContentTrackBreadth().length(), style));
+        return CSSFunctionValue::create(&quot;fit-content(&quot;, WTFMove(fitContentTrackSize));
+    }
</ins><span class="cx">     default:
</span><span class="cx">         ASSERT(trackSize.type() == MinMaxTrackSizing);
</span><span class="cx">         auto minMaxTrackBreadths = CSSValueList::createCommaSeparated();
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleBuilderConverterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleBuilderConverter.h (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleBuilderConverter.h	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/css/StyleBuilderConverter.h	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -843,9 +843,13 @@
</span><span class="cx">     if (is&lt;CSSPrimitiveValue&gt;(value))
</span><span class="cx">         return GridTrackSize(createGridTrackBreadth(downcast&lt;CSSPrimitiveValue&gt;(value), styleResolver));
</span><span class="cx"> 
</span><ins>+    ASSERT(is&lt;CSSFunctionValue&gt;(value));
</ins><span class="cx">     CSSValueList&amp; arguments = *downcast&lt;CSSFunctionValue&gt;(value).arguments();
</span><ins>+
+    if (arguments.length() == 1)
+        return GridTrackSize(createGridTrackBreadth(downcast&lt;CSSPrimitiveValue&gt;(*arguments.itemWithoutBoundsCheck(0)), styleResolver), FitContentTrackSizing);
+
</ins><span class="cx">     ASSERT_WITH_SECURITY_IMPLICATION(arguments.length() == 2);
</span><del>-
</del><span class="cx">     GridLength minTrackBreadth(createGridTrackBreadth(downcast&lt;CSSPrimitiveValue&gt;(*arguments.itemWithoutBoundsCheck(0)), styleResolver));
</span><span class="cx">     GridLength maxTrackBreadth(createGridTrackBreadth(downcast&lt;CSSPrimitiveValue&gt;(*arguments.itemWithoutBoundsCheck(1)), styleResolver));
</span><span class="cx">     return GridTrackSize(minTrackBreadth, maxTrackBreadth);
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSParser.cpp (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSParser.cpp	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/css/parser/CSSParser.cpp	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -5645,11 +5645,14 @@
</span><span class="cx">         return isGridTrackFixedSized(downcast&lt;CSSPrimitiveValue&gt;(value));
</span><span class="cx"> 
</span><span class="cx">     ASSERT(value.isFunctionValue());
</span><del>-    ASSERT(downcast&lt;CSSFunctionValue&gt;(value).arguments());
-    ASSERT(downcast&lt;CSSFunctionValue&gt;(value).arguments()-&gt;length() == 2);
</del><ins>+    auto&amp; arguments = *downcast&lt;CSSFunctionValue&gt;(value).arguments();
+    // fit-content
+    if (arguments.length() == 1)
+        return false;
</ins><span class="cx"> 
</span><del>-    auto&amp; min = downcast&lt;CSSPrimitiveValue&gt;(*downcast&lt;CSSFunctionValue&gt;(value).arguments()-&gt;item(0));
-    auto&amp; max = downcast&lt;CSSPrimitiveValue&gt;(*downcast&lt;CSSFunctionValue&gt;(value).arguments()-&gt;item(1));
</del><ins>+    ASSERT(arguments.length() == 2);
+    auto&amp; min = downcast&lt;CSSPrimitiveValue&gt;(*arguments.itemWithoutBoundsCheck(0));
+    auto&amp; max = downcast&lt;CSSPrimitiveValue&gt;(*arguments.itemWithoutBoundsCheck(1));
</ins><span class="cx">     return isGridTrackFixedSized(min) || isGridTrackFixedSized(max);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -5795,6 +5798,21 @@
</span><span class="cx">     if (currentValue.id == CSSValueAuto)
</span><span class="cx">         return CSSValuePool::singleton().createIdentifierValue(CSSValueAuto);
</span><span class="cx"> 
</span><ins>+    if (currentValue.unit == CSSParserValue::Function &amp;&amp; equalLettersIgnoringASCIICase(currentValue.function-&gt;name, &quot;fit-content(&quot;)) {
+        CSSParserValueList* arguments = currentValue.function-&gt;args.get();
+        if (!arguments || arguments-&gt;size() != 1)
+            return nullptr;
+        ValueWithCalculation valueWithCalculation(*arguments-&gt;valueAt(0));
+        if (!validateUnit(valueWithCalculation, FNonNeg | FLength | FPercent))
+            return nullptr;
+        RefPtr&lt;CSSPrimitiveValue&gt; trackBreadth = createPrimitiveNumericValue(valueWithCalculation);
+        if (!trackBreadth)
+            return nullptr;
+        auto parsedArguments = CSSValueList::createCommaSeparated();
+        parsedArguments-&gt;append(trackBreadth.releaseNonNull());
+        return CSSFunctionValue::create(&quot;fit-content(&quot;, WTFMove(parsedArguments));
+    }
+
</ins><span class="cx">     if (currentValue.unit == CSSParserValue::Function &amp;&amp; equalLettersIgnoringASCIICase(currentValue.function-&gt;name, &quot;minmax(&quot;)) {
</span><span class="cx">         // The spec defines the following grammar: minmax( &lt;track-breadth&gt; , &lt;track-breadth&gt; )
</span><span class="cx">         CSSParserValueList* arguments = currentValue.function-&gt;args.get();
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSPropertyParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -2794,6 +2794,19 @@
</span><span class="cx">     return consumeSelfPositionOverflowPosition(range);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static CSSValue* consumeFitContent(CSSParserTokenRange&amp; range, CSSParserMode cssParserMode)
+{
+    CSSParserTokenRange rangeCopy = range;
+    CSSParserTokenRange args = consumeFunction(rangeCopy);
+    CSSPrimitiveValue* length = consumeLengthOrPercent(args, cssParserMode, ValueRangeNonNegative, UnitlessQuirk::Allow);
+    if (!length || !args.atEnd())
+        return nullptr;
+    range = rangeCopy;
+    CSSFunctionValue* result = CSSFunctionValue::create(CSSValueFitContent);
+    result-&gt;append(*length);
+    return result;
+}
+
</ins><span class="cx"> static CSSCustomIdentValue* consumeCustomIdentForGridLine(CSSParserTokenRange&amp; range)
</span><span class="cx"> {
</span><span class="cx">     if (range.peek().id() == CSSValueAuto || range.peek().id() == CSSValueSpan)
</span><span class="lines">@@ -2864,8 +2877,13 @@
</span><span class="cx">     if (value.isPrimitiveValue())
</span><span class="cx">         return isGridTrackFixedSized(toCSSPrimitiveValue(value));
</span><span class="cx"> 
</span><del>-    const CSSPrimitiveValue&amp; minPrimitiveValue = toCSSPrimitiveValue(toCSSFunctionValue(value).item(0));
-    const CSSPrimitiveValue&amp; maxPrimitiveValue = toCSSPrimitiveValue(toCSSFunctionValue(value).item(1));
</del><ins>+    ASSERT(value.isFunctionValue());
+    auto&amp; function = toCSSFunctionValue(value);
+    if (function.functionType() == CSSValueFitContent)
+        return false;
+
+    const CSSPrimitiveValue&amp; minPrimitiveValue = toCSSPrimitiveValue(function.item(0));
+    const CSSPrimitiveValue&amp; maxPrimitiveValue = toCSSPrimitiveValue(function.item(1));
</ins><span class="cx">     return isGridTrackFixedSized(minPrimitiveValue) || isGridTrackFixedSized(maxPrimitiveValue);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2997,6 +3015,10 @@
</span><span class="cx">         result-&gt;append(*maxTrackBreadth);
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><ins>+
+    if (token.functionId() == CSSValueFitContent)
+        return consumeFitContent(range, cssParserMode);
+
</ins><span class="cx">     return consumeGridBreadth(range, cssParserMode);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -41,6 +41,11 @@
</span><span class="cx"> static const int infinity = -1;
</span><span class="cx"> static constexpr ItemPosition selfAlignmentNormalBehavior = ItemPositionStretch;
</span><span class="cx"> 
</span><ins>+enum TrackSizeRestriction {
+    AllowInfinity,
+    ForbidInfinity,
+};
+
</ins><span class="cx"> class GridTrack {
</span><span class="cx"> public:
</span><span class="cx">     GridTrack() {}
</span><span class="lines">@@ -54,6 +59,7 @@
</span><span class="cx">     const LayoutUnit&amp; growthLimit() const
</span><span class="cx">     {
</span><span class="cx">         ASSERT(isGrowthLimitBiggerThanBaseSize());
</span><ins>+        ASSERT(!m_growthLimitCap || m_growthLimitCap.value() &gt;= m_growthLimit || m_baseSize &gt;= m_growthLimitCap.value());
</ins><span class="cx">         return m_growthLimit;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -65,20 +71,12 @@
</span><span class="cx"> 
</span><span class="cx">     void setGrowthLimit(LayoutUnit growthLimit)
</span><span class="cx">     {
</span><del>-        m_growthLimit = growthLimit;
</del><ins>+        m_growthLimit = growthLimit == infinity ? growthLimit : std::min(growthLimit, m_growthLimitCap.valueOr(growthLimit));
</ins><span class="cx">         ensureGrowthLimitIsBiggerThanBaseSize();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool growthLimitIsInfinite() const
-    {
-        return m_growthLimit == infinity;
-    }
</del><ins>+    bool infiniteGrowthPotential() const { return growthLimitIsInfinite() || m_infinitelyGrowable; }
</ins><span class="cx"> 
</span><del>-    bool infiniteGrowthPotential() const
-    {
-        return growthLimitIsInfinite() || m_infinitelyGrowable;
-    }
-
</del><span class="cx">     const LayoutUnit&amp; growthLimitIfNotInfinite() const
</span><span class="cx">     {
</span><span class="cx">         ASSERT(isGrowthLimitBiggerThanBaseSize());
</span><span class="lines">@@ -92,16 +90,35 @@
</span><span class="cx">         m_plannedSize = plannedSize;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LayoutUnit&amp; tempSize() { return m_tempSize; }
</del><ins>+    const LayoutUnit&amp; tempSize() const { return m_tempSize; }
</ins><span class="cx"> 
</span><ins>+    void setTempSize(const LayoutUnit&amp; tempSize)
+    {
+        ASSERT(tempSize &gt;= 0);
+        ASSERT(growthLimitIsInfinite() || growthLimit() &gt;= tempSize);
+        m_tempSize = tempSize;
+    }
+
+    void growTempSize(const LayoutUnit&amp; tempSize)
+    {
+        ASSERT(tempSize &gt;= 0);
+        m_tempSize += tempSize;
+        ASSERT(growthLimitIsInfinite() || growthLimit() &gt;= m_tempSize);
+    }
+
</ins><span class="cx">     bool infinitelyGrowable() const { return m_infinitelyGrowable; }
</span><ins>+    void setInfinitelyGrowable(bool infinitelyGrowable) { m_infinitelyGrowable = infinitelyGrowable; }
</ins><span class="cx"> 
</span><del>-    void setInfinitelyGrowable(bool infinitelyGrowable)
</del><ins>+    void setGrowthLimitCap(Optional&lt;LayoutUnit&gt; growthLimitCap)
</ins><span class="cx">     {
</span><del>-        m_infinitelyGrowable = infinitelyGrowable;
</del><ins>+        ASSERT(!growthLimitCap || growthLimitCap.value() &gt;= 0);
+        m_growthLimitCap = growthLimitCap;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    Optional&lt;LayoutUnit&gt; growthLimitCap() const { return m_growthLimitCap; }
+
</ins><span class="cx"> private:
</span><ins>+    bool growthLimitIsInfinite() const { return m_growthLimit == infinity; }
</ins><span class="cx">     bool isGrowthLimitBiggerThanBaseSize() const { return growthLimitIsInfinite() || m_growthLimit &gt;= m_baseSize; }
</span><span class="cx"> 
</span><span class="cx">     void ensureGrowthLimitIsBiggerThanBaseSize()
</span><span class="lines">@@ -114,6 +131,7 @@
</span><span class="cx">     LayoutUnit m_growthLimit { 0 };
</span><span class="cx">     LayoutUnit m_plannedSize { 0 };
</span><span class="cx">     LayoutUnit m_tempSize { 0 };
</span><ins>+    Optional&lt;LayoutUnit&gt; m_growthLimitCap;
</ins><span class="cx">     bool m_infinitelyGrowable { false };
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -235,9 +253,12 @@
</span><span class="cx">     Vector&lt;GridTrack*&gt; growBeyondGrowthLimitsTracks;
</span><span class="cx">     Vector&lt;GridItemWithSpan&gt; itemsSortedByIncreasingSpan;
</span><span class="cx"> 
</span><del>-    Optional&lt;LayoutUnit&gt; freeSpaceForDirection(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
-    void setFreeSpaceForDirection(GridTrackSizingDirection, Optional&lt;LayoutUnit&gt; freeSpace);
</del><ins>+    Optional&lt;LayoutUnit&gt; freeSpace(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
+    void setFreeSpace(GridTrackSizingDirection, Optional&lt;LayoutUnit&gt; freeSpace);
</ins><span class="cx"> 
</span><ins>+    Optional&lt;LayoutUnit&gt; availableSpace() const { return m_availableSpace; }
+    void setAvailableSpace(Optional&lt;LayoutUnit&gt; availableSpace) { m_availableSpace = availableSpace; }
+
</ins><span class="cx">     SizingOperation sizingOperation { TrackSizing };
</span><span class="cx"> 
</span><span class="cx">     enum SizingState { ColumnSizingFirstIteration, RowSizingFirstIteration, ColumnSizingSecondIteration, RowSizingSecondIteration};
</span><span class="lines">@@ -278,9 +299,12 @@
</span><span class="cx"> private:
</span><span class="cx">     Optional&lt;LayoutUnit&gt; freeSpaceForColumns;
</span><span class="cx">     Optional&lt;LayoutUnit&gt; freeSpaceForRows;
</span><ins>+    // No need to store one per direction as it will be only used for computations during each axis
+    // track sizing. It's cached here because we need it to compute relative sizes.
+    Optional&lt;LayoutUnit&gt; m_availableSpace;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-void RenderGrid::GridSizingData::setFreeSpaceForDirection(GridTrackSizingDirection direction, Optional&lt;LayoutUnit&gt; freeSpace)
</del><ins>+void RenderGrid::GridSizingData::setFreeSpace(GridTrackSizingDirection direction, Optional&lt;LayoutUnit&gt; freeSpace)
</ins><span class="cx"> {
</span><span class="cx">     if (direction == ForColumns)
</span><span class="cx">         freeSpaceForColumns = freeSpace;
</span><span class="lines">@@ -390,11 +414,12 @@
</span><span class="cx">     return logicalHeight;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderGrid::computeTrackSizesForDirection(GridTrackSizingDirection direction, GridSizingData&amp; sizingData, LayoutUnit freeSpace)
</del><ins>+void RenderGrid::computeTrackSizesForDirection(GridTrackSizingDirection direction, GridSizingData&amp; sizingData, LayoutUnit availableSpace)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(sizingData.isValidTransition(direction));
</span><span class="cx">     LayoutUnit totalGuttersSize = guttersSize(direction, 0, direction == ForRows ? gridRowCount() : gridColumnCount());
</span><del>-    sizingData.setFreeSpaceForDirection(direction, freeSpace - totalGuttersSize);
</del><ins>+    sizingData.setAvailableSpace(availableSpace);
+    sizingData.setFreeSpace(direction, availableSpace - totalGuttersSize);
</ins><span class="cx">     sizingData.sizingOperation = TrackSizing;
</span><span class="cx"> 
</span><span class="cx">     LayoutUnit baseSizes, growthLimits;
</span><span class="lines">@@ -590,7 +615,8 @@
</span><span class="cx">         const_cast&lt;RenderGrid*&gt;(this)-&gt;placeItemsOnGrid(IntrinsicSizeComputation);
</span><span class="cx"> 
</span><span class="cx">     GridSizingData sizingData(gridColumnCount(), gridRowCount());
</span><del>-    sizingData.setFreeSpaceForDirection(ForColumns, Nullopt);
</del><ins>+    sizingData.setAvailableSpace(Nullopt);
+    sizingData.setFreeSpace(ForColumns, Nullopt);
</ins><span class="cx">     sizingData.sizingOperation = IntrinsicSizeComputation;
</span><span class="cx">     computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxLogicalWidth);
</span><span class="cx"> 
</span><span class="lines">@@ -609,7 +635,8 @@
</span><span class="cx"> void RenderGrid::computeIntrinsicLogicalHeight(GridSizingData&amp; sizingData)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData));
</span><del>-    sizingData.setFreeSpaceForDirection(ForRows, Nullopt);
</del><ins>+    sizingData.setAvailableSpace(Nullopt);
+    sizingData.setFreeSpace(ForRows, Nullopt);
</ins><span class="cx">     sizingData.sizingOperation = IntrinsicSizeComputation;
</span><span class="cx">     LayoutUnit minHeight, maxHeight;
</span><span class="cx">     computeUsedBreadthOfGridTracks(ForRows, sizingData, minHeight, maxHeight);
</span><span class="lines">@@ -659,28 +686,30 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection direction, GridSizingData&amp; sizingData, LayoutUnit&amp; baseSizesWithoutMaximization, LayoutUnit&amp; growthLimitsWithoutMaximization) const
</span><span class="cx"> {
</span><del>-    const Optional&lt;LayoutUnit&gt; initialFreeSpace = sizingData.freeSpaceForDirection(direction);
</del><ins>+    const Optional&lt;LayoutUnit&gt; initialFreeSpace = sizingData.freeSpace(direction);
</ins><span class="cx">     Vector&lt;GridTrack&gt;&amp; tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
</span><span class="cx">     Vector&lt;unsigned&gt; flexibleSizedTracksIndex;
</span><span class="cx">     sizingData.contentSizedTracksIndex.shrink(0);
</span><span class="cx"> 
</span><del>-    LayoutUnit maxSize = initialFreeSpace.valueOr(0);
</del><span class="cx">     // Grid gutters were removed from freeSpace by the caller (if freeSpace is definite),
</span><span class="cx">     // but we must use them to compute relative (i.e. percentages) sizes.
</span><del>-    if (initialFreeSpace)
-        maxSize += guttersSize(direction, 0, direction == ForColumns ? gridColumnCount() : gridRowCount());
</del><ins>+    LayoutUnit maxSize = std::max(LayoutUnit(), sizingData.availableSpace().valueOr(LayoutUnit()));
+    const bool hasDefiniteFreeSpace = sizingData.sizingOperation == TrackSizing;
</ins><span class="cx"> 
</span><span class="cx">     // 1. Initialize per Grid track variables.
</span><span class="cx">     for (unsigned i = 0; i &lt; tracks.size(); ++i) {
</span><span class="cx">         GridTrack&amp; track = tracks[i];
</span><span class="cx">         const GridTrackSize&amp; trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
</span><del>-        const GridLength&amp; minTrackBreadth = trackSize.minTrackBreadth();
-        const GridLength&amp; maxTrackBreadth = trackSize.maxTrackBreadth();
</del><span class="cx"> 
</span><del>-        track.setBaseSize(computeUsedBreadthOfMinLength(minTrackBreadth, maxSize));
-        track.setGrowthLimit(computeUsedBreadthOfMaxLength(maxTrackBreadth, track.baseSize(), maxSize));
</del><ins>+        track.setBaseSize(computeUsedBreadthOfMinLength(trackSize, maxSize));
+        track.setGrowthLimit(computeUsedBreadthOfMaxLength(trackSize, track.baseSize(), maxSize));
</ins><span class="cx">         track.setInfinitelyGrowable(false);
</span><span class="cx"> 
</span><ins>+        if (trackSize.isFitContent()) {
+            GridLength gridLength = trackSize.fitContentTrackBreadth();
+            if (!gridLength.isPercentage() || hasDefiniteFreeSpace)
+                track.setGrowthLimitCap(valueForLength(gridLength.length(), maxSize));
+        }
</ins><span class="cx">         if (trackSize.isContentSized())
</span><span class="cx">             sizingData.contentSizedTracksIndex.append(i);
</span><span class="cx">         if (trackSize.maxTrackBreadth().isFlex())
</span><span class="lines">@@ -694,16 +723,17 @@
</span><span class="cx">     baseSizesWithoutMaximization = growthLimitsWithoutMaximization = 0;
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; track : tracks) {
</span><del>-        ASSERT(!track.growthLimitIsInfinite());
</del><ins>+        ASSERT(!track.infiniteGrowthPotential());
</ins><span class="cx">         baseSizesWithoutMaximization += track.baseSize();
</span><span class="cx">         growthLimitsWithoutMaximization += track.growthLimit();
</span><ins>+        // The growth limit caps must be cleared now in order to properly sort tracks by growth
+        // potential on an eventual &quot;Maximize Tracks&quot;.
+        track.setGrowthLimitCap(Nullopt);
</ins><span class="cx">     }
</span><span class="cx">     LayoutUnit freeSpace = initialFreeSpace ? initialFreeSpace.value() - baseSizesWithoutMaximization : LayoutUnit(0);
</span><span class="cx"> 
</span><del>-    const bool hasDefiniteFreeSpace = !!initialFreeSpace;
-
</del><span class="cx">     if (hasDefiniteFreeSpace &amp;&amp; freeSpace &lt;= 0) {
</span><del>-        sizingData.setFreeSpaceForDirection(direction, freeSpace);
</del><ins>+        sizingData.setFreeSpace(direction, freeSpace);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -726,7 +756,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (flexibleSizedTracksIndex.isEmpty()) {
</span><del>-        sizingData.setFreeSpaceForDirection(direction, freeSpace);
</del><ins>+        sizingData.setFreeSpace(direction, freeSpace);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -765,11 +795,12 @@
</span><span class="cx">             growthLimitsWithoutMaximization += increment;
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-    sizingData.setFreeSpaceForDirection(direction, freeSpace);
</del><ins>+    sizingData.setFreeSpace(direction, freeSpace);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-LayoutUnit RenderGrid::computeUsedBreadthOfMinLength(const GridLength&amp; gridLength, LayoutUnit maxSize) const
</del><ins>+LayoutUnit RenderGrid::computeUsedBreadthOfMinLength(const GridTrackSize&amp; trackSize, LayoutUnit maxSize) const
</ins><span class="cx"> {
</span><ins>+    const GridLength&amp; gridLength = trackSize.minTrackBreadth();
</ins><span class="cx">     if (gridLength.isFlex())
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><span class="lines">@@ -781,8 +812,9 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-LayoutUnit RenderGrid::computeUsedBreadthOfMaxLength(const GridLength&amp; gridLength, LayoutUnit usedBreadth, LayoutUnit maxSize) const
</del><ins>+LayoutUnit RenderGrid::computeUsedBreadthOfMaxLength(const GridTrackSize&amp; trackSize, LayoutUnit usedBreadth, LayoutUnit maxSize) const
</ins><span class="cx"> {
</span><ins>+    const GridLength&amp; gridLength = trackSize.maxTrackBreadth();
</ins><span class="cx">     if (gridLength.isFlex())
</span><span class="cx">         return usedBreadth;
</span><span class="cx"> 
</span><span class="lines">@@ -912,9 +944,11 @@
</span><span class="cx"> {
</span><span class="cx">     // Collapse empty auto repeat tracks if auto-fit.
</span><span class="cx">     if (hasAutoRepeatEmptyTracks(direction) &amp;&amp; isEmptyAutoRepeatTrack(direction, translatedIndex))
</span><del>-        return { Length(Fixed), Length(Fixed) };
</del><ins>+        return { Length(Fixed), LengthTrackSizing };
</ins><span class="cx"> 
</span><span class="cx">     auto&amp; trackSize = rawGridTrackSize(direction, translatedIndex);
</span><ins>+    if (trackSize.isFitContent())
+        return trackSize;
</ins><span class="cx"> 
</span><span class="cx">     GridLength minTrackBreadth = trackSize.minTrackBreadth();
</span><span class="cx">     GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
</span><span class="lines">@@ -1127,7 +1161,7 @@
</span><span class="cx"> 
</span><span class="cx">     for (auto trackIndex : sizingData.contentSizedTracksIndex) {
</span><span class="cx">         GridTrack&amp; track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex] : sizingData.rowTracks[trackIndex];
</span><del>-        if (track.growthLimitIsInfinite())
</del><ins>+        if (track.growthLimit() == infinity)
</ins><span class="cx">             track.setGrowthLimit(track.baseSize());
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -1144,13 +1178,17 @@
</span><span class="cx">     else if (trackSize.hasAutoMinTrackBreadth())
</span><span class="cx">         track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, direction, sizingData)));
</span><span class="cx"> 
</span><del>-    if (trackSize.hasMinContentMaxTrackBreadth())
</del><ins>+    if (trackSize.hasMinContentMaxTrackBreadth()) {
</ins><span class="cx">         track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gridItem, direction, sizingData)));
</span><del>-    else if (trackSize.hasMaxContentOrAutoMaxTrackBreadth())
-        track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gridItem, direction, sizingData)));
</del><ins>+    } else if (trackSize.hasMaxContentOrAutoMaxTrackBreadth()) {
+        LayoutUnit growthLimit = maxContentForChild(gridItem, direction, sizingData);
+        if (trackSize.isFitContent())
+            growthLimit = std::min(growthLimit, valueForLength(trackSize.fitContentTrackBreadth().length(), sizingData.availableSpace().valueOr(0)));
+        track.setGrowthLimit(std::max(track.growthLimit(), growthLimit));
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-const LayoutUnit&amp; RenderGrid::trackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, GridTrack&amp; track, TrackSizeRestriction restriction)
</del><ins>+static LayoutUnit trackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase phase, GridTrack&amp; track, TrackSizeRestriction restriction)
</ins><span class="cx"> {
</span><span class="cx">     switch (phase) {
</span><span class="cx">     case ResolveIntrinsicMinimums:
</span><span class="lines">@@ -1272,7 +1310,7 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;RenderGrid::TrackSizeComputationPhase phase&gt;
</del><ins>+template &lt;TrackSizeComputationPhase phase&gt;
</ins><span class="cx"> void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData&amp; sizingData, const GridItemsSpanGroupRange&amp; gridItemsWithSpan) const
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;GridTrack&gt;&amp; tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
</span><span class="lines">@@ -1324,22 +1362,39 @@
</span><span class="cx"> {
</span><span class="cx">     // This check ensures that we respect the irreflexivity property of the strict weak ordering required by std::sort
</span><span class="cx">     // (forall x: NOT x &lt; x).
</span><del>-    if (track1-&gt;infiniteGrowthPotential() &amp;&amp; track2-&gt;infiniteGrowthPotential())
</del><ins>+    bool track1HasInfiniteGrowthPotentialWithoutCap = track1-&gt;infiniteGrowthPotential() &amp;&amp; !track1-&gt;growthLimitCap();
+    bool track2HasInfiniteGrowthPotentialWithoutCap = track2-&gt;infiniteGrowthPotential() &amp;&amp; !track2-&gt;growthLimitCap();
+
+    if (track1HasInfiniteGrowthPotentialWithoutCap &amp;&amp; track2HasInfiniteGrowthPotentialWithoutCap)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    if (track1-&gt;infiniteGrowthPotential() || track2-&gt;infiniteGrowthPotential())
-        return track2-&gt;infiniteGrowthPotential();
</del><ins>+    if (track1HasInfiniteGrowthPotentialWithoutCap || track2HasInfiniteGrowthPotentialWithoutCap)
+        return track2HasInfiniteGrowthPotentialWithoutCap;
</ins><span class="cx"> 
</span><del>-    return (track1-&gt;growthLimit() - track1-&gt;baseSize()) &lt; (track2-&gt;growthLimit() - track2-&gt;baseSize());
</del><ins>+    LayoutUnit track1Limit = track1-&gt;growthLimitCap().valueOr(track1-&gt;growthLimit());
+    LayoutUnit track2Limit = track2-&gt;growthLimitCap().valueOr(track2-&gt;growthLimit());
+    return (track1Limit - track1-&gt;baseSize()) &lt; (track2Limit - track2-&gt;baseSize());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;RenderGrid::TrackSizeComputationPhase phase&gt;
-void RenderGrid::distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp; tracks, const Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, LayoutUnit&amp; freeSpace) const
</del><ins>+static void clampGrowthShareIfNeeded(TrackSizeComputationPhase phase, const GridTrack&amp; track, LayoutUnit&amp; growthShare)
</ins><span class="cx"> {
</span><ins>+    if (phase != ResolveMaxContentMaximums || !track.growthLimitCap())
+        return;
+
+    LayoutUnit distanceToCap = track.growthLimitCap().value() - track.tempSize();
+    if (distanceToCap &lt;= 0)
+        return;
+
+    growthShare = std::min(growthShare, distanceToCap);
+}
+
+template &lt;TrackSizeComputationPhase phase&gt;
+void RenderGrid::distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp; tracks, Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, LayoutUnit&amp; freeSpace) const
+{
</ins><span class="cx">     ASSERT(freeSpace &gt;= 0);
</span><span class="cx"> 
</span><span class="cx">     for (auto* track : tracks)
</span><del>-        track-&gt;tempSize() = trackSizeForTrackSizeComputationPhase(phase, *track, ForbidInfinity);
</del><ins>+        track-&gt;setTempSize(trackSizeForTrackSizeComputationPhase(phase, *track, ForbidInfinity));
</ins><span class="cx"> 
</span><span class="cx">     if (freeSpace &gt; 0) {
</span><span class="cx">         std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
</span><span class="lines">@@ -1354,8 +1409,9 @@
</span><span class="cx">             if (trackGrowthPotential &gt; 0 || infiniteGrowthPotential) {
</span><span class="cx">                 LayoutUnit availableLogicalSpaceShare = freeSpace / (tracksSize - i);
</span><span class="cx">                 LayoutUnit growthShare = infiniteGrowthPotential ? availableLogicalSpaceShare : std::min(availableLogicalSpaceShare, trackGrowthPotential);
</span><ins>+                clampGrowthShareIfNeeded(phase, track, growthShare);
</ins><span class="cx">                 ASSERT_WITH_MESSAGE(growthShare &gt;= 0, &quot;We should never shrink any grid track or else we can't guarantee we abide by our min-sizing function. We can still have 0 as growthShare if the amount of tracks greatly exceeds the freeSpace.&quot;);
</span><del>-                track.tempSize() += growthShare;
</del><ins>+                track.growTempSize(growthShare);
</ins><span class="cx">                 freeSpace -= growthShare;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="lines">@@ -1362,11 +1418,17 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (freeSpace &gt; 0 &amp;&amp; growBeyondGrowthLimitsTracks) {
</span><ins>+        // We need to sort them because there might be tracks with growth limit caps (like the ones
+        // with fit-content()) which cannot indefinitely grow over the limits.
+        if (phase == ResolveMaxContentMaximums)
+            std::sort(growBeyondGrowthLimitsTracks-&gt;begin(), growBeyondGrowthLimitsTracks-&gt;end(), sortByGridTrackGrowthPotential);
+
</ins><span class="cx">         unsigned tracksGrowingBeyondGrowthLimitsSize = growBeyondGrowthLimitsTracks-&gt;size();
</span><span class="cx">         for (unsigned i = 0; i &lt; tracksGrowingBeyondGrowthLimitsSize; ++i) {
</span><span class="cx">             GridTrack* track = growBeyondGrowthLimitsTracks-&gt;at(i);
</span><span class="cx">             LayoutUnit growthShare = freeSpace / (tracksGrowingBeyondGrowthLimitsSize - i);
</span><del>-            track-&gt;tempSize() += growthShare;
</del><ins>+            clampGrowthShareIfNeeded(phase, *track, growthShare);
+            track-&gt;growTempSize(growthShare);
</ins><span class="cx">             freeSpace -= growthShare;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -1379,11 +1441,10 @@
</span><span class="cx"> bool RenderGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection direction, GridSizingData&amp; sizingData)
</span><span class="cx"> {
</span><span class="cx">     const Vector&lt;GridTrack&gt;&amp; tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
</span><del>-    const LayoutUnit maxSize = sizingData.freeSpaceForDirection(direction).valueOr(0);
</del><ins>+    const LayoutUnit maxSize = sizingData.freeSpace(direction).valueOr(0);
</ins><span class="cx">     for (unsigned i = 0; i &lt; tracks.size(); ++i) {
</span><span class="cx">         const GridTrackSize&amp; trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
</span><del>-        const GridLength&amp; minTrackBreadth = trackSize.minTrackBreadth();
-        if (computeUsedBreadthOfMinLength(minTrackBreadth, maxSize) &gt; tracks[i].baseSize())
</del><ins>+        if (computeUsedBreadthOfMinLength(trackSize, maxSize) &gt; tracks[i].baseSize())
</ins><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx">     return true;
</span><span class="lines">@@ -1798,7 +1859,7 @@
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData&amp; sizingData)
</span><span class="cx"> {
</span><del>-    Optional&lt;LayoutUnit&gt; freeSpace = sizingData.freeSpaceForDirection(direction);
</del><ins>+    Optional&lt;LayoutUnit&gt; freeSpace = sizingData.freeSpace(direction);
</ins><span class="cx">     if (!freeSpace
</span><span class="cx">         || freeSpace.value() &lt;= 0
</span><span class="cx">         || (direction == ForColumns &amp;&amp; style().resolvedJustifyContentDistribution(contentAlignmentNormalBehaviorGrid()) != ContentDistributionStretch)
</span><span class="lines">@@ -1823,7 +1884,7 @@
</span><span class="cx">         auto&amp; track = tracks[trackIndex];
</span><span class="cx">         track.setBaseSize(track.baseSize() + sizeToIncrease);
</span><span class="cx">     }
</span><del>-    sizingData.setFreeSpaceForDirection(direction, Optional&lt;LayoutUnit&gt;(0));
</del><ins>+    sizingData.setFreeSpace(direction, Optional&lt;LayoutUnit&gt;(0));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RenderGrid::layoutGridItems(GridSizingData&amp; sizingData)
</span><span class="lines">@@ -2071,7 +2132,7 @@
</span><span class="cx">     unsigned numberOfLines = numberOfTracks + 1;
</span><span class="cx">     unsigned lastLine = numberOfLines - 1;
</span><span class="cx"> 
</span><del>-    ContentAlignmentData offset = computeContentPositionAndDistributionOffset(direction, sizingData.freeSpaceForDirection(direction).value(), numberOfTracks);
</del><ins>+    ContentAlignmentData offset = computeContentPositionAndDistributionOffset(direction, sizingData.freeSpace(direction).value(), numberOfTracks);
</ins><span class="cx">     auto&amp; positions = isRowAxis ? m_columnPositions : m_rowPositions;
</span><span class="cx">     positions.resize(numberOfLines);
</span><span class="cx">     auto borderAndPadding = isRowAxis ? borderAndPaddingLogicalLeft() : borderAndPaddingBefore();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderGridh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderGrid.h (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderGrid.h	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/rendering/RenderGrid.h	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -44,6 +44,15 @@
</span><span class="cx"> 
</span><span class="cx"> enum GridAxisPosition {GridAxisStart, GridAxisEnd, GridAxisCenter};
</span><span class="cx"> 
</span><ins>+enum TrackSizeComputationPhase {
+    ResolveIntrinsicMinimums,
+    ResolveContentBasedMinimums,
+    ResolveMaxContentMinimums,
+    ResolveIntrinsicMaximums,
+    ResolveMaxContentMaximums,
+    MaximizeTracks,
+};
+
</ins><span class="cx"> class RenderGrid final : public RenderBlock {
</span><span class="cx"> public:
</span><span class="cx">     RenderGrid(Element&amp;, RenderStyle&amp;&amp;);
</span><span class="lines">@@ -75,8 +84,8 @@
</span><span class="cx">     class GridSizingData;
</span><span class="cx">     enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
</span><span class="cx">     void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&amp;, LayoutUnit&amp; baseSizesWithoutMaximization, LayoutUnit&amp; growthLimitsWithoutMaximization) const;
</span><del>-    LayoutUnit computeUsedBreadthOfMinLength(const GridLength&amp;, LayoutUnit maxSize) const;
-    LayoutUnit computeUsedBreadthOfMaxLength(const GridLength&amp;, LayoutUnit usedBreadth, LayoutUnit maxSize) const;
</del><ins>+    LayoutUnit computeUsedBreadthOfMinLength(const GridTrackSize&amp;, LayoutUnit maxSize) const;
+    LayoutUnit computeUsedBreadthOfMaxLength(const GridTrackSize&amp;, LayoutUnit usedBreadth, LayoutUnit maxSize) const;
</ins><span class="cx">     void resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection, GridSizingData&amp;) const;
</span><span class="cx"> 
</span><span class="cx">     void ensureGridSize(unsigned maximumRowSize, unsigned maximumColumnSize);
</span><span class="lines">@@ -114,19 +123,6 @@
</span><span class="cx">     void populateGridPositionsForDirection(GridSizingData&amp;, GridTrackSizingDirection);
</span><span class="cx">     void clearGrid();
</span><span class="cx"> 
</span><del>-    enum TrackSizeRestriction {
-        AllowInfinity,
-        ForbidInfinity,
-    };
-    enum TrackSizeComputationPhase {
-        ResolveIntrinsicMinimums,
-        ResolveContentBasedMinimums,
-        ResolveMaxContentMinimums,
-        ResolveIntrinsicMaximums,
-        ResolveMaxContentMaximums,
-        MaximizeTracks,
-    };
-    static const LayoutUnit&amp; trackSizeForTrackSizeComputationPhase(TrackSizeComputationPhase, GridTrack&amp;, TrackSizeRestriction);
</del><span class="cx">     static bool shouldProcessTrackForTrackSizeComputationPhase(TrackSizeComputationPhase, const GridTrackSize&amp;);
</span><span class="cx">     static bool trackShouldGrowBeyondGrowthLimitsForTrackSizeComputationPhase(TrackSizeComputationPhase, const GridTrackSize&amp;);
</span><span class="cx">     static void markAsInfinitelyGrowableForTrackSizeComputationPhase(TrackSizeComputationPhase, GridTrack&amp;);
</span><span class="lines">@@ -136,7 +132,7 @@
</span><span class="cx">     typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange;
</span><span class="cx">     void resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection, const GridSpan&amp;, RenderBox&amp; gridItem, GridTrack&amp;, GridSizingData&amp;) const;
</span><span class="cx">     template &lt;TrackSizeComputationPhase&gt; void resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection, GridSizingData&amp;, const GridItemsSpanGroupRange&amp;) const;
</span><del>-    template &lt;TrackSizeComputationPhase&gt; void distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp;, const Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, LayoutUnit&amp; availableLogicalSpace) const;
</del><ins>+    template &lt;TrackSizeComputationPhase&gt; void distributeSpaceToTracks(Vector&lt;GridTrack*&gt;&amp;, Vector&lt;GridTrack*&gt;* growBeyondGrowthLimitsTracks, LayoutUnit&amp; availableLogicalSpace) const;
</ins><span class="cx"> 
</span><span class="cx">     typedef HashSet&lt;unsigned, DefaultHash&lt;unsigned&gt;::Hash, WTF::UnsignedWithZeroKeyHashTraits&lt;unsigned&gt;&gt; TrackIndexSet;
</span><span class="cx">     double computeFlexFactorUnitSize(const Vector&lt;GridTrack&gt;&amp;, GridTrackSizingDirection, SizingOperation, double flexFactorSum, LayoutUnit leftOverSpace, const Vector&lt;unsigned, 8&gt;&amp; flexibleTracksIndexes, std::unique_ptr&lt;TrackIndexSet&gt; tracksToTreatAsInflexible = nullptr) const;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleGridTrackSizeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/GridTrackSize.h (205965 => 205966)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/GridTrackSize.h	2016-09-15 09:24:56 UTC (rev 205965)
+++ trunk/Source/WebCore/rendering/style/GridTrackSize.h	2016-09-15 09:45:36 UTC (rev 205966)
</span><span class="lines">@@ -40,16 +40,31 @@
</span><span class="cx"> 
</span><span class="cx"> enum GridTrackSizeType {
</span><span class="cx">     LengthTrackSizing,
</span><del>-    MinMaxTrackSizing
</del><ins>+    MinMaxTrackSizing,
+    FitContentTrackSizing
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+// This class represents a &lt;track-size&gt; from the spec. Althought there are 3 different types of
+// &lt;track-size&gt; there is always an equivalent minmax() representation that could represent any of
+// them. The only special case is fit-content(argument) which is similar to minmax(auto,
+// max-content) except that the track size is clamped at argument if it is greater than the auto
+// minimum. At the GridTrackSize level we don't need to worry about clamping so we treat that case
+// exactly as auto.
+//
+// We're using a separate attribute to store fit-content argument even though we could directly use
+// m_maxTrackBreadth. The reason why we don't do it is because the maxTrackBreadh() call is a hot
+// spot, so adding a conditional statement there (to distinguish between fit-content and any other
+// case) was causing a severe performance drop.
</ins><span class="cx"> class GridTrackSize {
</span><span class="cx"> public:
</span><del>-    GridTrackSize(const GridLength&amp; length)
-        : m_type(LengthTrackSizing)
-        , m_minTrackBreadth(length)
-        , m_maxTrackBreadth(length)
</del><ins>+    GridTrackSize(const GridLength&amp; length, GridTrackSizeType trackSizeType = LengthTrackSizing)
+        : m_type(trackSizeType)
+        , m_minTrackBreadth(trackSizeType == FitContentTrackSizing ? Length(Auto) : length)
+        , m_maxTrackBreadth(trackSizeType == FitContentTrackSizing ? Length(Auto) : length)
+        , m_fitContentTrackBreadth(trackSizeType == FitContentTrackSizing ? length : GridLength(Length(Fixed)))
</ins><span class="cx">     {
</span><ins>+        ASSERT(trackSizeType == LengthTrackSizing || trackSizeType == FitContentTrackSizing);
+        ASSERT(trackSizeType != FitContentTrackSizing || length.isLength());
</ins><span class="cx">         cacheMinMaxTrackBreadthTypes();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -57,28 +72,25 @@
</span><span class="cx">         : m_type(MinMaxTrackSizing)
</span><span class="cx">         , m_minTrackBreadth(minTrackBreadth)
</span><span class="cx">         , m_maxTrackBreadth(maxTrackBreadth)
</span><ins>+        , m_fitContentTrackBreadth(GridLength(Length(Fixed)))
</ins><span class="cx">     {
</span><span class="cx">         cacheMinMaxTrackBreadthTypes();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    const GridLength&amp; length() const
</del><ins>+    const GridLength&amp; fitContentTrackBreadth() const
</ins><span class="cx">     {
</span><del>-        ASSERT(m_type == LengthTrackSizing);
-        ASSERT(m_minTrackBreadth == m_maxTrackBreadth);
-        const GridLength&amp; minTrackBreadth = m_minTrackBreadth;
-        return minTrackBreadth;
</del><ins>+        ASSERT(m_type == FitContentTrackSizing);
+        return m_fitContentTrackBreadth;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const GridLength&amp; minTrackBreadth() const { return m_minTrackBreadth; }
</span><del>-
</del><span class="cx">     const GridLength&amp; maxTrackBreadth() const { return m_maxTrackBreadth; }
</span><span class="cx"> 
</span><span class="cx">     GridTrackSizeType type() const { return m_type; }
</span><span class="cx"> 
</span><span class="cx">     bool isContentSized() const { return m_minTrackBreadth.isContentSized() || m_maxTrackBreadth.isContentSized(); }
</span><ins>+    bool isFitContent() const { return m_type == FitContentTrackSizing; }
</ins><span class="cx"> 
</span><del>-    bool isPercentage() const { return m_type == LengthTrackSizing &amp;&amp; length().isLength() &amp;&amp; length().length().isPercentOrCalculated(); }
-
</del><span class="cx">     bool operator==(const GridTrackSize&amp; other) const
</span><span class="cx">     {
</span><span class="cx">         return m_type == other.m_type &amp;&amp; m_minTrackBreadth == other.m_minTrackBreadth &amp;&amp; m_maxTrackBreadth == other.m_maxTrackBreadth;
</span><span class="lines">@@ -111,12 +123,14 @@
</span><span class="cx">     GridTrackSizeType m_type;
</span><span class="cx">     GridLength m_minTrackBreadth;
</span><span class="cx">     GridLength m_maxTrackBreadth;
</span><del>-    bool m_minTrackBreadthIsAuto;
-    bool m_minTrackBreadthIsMaxContent;
-    bool m_minTrackBreadthIsMinContent;
-    bool m_maxTrackBreadthIsAuto;
-    bool m_maxTrackBreadthIsMaxContent;
-    bool m_maxTrackBreadthIsMinContent;
</del><ins>+    GridLength m_fitContentTrackBreadth;
+
+    bool m_minTrackBreadthIsAuto : 1;
+    bool m_maxTrackBreadthIsAuto : 1;
+    bool m_minTrackBreadthIsMaxContent : 1;
+    bool m_minTrackBreadthIsMinContent : 1;
+    bool m_maxTrackBreadthIsMaxContent : 1;
+    bool m_maxTrackBreadthIsMinContent : 1;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>


More information about the webkit-changes mailing list