[CSS Grid Layout] Add parsing for named grid lines
authorsvillar@igalia.com <svillar@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Sep 2013 19:14:41 +0000 (19:14 +0000)
committersvillar@igalia.com <svillar@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Sep 2013 19:14:41 +0000 (19:14 +0000)
https://bugs.webkit.org/show_bug.cgi?id=119540

Reviewed by Andreas Kling.

From Blink r150381,r150587 by <jchaffraix@chromium.org>

Source/WebCore:

Adds parsing support for named grid lines at <grid-line> level,
i.e., inside grid-{row|column}-{start|end}. This change covers
only the parsing, layout changes coming in a follow up patch.

* css/CSSComputedStyleDeclaration.cpp:
(WebCore::valueForGridPosition):
* css/CSSParser.cpp:
(WebCore::CSSParser::parseIntegerOrStringFromGridPosition):
(WebCore::CSSParser::parseGridPosition):
* css/CSSParser.h:
* css/StyleResolver.cpp:
(WebCore::createGridPosition):
* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::resolveGridPositionFromStyle):
* rendering/style/GridPosition.h:
(WebCore::GridPosition::setExplicitPosition):
(WebCore::GridPosition::setSpanPosition):
(WebCore::GridPosition::integerPosition):
(WebCore::GridPosition::namedGridLine):

LayoutTests:

Added several new test cases which include different types of
named grid lines, this means including the names at different
positions, multiple names per line or mixing names with keywords
like 'span'.

* fast/css-grid-layout/grid-item-column-row-get-set-expected.txt:
* fast/css-grid-layout/grid-item-column-row-get-set.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@154996 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/css-grid-layout/grid-item-column-row-get-set-expected.txt
LayoutTests/fast/css-grid-layout/grid-item-column-row-get-set.html
Source/WebCore/ChangeLog
Source/WebCore/css/CSSComputedStyleDeclaration.cpp
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/CSSParser.h
Source/WebCore/css/StyleResolver.cpp
Source/WebCore/rendering/RenderGrid.cpp
Source/WebCore/rendering/style/GridPosition.h

index d234bbd..8b01985 100644 (file)
@@ -1,3 +1,20 @@
+2013-08-28  Sergio Villar Senin  <svillar@igalia.com>
+
+        [CSS Grid Layout] Add parsing for named grid lines
+        https://bugs.webkit.org/show_bug.cgi?id=119540
+
+        Reviewed by Andreas Kling.
+
+        From Blink r150381,r150587 by <jchaffraix@chromium.org>
+
+        Added several new test cases which include different types of
+        named grid lines, this means including the names at different
+        positions, multiple names per line or mixing names with keywords
+        like 'span'.
+
+        * fast/css-grid-layout/grid-item-column-row-get-set-expected.txt:
+        * fast/css-grid-layout/grid-item-column-row-get-set.html:
+
 2013-09-03  Alexey Proskuryakov  <ap@apple.com>
 
         [Mac] Hyphenation respects regional format settings language instead of primary language
index 05888ab..fa01ae4 100644 (file)
@@ -76,6 +76,24 @@ PASS getComputedStyle(gridItemWithNoSpaceElement, '').getPropertyValue('-webkit-
 PASS getComputedStyle(gridItemWithNoSpaceElement, '').getPropertyValue('-webkit-grid-row') is "5 / auto"
 PASS getComputedStyle(gridItemWithNoSpaceElement, '').getPropertyValue('-webkit-grid-row-start') is "5"
 PASS getComputedStyle(gridItemWithNoSpaceElement, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-column') is "1 first / auto"
+PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-column-start') is "1 first"
+PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-row') is "1 last / auto"
+PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-row-start') is "1 last"
+PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-column') is "1 / span 1 first"
+PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-column-start') is "1"
+PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-column-end') is "span 1 first"
+PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-row') is "-1 / span 1 last"
+PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-row-start') is "-1"
+PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-row-end') is "span 1 last"
+PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-column') is "1 / span 3 first"
+PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-column-start') is "1"
+PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-column-end') is "span 3 first"
+PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-row') is "-1 / span 2 last"
+PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-row-start') is "-1"
+PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-row-end') is "span 2 last"
 
 Test the initial value
 PASS getComputedStyle(element, '').getPropertyValue('-webkit-grid-column') is 'auto / auto'
@@ -140,6 +158,30 @@ PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end')
 PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "5 / span 1"
 PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "5"
 PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 1"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "span 1 first / 3"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "span 1 first"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "3"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "5 / span 1 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "5"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 1 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "1 first / 1 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "1 first"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "1 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "1 nav / span 1 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "1 nav"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 1 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "3 first / 2 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "3 first"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "2 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "5 nav / span 7 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "5 nav"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 7 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "span 3 first / -3 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "span 3 first"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "-3 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "span 2 last / -1 nav"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "span 2 last"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "-1 nav"
 
 Test setting grid-column and grid-row back to 'auto' through JS
 PASS getComputedStyle(element, '').getPropertyValue('-webkit-grid-column') is '18 / 19'
@@ -228,6 +270,138 @@ PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end')
 PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
 PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
 PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
+PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 950e2bb..bfc10a1 100644 (file)
@@ -51,6 +51,18 @@ if (window.testRunner)
     -webkit-grid-column: auto/1;
     -webkit-grid-row: 5/auto;
 }
+.gridItemWithString {
+    -webkit-grid-column: "first";
+    -webkit-grid-row: "last";
+}
+.gridItemWithSpanString {
+    -webkit-grid-column: 1 /span "first";
+    -webkit-grid-row: -1 / span "last";
+}
+.gridItemWithSpanNumberString {
+    -webkit-grid-column: 1 /span 3 "first";
+    -webkit-grid-row: -1 / "last" 2 span ;
+}
 </style>
 <script src="../js/resources/js-test-pre.js"></script>
 </head>
@@ -68,6 +80,9 @@ if (window.testRunner)
 <div class="gridItemWith2OnlySpan" id="gridItemWith2OnlySpanElement"></div>
 <div class="gridItemWithNegativePositiveInteger gridItemWithBothLongHand" id="gridItemWithBothShortLongHandElement"></div>
 <div class="gridItemWithNoSpace" id="gridItemWithNoSpaceElement"></div>
+<div class="gridItemWithString" id="gridItemWithString"></div>
+<div class="gridItemWithSpanString" id="gridItemWithSpanString"></div>
+<div class="gridItemWithSpanNumberString" id="gridItemWithSpanNumberString"></div>
 <script>
     description('Test that setting and getting grid-column and grid-row works as expected');
 
@@ -84,6 +99,9 @@ if (window.testRunner)
     testColumnRowCSSParsing("gridItemWith2AutoElement", "auto / auto" , "auto / auto");
     testColumnRowCSSParsing("gridItemWithBothShortLongHandElement", "10 / 11", "4 / 5");
     testColumnRowCSSParsing("gridItemWithNoSpaceElement", "auto / 1", "5 / auto");
+    testColumnRowCSSParsing("gridItemWithString", "1 first / auto", "1 last / auto");
+    testColumnRowCSSParsing("gridItemWithSpanString", "1 / span 1 first", "-1 / span 1 last");
+    testColumnRowCSSParsing("gridItemWithSpanNumberString", "1 / span 3 first", "-1 / span 2 last");
 
     debug("");
     debug("Test the initial value");
@@ -107,6 +125,10 @@ if (window.testRunner)
     testColumnRowJSParsing("4 / auto", "5 / auto");
     testColumnRowJSParsing("auto / 5", "auto / 8");
     testColumnRowJSParsing("span / 3", "5 / span", "span 1 / 3", "5 / span 1");
+    testColumnRowJSParsing("'first' span / 3", "5 / 'last' span", "span 1 first / 3", "5 / span 1 last");
+    testColumnRowJSParsing("'first' / 'last'", "'nav' / 'last' span", "1 first / 1 last", "1 nav / span 1 last");
+    testColumnRowJSParsing("3 'first' / 2 'last'", "5 'nav' / 'last' 7 span", "3 first / 2 last", "5 nav / span 7 last");
+    testColumnRowJSParsing("3 'first' span / -3 'last'", "'last' 2 span / -1 'nav'", "span 3 first / -3 last", "span 2 last / -1 nav");
 
     debug("");
     debug("Test setting grid-column and grid-row back to 'auto' through JS");
@@ -143,12 +165,38 @@ if (window.testRunner)
 
     testColumnRowInvalidJSParsing("span span / span span", "span span / span span");
 
-    // Negative integer or 0 are invalid.
-    testColumnRowInvalidJSParsing("span -1 / -2 span", "-3 span / span -4");
-    testColumnRowInvalidJSParsing("0 span / span 0", "span 0 / 0 span");
+    // More than 1 <integer> and / or <string>.
+    testColumnRowInvalidJSParsing("5 5 / span 2", "4 4 / 3 span");
+    testColumnRowInvalidJSParsing("5 'first' 'last' / span 2", "'first' 4 'last' / 3 span");
+    testColumnRowInvalidJSParsing("5 / 'first' 'last' 2", "4 / 'first' 3 'last'");
+    testColumnRowInvalidJSParsing("'first' 'last' / span 2", "'first' 'last' / 3 span");
+    testColumnRowInvalidJSParsing("5 / 'first' 'last'", "4 / 'first' 'last'");
+    testColumnRowInvalidJSParsing("5 5 span / 2", "span 4 4 / 3");
+    testColumnRowInvalidJSParsing("span 3 5 / 1", "5 span 4 / 3");
+    testColumnRowInvalidJSParsing("span 'last' 'first' / 1", "span 'first' 'last' / 3");
+    testColumnRowInvalidJSParsing("2 / span 'last' 'first'", "3 / span 'first' 'last'");
+    testColumnRowInvalidJSParsing("span 1 'last' 'first' / 1", "span 'first' 'last' 7 / 3");
+    testColumnRowInvalidJSParsing("2 / span 'last' 3 'first'", "3 / span 'first' 5 'last'");
+    testColumnRowInvalidJSParsing("1 span 2 'first' / 1", "1 span 'last' 7 / 3");
+    testColumnRowInvalidJSParsing("2 / 3 span 3 'first'", "3 / 5 span 'first' 5");
+
+    // Negative integer or 0 are invalid for spans.
+    testColumnRowInvalidJSParsing("span -1 / -2", "-3 span / -4");
+    testColumnRowInvalidJSParsing("-1 / -2 span", "-3 / span -4");
+    testColumnRowInvalidJSParsing("0 span / 0", "span 0 / 0");
+    testColumnRowInvalidJSParsing("0 / span 0", "0 / 0 span");
+    testColumnRowInvalidJSParsing("span -3 'first' / 3 'last'", "'last' -2 span / 1 'nav'");
 
     // Spans for both initial / end values are not allowed.
     testColumnRowInvalidJSParsing("5 span / span 2", "span 4 / 3 span");
+    testColumnRowInvalidJSParsing("'first' span / span 'last'", "span 4 'first' / 3 span 'last'");
+    testColumnRowInvalidJSParsing("'first' 3 span / span 'last'", "span 'first' / 2 span 'last'");
+    testColumnRowInvalidJSParsing("'first' -1 span / span 'last'", "span -2 'first' / span 'last'");
+
+    // We don't allow span to be between the <integer> and the <string>.
+    testColumnRowInvalidJSParsing("'first' span 1 / 'last'", "2 span 'first' / 'last'");
+    testColumnRowInvalidJSParsing("3 'first' / 2 span 'last'", "5 'nav' / 'last' span 7");
+    testColumnRowInvalidJSParsing("3 / 1 span 2", "5 / 3 span 3");
 </script>
 <script src="../js/resources/js-test-post.js"></script>
 </body>
index 6b8e5e1..c63dc33 100644 (file)
@@ -1,3 +1,32 @@
+2013-08-28  Sergio Villar Senin  <svillar@igalia.com>
+
+        [CSS Grid Layout] Add parsing for named grid lines
+        https://bugs.webkit.org/show_bug.cgi?id=119540
+
+        Reviewed by Andreas Kling.
+
+        From Blink r150381,r150587 by <jchaffraix@chromium.org>
+
+        Adds parsing support for named grid lines at <grid-line> level,
+        i.e., inside grid-{row|column}-{start|end}. This change covers
+        only the parsing, layout changes coming in a follow up patch.
+
+        * css/CSSComputedStyleDeclaration.cpp:
+        (WebCore::valueForGridPosition):
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseIntegerOrStringFromGridPosition):
+        (WebCore::CSSParser::parseGridPosition):
+        * css/CSSParser.h:
+        * css/StyleResolver.cpp:
+        (WebCore::createGridPosition):
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::resolveGridPositionFromStyle):
+        * rendering/style/GridPosition.h:
+        (WebCore::GridPosition::setExplicitPosition):
+        (WebCore::GridPosition::setSpanPosition):
+        (WebCore::GridPosition::integerPosition):
+        (WebCore::GridPosition::namedGridLine):
+
 2013-09-03  Alexey Proskuryakov  <ap@apple.com>
 
         [Mac] Hyphenation respects regional format settings language instead of primary language
index e25e0ff..57cf0de 100644 (file)
@@ -1153,12 +1153,15 @@ static PassRefPtr<CSSValue> valueForGridPosition(const GridPosition& position)
     if (position.isAuto())
         return cssValuePool().createIdentifierValue(CSSValueAuto);
 
-    if (position.isInteger())
-        return cssValuePool().createValue(position.integerPosition(), CSSPrimitiveValue::CSS_NUMBER);
-
     RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
-    list->append(cssValuePool().createIdentifierValue(CSSValueSpan));
-    list->append(cssValuePool().createValue(position.spanPosition(), CSSPrimitiveValue::CSS_NUMBER));
+    if (position.isSpan()) {
+        list->append(cssValuePool().createIdentifierValue(CSSValueSpan));
+        list->append(cssValuePool().createValue(position.spanPosition(), CSSPrimitiveValue::CSS_NUMBER));
+    } else
+        list->append(cssValuePool().createValue(position.integerPosition(), CSSPrimitiveValue::CSS_NUMBER));
+
+    if (!position.namedGridLine().isNull())
+        list->append(cssValuePool().createValue(position.namedGridLine(), CSSPrimitiveValue::CSS_STRING));
     return list.release();
 }
 
index f4df91a..9add3ae 100644 (file)
@@ -4794,6 +4794,33 @@ bool CSSParser::parseAnimationProperty(CSSPropertyID propId, RefPtr<CSSValue>& r
     return false;
 }
 
+// The function parses [ <integer> || <string> ] in <grid-line> (which can be stand alone or with 'span').
+bool CSSParser::parseIntegerOrStringFromGridPosition(RefPtr<CSSPrimitiveValue>& numericValue, RefPtr<CSSPrimitiveValue>& gridLineName)
+{
+    CSSParserValue* value = m_valueList->current();
+    if (validUnit(value, FInteger) && value->fValue) {
+        numericValue = createPrimitiveNumericValue(value);
+        value = m_valueList->next();
+        if (value && value->unit == CSSPrimitiveValue::CSS_STRING) {
+            gridLineName = createPrimitiveStringValue(m_valueList->current());
+            m_valueList->next();
+        }
+        return true;
+    }
+
+    if (value->unit == CSSPrimitiveValue::CSS_STRING) {
+        gridLineName = createPrimitiveStringValue(m_valueList->current());
+        value = m_valueList->next();
+        if (value && validUnit(value, FInteger) && value->fValue) {
+            numericValue = createPrimitiveNumericValue(value);
+            m_valueList->next();
+        }
+        return true;
+    }
+
+    return false;
+}
+
 PassRefPtr<CSSValue> CSSParser::parseGridPosition()
 {
     CSSParserValue* value = m_valueList->current();
@@ -4803,38 +4830,42 @@ PassRefPtr<CSSValue> CSSParser::parseGridPosition()
     }
 
     RefPtr<CSSPrimitiveValue> numericValue;
+    RefPtr<CSSPrimitiveValue> gridLineName;
     bool hasSeenSpanKeyword = false;
 
-    if (validUnit(value, FInteger) && value->fValue) {
-        numericValue = createPrimitiveNumericValue(value);
-        value = m_valueList->next();
+    if (parseIntegerOrStringFromGridPosition(numericValue, gridLineName)) {
+        value = m_valueList->current();
         if (value && value->id == CSSValueSpan) {
             hasSeenSpanKeyword = true;
             m_valueList->next();
         }
     } else if (value->id == CSSValueSpan) {
         hasSeenSpanKeyword = true;
-        value = m_valueList->next();
-        if (value && (validUnit(value, FInteger) && value->fValue)) {
-            numericValue = createPrimitiveNumericValue(value);
-            m_valueList->next();
-        }
+        if (m_valueList->next())
+            parseIntegerOrStringFromGridPosition(numericValue, gridLineName);
     }
 
-    if (!hasSeenSpanKeyword)
-        return numericValue.release();
+    // Check that we have consumed all the value list. For shorthands, the parser will pass
+    // the whole value list (including the opposite position).
+    if (m_valueList->current() && !isForwardSlashOperator(m_valueList->current()))
+        return 0;
 
-    if (!numericValue && hasSeenSpanKeyword)
-        return cssValuePool().createIdentifierValue(CSSValueSpan);
+    // If we didn't parse anything, this is not a valid grid position.
+    if (!hasSeenSpanKeyword && !gridLineName && !numericValue)
+        return 0;
 
     // Negative numbers are not allowed for span (but are for <integer>).
-    if (numericValue && numericValue->getIntValue() < 0)
+    if (hasSeenSpanKeyword && numericValue && numericValue->getIntValue() < 0)
         return 0;
 
     RefPtr<CSSValueList> values = CSSValueList::createSpaceSeparated();
-    values->append(cssValuePool().createIdentifierValue(CSSValueSpan));
+    if (hasSeenSpanKeyword)
+        values->append(cssValuePool().createIdentifierValue(CSSValueSpan));
     if (numericValue)
         values->append(numericValue.release());
+    if (gridLineName)
+        values->append(gridLineName.release());
+    ASSERT(values->length());
     return values.release();
 }
 
index 670baa1..600d843 100644 (file)
@@ -571,6 +571,8 @@ private:
 
     bool parseColor(const String&);
 
+    bool parseIntegerOrStringFromGridPosition(RefPtr<CSSPrimitiveValue>& numericValue, RefPtr<CSSPrimitiveValue>& gridLineName);
+
     enum ParsingMode {
         NormalMode,
         MediaQueryMode,
index e377801..5a61fdc 100644 (file)
@@ -1973,30 +1973,49 @@ static bool createGridTrackList(CSSValue* value, Vector<GridTrackSize>& trackSiz
 
 static bool createGridPosition(CSSValue* value, GridPosition& position)
 {
-    // For now, we only accept: 'auto' | <integer> | span && <integer>?
+    // For now, we only accept: 'auto' | [ <integer> || <string> ] | span && <integer>?
     if (value->isPrimitiveValue()) {
+#if !ASSERT_DISABLED
         CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
-        if (primitiveValue->getValueID() == CSSValueAuto)
-            return true;
-
-        if (primitiveValue->getValueID() == CSSValueSpan) {
-            // If the <integer> is omitted, it defaults to '1'.
-            position.setSpanPosition(1);
-            return true;
-        }
-
-        ASSERT(primitiveValue->isNumber());
-        position.setIntegerPosition(primitiveValue->getIntValue());
+        ASSERT(primitiveValue->getValueID() == CSSValueAuto);
+#endif
         return true;
     }
 
     ASSERT_WITH_SECURITY_IMPLICATION(value->isValueList());
     CSSValueList* values = static_cast<CSSValueList*>(value);
-    ASSERT(values->length() == 2);
-    ASSERT_WITH_SECURITY_IMPLICATION(values->itemWithoutBoundsCheck(1)->isPrimitiveValue());
-    CSSPrimitiveValue* numericValue = static_cast<CSSPrimitiveValue*>(values->itemWithoutBoundsCheck(1));
-    ASSERT(numericValue->isNumber());
-    position.setSpanPosition(numericValue->getIntValue());
+    ASSERT(values->length());
+
+    bool isSpanPosition = false;
+    // The specification makes the <integer> optional, in which case it default to '1'.
+    int gridLineNumber = 1;
+    String gridLineName;
+
+    CSSValueListIterator it = values;
+    CSSPrimitiveValue* currentValue = static_cast<CSSPrimitiveValue*>(it.value());
+    if (currentValue->getValueID() == CSSValueSpan) {
+        isSpanPosition = true;
+        it.advance();
+        currentValue = it.hasMore() ? static_cast<CSSPrimitiveValue*>(it.value()) : 0;
+    }
+
+    if (currentValue && currentValue->isNumber()) {
+        gridLineNumber = currentValue->getIntValue();
+        it.advance();
+        currentValue = it.hasMore() ? static_cast<CSSPrimitiveValue*>(it.value()) : 0;
+    }
+
+    if (currentValue && currentValue->isString()) {
+        gridLineName = currentValue->getStringValue();
+        it.advance();
+    }
+
+    ASSERT(!it.hasMore());
+    if (isSpanPosition)
+        position.setSpanPosition(gridLineNumber, gridLineName);
+    else
+        position.setExplicitPosition(gridLineNumber, gridLineName);
+
     return true;
 }
 
index cf44df9..c4dc55a 100644 (file)
@@ -766,7 +766,7 @@ size_t RenderGrid::resolveGridPositionFromStyle(const GridPosition& position, Gr
 {
     // FIXME: Handle other values for grid-{row,column} like ranges or line names.
     switch (position.type()) {
-    case IntegerPosition: {
+    case ExplicitPosition: {
         ASSERT(position.integerPosition());
         if (position.isPositive())
             return adjustGridPositionForSide(position.integerPosition() - 1, side);
index a099c4f..aed0742 100644 (file)
 #ifndef GridPosition_h
 #define GridPosition_h
 
+#include <wtf/text/WTFString.h>
+
 namespace WebCore {
 
 enum GridPositionType {
     AutoPosition,
-    IntegerPosition,
+    ExplicitPosition, // [ <integer> || <string> ]
     SpanPosition
 };
 
@@ -51,30 +53,37 @@ public:
 
     GridPositionType type() const { return m_type; }
     bool isAuto() const { return m_type == AutoPosition; }
-    bool isInteger() const { return m_type == IntegerPosition; }
     bool isSpan() const { return m_type == SpanPosition; }
 
-    void setIntegerPosition(int position)
+    void setExplicitPosition(int position, const String& namedGridLine)
     {
-        m_type = IntegerPosition;
+        m_type = ExplicitPosition;
         m_integerPosition = position;
+        m_namedGridLine = namedGridLine;
     }
 
     // 'span' values cannot be negative, yet we reuse the <integer> position which can
     // be. This means that we have to convert the span position to an integer, losing
     // some precision here. It shouldn't be an issue in practice though.
-    void setSpanPosition(int position)
+    void setSpanPosition(int position, const String& namedGridLine)
     {
         m_type = SpanPosition;
         m_integerPosition = position;
+        m_namedGridLine = namedGridLine;
     }
 
     int integerPosition() const
     {
-        ASSERT(type() == IntegerPosition);
+        ASSERT(type() == ExplicitPosition);
         return m_integerPosition;
     }
 
+    String namedGridLine() const
+    {
+        ASSERT(type() == ExplicitPosition || type() == SpanPosition);
+        return m_namedGridLine;
+    }
+
     int spanPosition() const
     {
         ASSERT(type() == SpanPosition);
@@ -93,6 +102,7 @@ public:
 private:
     GridPositionType m_type;
     int m_integerPosition;
+    String m_namedGridLine;
 };
 
 } // namespace WebCore