Title: [154044] trunk
Revision
154044
Author
ser...@webkit.org
Date
2013-08-14 03:40:40 -0700 (Wed, 14 Aug 2013)

Log Message

[CSS Grid Layout] Align our grid-line handling with the updated specification
https://bugs.webkit.org/show_bug.cgi?id=113546

Reviewed by Andreas Kling.

>From Blink r148091 by <jchaffr...@chromium.org>

Source/WebCore:

This change makes us match the updated specification by making
grid line numbers to always resolve against the
grid-{column|row}-start edge (the previous code would resolve
grid-{column|row}-end grid lines against the grid-{column|row}-end
edge).

To keep feature parity, negative numbers resolve against the
grid-{column|row}-end edge of the 'explicit grid'.

Test: fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution.html

* rendering/RenderGrid.cpp:
(WebCore::estimatedGridSizeForPosition):
(WebCore::RenderGrid::explicitGridColumnCount): New utility function.
(WebCore::RenderGrid::explicitGridRowCount): Ditto.
(WebCore::RenderGrid::maximumIndexInDirection): Use explicitGridXXXCount().
(WebCore::RenderGrid::resolveGridPositionsFromStyle): Check that row-end > row-start.
(WebCore::RenderGrid::resolveGridPositionFromStyle): Clamp negative values to the first line.
* rendering/RenderGrid.h:
* rendering/style/GridPosition.h:

LayoutTests:

Added a couple of new tests to cover the cases of grid resolutions
using negative integers. Negative integers must resolve against
the grid-{column|row}-end of the explicit grid.

* fast/css-grid-layout/grid-auto-flow-resolution-expected.txt:
* fast/css-grid-layout/grid-auto-flow-resolution.html:
* fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution-expected.txt: Added.
* fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution.html: Added.
* fast/css-grid-layout/grid-item-spanning-resolution-expected.txt:
* fast/css-grid-layout/grid-item-spanning-resolution.html:
* fast/css-grid-layout/resources/grid.css:
(.autoLastRowAutoLastColumn):
(.autoSecondRowAutoFirstColumn):
(.firstRowBothColumn):
(.secondRowBothColumn):
(.bothRowFirstColumn):
(.bothRowSecondColumn):
(.bothRowBothColumn):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (154043 => 154044)


--- trunk/LayoutTests/ChangeLog	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/LayoutTests/ChangeLog	2013-08-14 10:40:40 UTC (rev 154044)
@@ -1,3 +1,31 @@
+2013-08-13  Sergio Villar Senin  <svil...@igalia.com>
+
+        [CSS Grid Layout] Align our grid-line handling with the updated specification
+        https://bugs.webkit.org/show_bug.cgi?id=113546
+
+        Reviewed by Andreas Kling.
+
+        From Blink r148091 by <jchaffr...@chromium.org>
+
+        Added a couple of new tests to cover the cases of grid resolutions
+        using negative integers. Negative integers must resolve against
+        the grid-{column|row}-end of the explicit grid.
+
+        * fast/css-grid-layout/grid-auto-flow-resolution-expected.txt:
+        * fast/css-grid-layout/grid-auto-flow-resolution.html:
+        * fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution-expected.txt: Added.
+        * fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution.html: Added.
+        * fast/css-grid-layout/grid-item-spanning-resolution-expected.txt:
+        * fast/css-grid-layout/grid-item-spanning-resolution.html:
+        * fast/css-grid-layout/resources/grid.css:
+        (.autoLastRowAutoLastColumn):
+        (.autoSecondRowAutoFirstColumn):
+        (.firstRowBothColumn):
+        (.secondRowBothColumn):
+        (.bothRowFirstColumn):
+        (.bothRowSecondColumn):
+        (.bothRowBothColumn):
+
 2013-08-13  Gyuyoung Kim  <gyuyoung....@samsung.com>
 
         The length of scheme is at least five characters even when the scheme has 'web+' prefix

Modified: trunk/LayoutTests/fast/css-grid-layout/grid-auto-flow-resolution-expected.txt (154043 => 154044)


--- trunk/LayoutTests/fast/css-grid-layout/grid-auto-flow-resolution-expected.txt	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-auto-flow-resolution-expected.txt	2013-08-14 10:40:40 UTC (rev 154044)
@@ -49,3 +49,9 @@
 XXXXX XXXXX XXXXX
 XXXXX XXXXX XXXXX
 PASS
+XXXXX XXXXX XXXXX
+XXXXX XXXXX XXXXX
+PASS
+XXXXX XXXXX XXXXX
+XXXXX XXXXX XXXXX
+PASS

Modified: trunk/LayoutTests/fast/css-grid-layout/grid-auto-flow-resolution.html (154043 => 154044)


--- trunk/LayoutTests/fast/css-grid-layout/grid-auto-flow-resolution.html	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-auto-flow-resolution.html	2013-08-14 10:40:40 UTC (rev 154044)
@@ -16,8 +16,6 @@
     -webkit-grid-definition-rows: 50px 100px 150px 200px;
 }
 
-/* These 2 classes forces the grid to be sized after the grid-{end|after}, thus end up in the
-   first row / columns. */
 .overflowingRowFirstColumn {
     -webkit-grid-row: auto / 10;
     -webkit-grid-column: 1;
@@ -28,6 +26,18 @@
     -webkit-grid-column: auto / 8;
 }
 
+/* These 2 classes forces the grid to be sized after the grid-{column|row}-end, thus end up in the
+   first row / columns. */
+.negativeOverflowingRowFirstColumn {
+    -webkit-grid-row: auto / -10;
+    -webkit-grid-column: 1;
+}
+
+.secondRowNegativeOverflowingColumn {
+    -webkit-grid-row: 2;
+    -webkit-grid-column: auto / -8;
+}
+
 .unconstrainedContainer {
     /* For accurate x / y offset. */
     position: relative;
@@ -92,7 +102,7 @@
 <!-- Using some 2 positions non-spanning fixed grid-{row|column} -->
 <div class="unconstrainedContainer">
     <div class="grid bigGrid gridAutoFlowColumn">
-        <div class="sizedToGridArea autoFirstRowAutoFirstColumn" data-offset-x="300" data-offset-y="300" data-expected-width="200" data-expected-height="200">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea autoLastRowAutoLastColumn" data-offset-x="300" data-offset-y="300" data-expected-width="200" data-expected-height="200">XXXXX XXXXX XXXXX</div>
         <div class="sizedToGridArea firstAutoRowSecondAutoColumn" data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">XXXXX XXXXX XXXXX</div>
         <div class="sizedToGridArea secondRowAutoColumn" data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>
         <div class="sizedToGridArea firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>
@@ -102,7 +112,7 @@
 
 <div class="unconstrainedContainer">
     <div class="grid bigGrid gridAutoFlowRow">
-        <div class="sizedToGridArea autoFirstRowAutoFirstColumn" data-offset-x="300" data-offset-y="300" data-expected-width="200" data-expected-height="200">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea autoLastRowAutoLastColumn" data-offset-x="300" data-offset-y="300" data-expected-width="200" data-expected-height="200">XXXXX XXXXX XXXXX</div>
         <div class="sizedToGridArea firstAutoRowSecondAutoColumn" data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">XXXXX XXXXX XXXXX</div>
         <div class="sizedToGridArea secondRowAutoColumn" data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>
         <div class="sizedToGridArea firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>
@@ -110,18 +120,31 @@
     </div>
 </div>
 
+<div class="unconstrainedContainer">
+    <div class="grid bigGrid gridAutoFlowColumn">
+        <div class="sizedToGridArea overflowingRowFirstColumn" data-offset-x="0" data-offset-y="500" data-expected-width="50" data-expected-height="30">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea secondRowOverflowingColumn" data-offset-x="500" data-offset-y="50" data-expected-width="170" data-expected-height="100">XXXXX XXXXX XXXXX</div>
+    </div>
+</div>
 
 <div class="unconstrainedContainer">
+    <div class="grid bigGrid gridAutoFlowRow">
+        <div class="sizedToGridArea overflowingRowFirstColumn" data-offset-x="0" data-offset-y="500" data-expected-width="50" data-expected-height="30">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea secondRowOverflowingColumn" data-offset-x="500" data-offset-y="50" data-expected-width="170" data-expected-height="100">XXXXX XXXXX XXXXX</div>
+    </div>
+</div>
+
+<div class="unconstrainedContainer">
     <div class="grid bigGrid gridAutoFlowColumn">
-        <div class="sizedToGridArea overflowingRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>
-        <div class="sizedToGridArea secondRowOverflowingColumn" data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea negativeOverflowingRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea secondRowNegativeOverflowingColumn" data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>
     </div>
 </div>
 
 <div class="unconstrainedContainer">
     <div class="grid bigGrid gridAutoFlowRow">
-        <div class="sizedToGridArea overflowingRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>
-        <div class="sizedToGridArea secondRowOverflowingColumn" data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea negativeOverflowingRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea secondRowNegativeOverflowingColumn" data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>
     </div>
 </div>
 

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution-expected.txt (0 => 154044)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution-expected.txt	2013-08-14 10:40:40 UTC (rev 154044)
@@ -0,0 +1,10 @@
+Test that negative <integer> positions are resolved against the explicit grid (that is don't account for implicit columns and rows).
+
+XXXXXX XXXXX XXXXX
+PASS
+XXXXXX XXXXX XXXXX
+PASS
+XXXXXX XXXXX XXXXX
+PASS
+XXXXXX XXXXX XXXXX
+PASS

Added: trunk/LayoutTests/fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution.html (0 => 154044)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution.html	                        (rev 0)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution.html	2013-08-14 10:40:40 UTC (rev 154044)
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<script>
+if (window.testRunner)
+    testRunner.overridePreference("WebKitCSSGridLayoutEnabled", 1);
+</script>
+<link href="" rel="stylesheet">
+<style>
+.columnGrid {
+    -webkit-grid-definition-columns: 50px 100px;
+    /* -webkit-grid-definition-rows is left unset so that the grid items' row is implicit. */
+    font: 10px/1 Ahem;
+}
+
+.rowGrid {
+    -webkit-grid-definition-rows: 50px 100px;
+    /* -webkit-grid-definition-columns is left unset so that the grid items' column is implicit. */
+    font: 10px/1 Ahem;
+}
+</style>
+<script src=""
+<body _onload_="checkLayout('.grid');">
+
+<p>Test that negative &lt;integer&gt; positions are resolved against the explicit grid (that is don't account for implicit columns and rows).</p>
+
+<div class="constrainedContainer">
+    <div class="grid columnGrid">
+        <div class="sizedToGridArea autoRowThirdColumn" data-expected-width="60" data-expected-height="30">XXXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea autoLastRowAutoLastColumn" data-expected-width="100" data-expected-height="30"></div>
+    </div>
+</div>
+
+<div class="constrainedContainer">
+    <div class="grid columnGrid">
+        <div class="sizedToGridArea thirdRowAutoColumn" data-expected-width="50" data-expected-height="30">XXXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea autoLastRowAutoLastColumn" data-expected-width="100" data-expected-height="0"></div>
+    </div>
+</div>
+
+<div class="constrainedContainer">
+    <div class="grid rowGrid">
+        <div class="sizedToGridArea autoRowThirdColumn" data-expected-width="60" data-expected-height="50">XXXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea autoLastRowAutoLastColumn" data-expected-width="0" data-expected-height="100"></div>
+    </div>
+</div>
+
+<div class="constrainedContainer">
+    <div class="grid rowGrid">
+        <div class="sizedToGridArea thirdRowAutoColumn" data-expected-width="60" data-expected-height="30">XXXXXX XXXXX XXXXX</div>
+        <div class="sizedToGridArea autoLastRowAutoLastColumn" data-expected-width="60" data-expected-height="100"></div>
+    </div>
+</div>
+
+</body>
+</html>

Modified: trunk/LayoutTests/fast/css-grid-layout/grid-item-spanning-resolution-expected.txt (154043 => 154044)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-spanning-resolution-expected.txt	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-spanning-resolution-expected.txt	2013-08-14 10:40:40 UTC (rev 154044)
@@ -8,10 +8,6 @@
 PASS
 PASS
 PASS
-FAIL:
-Expected 240 for width, but got 160. 
-Expected 160 for offsetLeft, but got 0. 
-
-<div class="grid" data-expected-width="400" data-expected-height="300">
-    <div class="sizedToGridArea autoSecondRowAutoFirstColumn" data-offset-x="160" data-offset-y="0" data-expected-width="240" data-expected-height="90"></div>
-</div>
+PASS
+PASS
+PASS

Modified: trunk/LayoutTests/fast/css-grid-layout/grid-item-spanning-resolution.html (154043 => 154044)


--- trunk/LayoutTests/fast/css-grid-layout/grid-item-spanning-resolution.html	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/LayoutTests/fast/css-grid-layout/grid-item-spanning-resolution.html	2013-08-14 10:40:40 UTC (rev 154044)
@@ -13,11 +13,21 @@
     height: 300px;
 }
 
+.negativeOverflowRowFirstColumn {
+    -webkit-grid-row: 1 / -5;
+    -webkit-grid-column: 1;
+}
+
 .overflowRowFirstColumn {
     -webkit-grid-row: 1 / 5;
     -webkit-grid-column: 1;
 }
 
+.firstRowNegativeOverflowColumn {
+    -webkit-grid-row: 1;
+    -webkit-grid-column: 1 / -5;
+}
+
 .firstRowOverflowColumn {
     -webkit-grid-row: 1;
     -webkit-grid-column: 1 / 5;
@@ -60,25 +70,37 @@
 
 <div style="position: relative">
 <div class="grid" data-expected-width="400" data-expected-height="300">
-    <div class="sizedToGridArea overflowRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height="90"></div>
+    <div class="sizedToGridArea negativeOverflowRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height="90"></div>
 </div>
 </div>
 
 <div style="position: relative">
 <div class="grid" data-expected-width="400" data-expected-height="300">
-    <div class="sizedToGridArea firstRowOverflowColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height="90"></div>
+    <div class="sizedToGridArea overflowRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height="300"></div>
 </div>
 </div>
 
 <div style="position: relative">
 <div class="grid" data-expected-width="400" data-expected-height="300">
+    <div class="sizedToGridArea firstRowNegativeOverflowColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height="90"></div>
+</div>
+</div>
+
+<div style="position: relative">
+<div class="grid" data-expected-width="400" data-expected-height="300">
+    <div class="sizedToGridArea firstRowOverflowColumn" data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="90"></div>
+</div>
+</div>
+
+<div style="position: relative">
+<div class="grid" data-expected-width="400" data-expected-height="300">
     <div class="sizedToGridArea firstAutoRowSecondAutoColumn" data-offset-x="160" data-offset-y="0" data-expected-width="240" data-expected-height="90"></div>
 </div>
 </div>
 
 <div style="position: relative">
 <div class="grid" data-expected-width="400" data-expected-height="300">
-    <div class="sizedToGridArea autoSecondRowAutoFirstColumn" data-offset-x="160" data-offset-y="0" data-expected-width="240" data-expected-height="90"></div>
+    <div class="sizedToGridArea autoSecondRowAutoFirstColumn" data-offset-x="0" data-offset-y="90" data-expected-width="160" data-expected-height="210"></div>
 </div>
 </div>
 

Modified: trunk/LayoutTests/fast/css-grid-layout/resources/grid.css (154043 => 154044)


--- trunk/LayoutTests/fast/css-grid-layout/resources/grid.css	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/LayoutTests/fast/css-grid-layout/resources/grid.css	2013-08-14 10:40:40 UTC (rev 154044)
@@ -37,34 +37,39 @@
     -webkit-grid-column: 2 / auto;
 }
 
-.autoFirstRowAutoFirstColumn {
-    -webkit-grid-row: auto / 1;
+.autoLastRowAutoLastColumn {
+    -webkit-grid-row: auto / -1;
+    -webkit-grid-column: auto / -1;
+}
+
+.autoSecondRowAutoFirstColumn {
+    -webkit-grid-row: auto / 2;
     -webkit-grid-column: auto / 1;
 }
 
 .firstRowBothColumn {
     -webkit-grid-row: 1;
-    -webkit-grid-column: 1 / 1;
+    -webkit-grid-column: 1 / -1;
 }
 
 .secondRowBothColumn {
     -webkit-grid-row: 2;
-    -webkit-grid-column: 1 / 1;
+    -webkit-grid-column: 1 / -1;
 }
 
 .bothRowFirstColumn {
-    -webkit-grid-row: 1 / 1;
+    -webkit-grid-row: 1 / -1;
     -webkit-grid-column: 1;
 }
 
 .bothRowSecondColumn {
-    -webkit-grid-row: 1 / 1;
+    -webkit-grid-row: 1 / -1;
     -webkit-grid-column: 2;
 }
 
 .bothRowBothColumn {
-    -webkit-grid-row: 1 / 1;
-    -webkit-grid-column: 1 / 1;
+    -webkit-grid-row: 1 / -1;
+    -webkit-grid-column: 1 / -1;
 }
 
 /* Auto column / row. */

Modified: trunk/Source/WebCore/ChangeLog (154043 => 154044)


--- trunk/Source/WebCore/ChangeLog	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/Source/WebCore/ChangeLog	2013-08-14 10:40:40 UTC (rev 154044)
@@ -1,3 +1,33 @@
+2013-08-13  Sergio Villar Senin  <svil...@igalia.com>
+
+        [CSS Grid Layout] Align our grid-line handling with the updated specification
+        https://bugs.webkit.org/show_bug.cgi?id=113546
+
+        Reviewed by Andreas Kling.
+
+        From Blink r148091 by <jchaffr...@chromium.org>
+
+        This change makes us match the updated specification by making
+        grid line numbers to always resolve against the
+        grid-{column|row}-start edge (the previous code would resolve
+        grid-{column|row}-end grid lines against the grid-{column|row}-end
+        edge).
+
+        To keep feature parity, negative numbers resolve against the
+        grid-{column|row}-end edge of the 'explicit grid'.
+
+        Test: fast/css-grid-layout/grid-item-negative-integer-explicit-grid-resolution.html
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::estimatedGridSizeForPosition):
+        (WebCore::RenderGrid::explicitGridColumnCount): New utility function.
+        (WebCore::RenderGrid::explicitGridRowCount): Ditto.
+        (WebCore::RenderGrid::maximumIndexInDirection): Use explicitGridXXXCount().
+        (WebCore::RenderGrid::resolveGridPositionsFromStyle): Check that row-end > row-start.
+        (WebCore::RenderGrid::resolveGridPositionFromStyle): Clamp negative values to the first line.
+        * rendering/RenderGrid.h:
+        * rendering/style/GridPosition.h:
+
 2013-08-14  Gyuyoung Kim  <gyuyoung....@samsung.com>
 
         Add toSVGTextPathElement(), and use it

Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (154043 => 154044)


--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2013-08-14 10:40:40 UTC (rev 154044)
@@ -333,15 +333,25 @@
     if (position.isAuto())
         return 1;
 
+    // Negative explicit values never grow the grid as they are clamped against
+    // the explicit grid's size. Thus we don't special case them here.
     return std::max(position.integerPosition(), 1);
 }
 
+size_t RenderGrid::explicitGridColumnCount() const
+{
+    return style()->gridColumns().size();
+}
+
+size_t RenderGrid::explicitGridRowCount() const
+{
+    return style()->gridRows().size();
+}
+
 size_t RenderGrid::maximumIndexInDirection(TrackSizingDirection direction) const
 {
-    const Vector<GridTrackSize>& trackStyles = (direction == ForColumns) ? style()->gridColumns() : style()->gridRows();
+    size_t maximumIndex = std::max<size_t>(1, (direction == ForColumns) ? explicitGridColumnCount() : explicitGridRowCount());
 
-    size_t maximumIndex = std::max<size_t>(1, trackStyles.size());
-
     for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
         // This function bypasses the cache (cachedGridCoordinate()) as it is used to build it.
         // Also we can't call resolveGridPositionsFromStyle here as it assumes that the grid is build and we are in
@@ -748,7 +758,14 @@
         return adoptPtr(new GridSpan(initialResolvedPosition, initialResolvedPosition));
     }
 
-    return adoptPtr(new GridSpan(resolveGridPositionFromStyle(initialPosition, initialPositionSide), resolveGridPositionFromStyle(finalPosition, finalPositionSide)));
+    size_t resolvedInitialPosition = resolveGridPositionFromStyle(initialPosition, initialPositionSide);
+    size_t resolvedFinalPosition = resolveGridPositionFromStyle(finalPosition, finalPositionSide);
+
+    // If 'grid-row-end' specifies a line at or before that specified by 'grid-row-start', it computes to 'span 1'.
+    if (resolvedFinalPosition < resolvedInitialPosition)
+        resolvedFinalPosition = resolvedInitialPosition;
+
+    return adoptPtr(new GridSpan(resolvedInitialPosition, resolvedFinalPosition));
 }
 
 size_t RenderGrid::resolveGridPositionFromStyle(const GridPosition& position, GridPositionSide side) const
@@ -758,14 +775,18 @@
     // FIXME: Handle other values for grid-{row,column} like ranges or line names.
     switch (position.type()) {
     case IntegerPosition: {
-        // FIXME: What does a non-positive integer mean for a column/row?
-        size_t resolvedPosition = position.isPositive() ? position.integerPosition() - 1 : 0;
+        if (position.isPositive())
+            return position.integerPosition() - 1;
 
-        if (side == ColumnStartSide || side == RowStartSide)
-            return resolvedPosition;
+        size_t resolvedPosition = abs(position.integerPosition());
+        // FIXME: This returns one less than the expected result for side == ColumnStartSide or RowStartSide as we don't properly convert
+        // the grid line to its grid track. However this avoids the issue of growing the grid when inserting the item (e.g. -1 / auto).
+        const size_t endOfTrack = (side == ColumnStartSide || side == ColumnEndSide) ? explicitGridColumnCount() : explicitGridRowCount();
 
-        const size_t endOfTrack = (side == ColumnEndSide) ? gridColumnCount() - 1 : gridRowCount() - 1;
-        ASSERT(endOfTrack >= resolvedPosition);
+        // Per http://lists.w3.org/Archives/Public/www-style/2013Mar/0589.html, we clamp negative value to the first line.
+        if (endOfTrack < resolvedPosition)
+            return 0;
+
         return endOfTrack - resolvedPosition;
     }
     case AutoPosition:

Modified: trunk/Source/WebCore/rendering/RenderGrid.h (154043 => 154044)


--- trunk/Source/WebCore/rendering/RenderGrid.h	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/Source/WebCore/rendering/RenderGrid.h	2013-08-14 10:40:40 UTC (rev 154044)
@@ -110,6 +110,8 @@
     void distributeSpaceToTracks(Vector<GridTrack*>&, Vector<GridTrack*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter, AccumulatorGrowFunction, LayoutUnit& availableLogicalSpace);
 
     const GridTrackSize& gridTrackSize(TrackSizingDirection, size_t) const;
+    size_t explicitGridColumnCount() const;
+    size_t explicitGridRowCount() const;
     size_t maximumIndexInDirection(TrackSizingDirection) const;
 
     LayoutUnit logicalContentHeightForChild(RenderBox*, Vector<GridTrack>&);

Modified: trunk/Source/WebCore/rendering/style/GridPosition.h (154043 => 154044)


--- trunk/Source/WebCore/rendering/style/GridPosition.h	2013-08-14 10:12:38 UTC (rev 154043)
+++ trunk/Source/WebCore/rendering/style/GridPosition.h	2013-08-14 10:40:40 UTC (rev 154044)
@@ -88,7 +88,6 @@
 
 private:
     GridPositionType m_type;
-    // FIXME: This should probably be a size_t but the spec currently allows any <integer>.
     int m_integerPosition;
 };
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to