Changeset 154996 in webkit


Ignore:
Timestamp:
Sep 3, 2013 12:14:41 PM (11 years ago)
Author:
svillar@igalia.com
Message:

[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>

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:
Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r154995 r154996  
     12013-08-28  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [CSS Grid Layout] Add parsing for named grid lines
     4        https://bugs.webkit.org/show_bug.cgi?id=119540
     5
     6        Reviewed by Andreas Kling.
     7
     8        From Blink r150381,r150587 by <jchaffraix@chromium.org>
     9
     10        Added several new test cases which include different types of
     11        named grid lines, this means including the names at different
     12        positions, multiple names per line or mixing names with keywords
     13        like 'span'.
     14
     15        * fast/css-grid-layout/grid-item-column-row-get-set-expected.txt:
     16        * fast/css-grid-layout/grid-item-column-row-get-set.html:
     17
    1182013-09-03  Alexey Proskuryakov  <ap@apple.com>
    219
  • trunk/LayoutTests/fast/css-grid-layout/grid-item-column-row-get-set-expected.txt

    r154438 r154996  
    7777PASS getComputedStyle(gridItemWithNoSpaceElement, '').getPropertyValue('-webkit-grid-row-start') is "5"
    7878PASS getComputedStyle(gridItemWithNoSpaceElement, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     79PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-column') is "1 first / auto"
     80PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-column-start') is "1 first"
     81PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     82PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-row') is "1 last / auto"
     83PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-row-start') is "1 last"
     84PASS getComputedStyle(gridItemWithString, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     85PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-column') is "1 / span 1 first"
     86PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-column-start') is "1"
     87PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-column-end') is "span 1 first"
     88PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-row') is "-1 / span 1 last"
     89PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-row-start') is "-1"
     90PASS getComputedStyle(gridItemWithSpanString, '').getPropertyValue('-webkit-grid-row-end') is "span 1 last"
     91PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-column') is "1 / span 3 first"
     92PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-column-start') is "1"
     93PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-column-end') is "span 3 first"
     94PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-row') is "-1 / span 2 last"
     95PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-row-start') is "-1"
     96PASS getComputedStyle(gridItemWithSpanNumberString, '').getPropertyValue('-webkit-grid-row-end') is "span 2 last"
    7997
    8098Test the initial value
     
    141159PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "5"
    142160PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 1"
     161PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "span 1 first / 3"
     162PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "span 1 first"
     163PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "3"
     164PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "5 / span 1 last"
     165PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "5"
     166PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 1 last"
     167PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "1 first / 1 last"
     168PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "1 first"
     169PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "1 last"
     170PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "1 nav / span 1 last"
     171PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "1 nav"
     172PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 1 last"
     173PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "3 first / 2 last"
     174PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "3 first"
     175PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "2 last"
     176PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "5 nav / span 7 last"
     177PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "5 nav"
     178PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "span 7 last"
     179PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "span 3 first / -3 last"
     180PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "span 3 first"
     181PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "-3 last"
     182PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "span 2 last / -1 nav"
     183PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "span 2 last"
     184PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "-1 nav"
    143185
    144186Test setting grid-column and grid-row back to 'auto' through JS
     
    229271PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
    230272PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     273PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     274PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     275PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     276PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     277PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     278PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     279PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     280PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     281PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     282PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     283PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     284PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     285PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     286PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     287PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     288PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     289PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     290PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     291PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     292PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     293PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     294PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     295PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     296PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     297PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     298PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     299PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     300PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     301PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     302PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     303PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     304PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     305PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     306PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     307PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     308PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     309PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     310PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     311PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     312PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     313PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     314PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     315PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     316PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     317PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     318PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     319PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     320PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     321PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     322PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     323PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     324PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     325PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     326PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     327PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     328PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     329PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     330PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     331PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     332PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     333PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     334PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     335PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     336PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     337PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     338PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     339PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     340PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     341PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     342PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     343PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     344PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     345PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     346PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     347PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     348PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     349PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     350PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     351PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     352PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     353PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     354PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     355PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     356PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     357PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     358PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     359PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     360PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     361PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     362PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     363PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     364PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     365PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     366PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     367PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     368PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     369PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     370PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     371PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     372PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     373PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     374PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     375PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     376PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     377PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     378PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     379PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     380PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     381PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     382PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     383PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     384PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     385PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     386PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     387PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     388PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     389PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     390PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     391PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     392PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     393PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     394PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     395PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     396PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     397PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     398PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
     399PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column') is "auto / auto"
     400PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-start') is "auto"
     401PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-column-end') is "auto"
     402PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row') is "auto / auto"
     403PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-start') is "auto"
     404PASS getComputedStyle(gridItem, '').getPropertyValue('-webkit-grid-row-end') is "auto"
    231405PASS successfullyParsed is true
    232406
  • trunk/LayoutTests/fast/css-grid-layout/grid-item-column-row-get-set.html

    r154438 r154996  
    5151    -webkit-grid-column: auto/1;
    5252    -webkit-grid-row: 5/auto;
     53}
     54.gridItemWithString {
     55    -webkit-grid-column: "first";
     56    -webkit-grid-row: "last";
     57}
     58.gridItemWithSpanString {
     59    -webkit-grid-column: 1 /span "first";
     60    -webkit-grid-row: -1 / span "last";
     61}
     62.gridItemWithSpanNumberString {
     63    -webkit-grid-column: 1 /span 3 "first";
     64    -webkit-grid-row: -1 / "last" 2 span ;
    5365}
    5466</style>
     
    6981<div class="gridItemWithNegativePositiveInteger gridItemWithBothLongHand" id="gridItemWithBothShortLongHandElement"></div>
    7082<div class="gridItemWithNoSpace" id="gridItemWithNoSpaceElement"></div>
     83<div class="gridItemWithString" id="gridItemWithString"></div>
     84<div class="gridItemWithSpanString" id="gridItemWithSpanString"></div>
     85<div class="gridItemWithSpanNumberString" id="gridItemWithSpanNumberString"></div>
    7186<script>
    7287    description('Test that setting and getting grid-column and grid-row works as expected');
     
    85100    testColumnRowCSSParsing("gridItemWithBothShortLongHandElement", "10 / 11", "4 / 5");
    86101    testColumnRowCSSParsing("gridItemWithNoSpaceElement", "auto / 1", "5 / auto");
     102    testColumnRowCSSParsing("gridItemWithString", "1 first / auto", "1 last / auto");
     103    testColumnRowCSSParsing("gridItemWithSpanString", "1 / span 1 first", "-1 / span 1 last");
     104    testColumnRowCSSParsing("gridItemWithSpanNumberString", "1 / span 3 first", "-1 / span 2 last");
    87105
    88106    debug("");
     
    108126    testColumnRowJSParsing("auto / 5", "auto / 8");
    109127    testColumnRowJSParsing("span / 3", "5 / span", "span 1 / 3", "5 / span 1");
     128    testColumnRowJSParsing("'first' span / 3", "5 / 'last' span", "span 1 first / 3", "5 / span 1 last");
     129    testColumnRowJSParsing("'first' / 'last'", "'nav' / 'last' span", "1 first / 1 last", "1 nav / span 1 last");
     130    testColumnRowJSParsing("3 'first' / 2 'last'", "5 'nav' / 'last' 7 span", "3 first / 2 last", "5 nav / span 7 last");
     131    testColumnRowJSParsing("3 'first' span / -3 'last'", "'last' 2 span / -1 'nav'", "span 3 first / -3 last", "span 2 last / -1 nav");
    110132
    111133    debug("");
     
    144166    testColumnRowInvalidJSParsing("span span / span span", "span span / span span");
    145167
    146     // Negative integer or 0 are invalid.
    147     testColumnRowInvalidJSParsing("span -1 / -2 span", "-3 span / span -4");
    148     testColumnRowInvalidJSParsing("0 span / span 0", "span 0 / 0 span");
     168    // More than 1 <integer> and / or <string>.
     169    testColumnRowInvalidJSParsing("5 5 / span 2", "4 4 / 3 span");
     170    testColumnRowInvalidJSParsing("5 'first' 'last' / span 2", "'first' 4 'last' / 3 span");
     171    testColumnRowInvalidJSParsing("5 / 'first' 'last' 2", "4 / 'first' 3 'last'");
     172    testColumnRowInvalidJSParsing("'first' 'last' / span 2", "'first' 'last' / 3 span");
     173    testColumnRowInvalidJSParsing("5 / 'first' 'last'", "4 / 'first' 'last'");
     174    testColumnRowInvalidJSParsing("5 5 span / 2", "span 4 4 / 3");
     175    testColumnRowInvalidJSParsing("span 3 5 / 1", "5 span 4 / 3");
     176    testColumnRowInvalidJSParsing("span 'last' 'first' / 1", "span 'first' 'last' / 3");
     177    testColumnRowInvalidJSParsing("2 / span 'last' 'first'", "3 / span 'first' 'last'");
     178    testColumnRowInvalidJSParsing("span 1 'last' 'first' / 1", "span 'first' 'last' 7 / 3");
     179    testColumnRowInvalidJSParsing("2 / span 'last' 3 'first'", "3 / span 'first' 5 'last'");
     180    testColumnRowInvalidJSParsing("1 span 2 'first' / 1", "1 span 'last' 7 / 3");
     181    testColumnRowInvalidJSParsing("2 / 3 span 3 'first'", "3 / 5 span 'first' 5");
     182
     183    // Negative integer or 0 are invalid for spans.
     184    testColumnRowInvalidJSParsing("span -1 / -2", "-3 span / -4");
     185    testColumnRowInvalidJSParsing("-1 / -2 span", "-3 / span -4");
     186    testColumnRowInvalidJSParsing("0 span / 0", "span 0 / 0");
     187    testColumnRowInvalidJSParsing("0 / span 0", "0 / 0 span");
     188    testColumnRowInvalidJSParsing("span -3 'first' / 3 'last'", "'last' -2 span / 1 'nav'");
    149189
    150190    // Spans for both initial / end values are not allowed.
    151191    testColumnRowInvalidJSParsing("5 span / span 2", "span 4 / 3 span");
     192    testColumnRowInvalidJSParsing("'first' span / span 'last'", "span 4 'first' / 3 span 'last'");
     193    testColumnRowInvalidJSParsing("'first' 3 span / span 'last'", "span 'first' / 2 span 'last'");
     194    testColumnRowInvalidJSParsing("'first' -1 span / span 'last'", "span -2 'first' / span 'last'");
     195
     196    // We don't allow span to be between the <integer> and the <string>.
     197    testColumnRowInvalidJSParsing("'first' span 1 / 'last'", "2 span 'first' / 'last'");
     198    testColumnRowInvalidJSParsing("3 'first' / 2 span 'last'", "5 'nav' / 'last' span 7");
     199    testColumnRowInvalidJSParsing("3 / 1 span 2", "5 / 3 span 3");
    152200</script>
    153201<script src="../js/resources/js-test-post.js"></script>
  • trunk/Source/WebCore/ChangeLog

    r154995 r154996  
     12013-08-28  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [CSS Grid Layout] Add parsing for named grid lines
     4        https://bugs.webkit.org/show_bug.cgi?id=119540
     5
     6        Reviewed by Andreas Kling.
     7
     8        From Blink r150381,r150587 by <jchaffraix@chromium.org>
     9
     10        Adds parsing support for named grid lines at <grid-line> level,
     11        i.e., inside grid-{row|column}-{start|end}. This change covers
     12        only the parsing, layout changes coming in a follow up patch.
     13
     14        * css/CSSComputedStyleDeclaration.cpp:
     15        (WebCore::valueForGridPosition):
     16        * css/CSSParser.cpp:
     17        (WebCore::CSSParser::parseIntegerOrStringFromGridPosition):
     18        (WebCore::CSSParser::parseGridPosition):
     19        * css/CSSParser.h:
     20        * css/StyleResolver.cpp:
     21        (WebCore::createGridPosition):
     22        * rendering/RenderGrid.cpp:
     23        (WebCore::RenderGrid::resolveGridPositionFromStyle):
     24        * rendering/style/GridPosition.h:
     25        (WebCore::GridPosition::setExplicitPosition):
     26        (WebCore::GridPosition::setSpanPosition):
     27        (WebCore::GridPosition::integerPosition):
     28        (WebCore::GridPosition::namedGridLine):
     29
    1302013-09-03  Alexey Proskuryakov  <ap@apple.com>
    231
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r154906 r154996  
    11541154        return cssValuePool().createIdentifierValue(CSSValueAuto);
    11551155
    1156     if (position.isInteger())
    1157         return cssValuePool().createValue(position.integerPosition(), CSSPrimitiveValue::CSS_NUMBER);
    1158 
    11591156    RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
    1160     list->append(cssValuePool().createIdentifierValue(CSSValueSpan));
    1161     list->append(cssValuePool().createValue(position.spanPosition(), CSSPrimitiveValue::CSS_NUMBER));
     1157    if (position.isSpan()) {
     1158        list->append(cssValuePool().createIdentifierValue(CSSValueSpan));
     1159        list->append(cssValuePool().createValue(position.spanPosition(), CSSPrimitiveValue::CSS_NUMBER));
     1160    } else
     1161        list->append(cssValuePool().createValue(position.integerPosition(), CSSPrimitiveValue::CSS_NUMBER));
     1162
     1163    if (!position.namedGridLine().isNull())
     1164        list->append(cssValuePool().createValue(position.namedGridLine(), CSSPrimitiveValue::CSS_STRING));
    11621165    return list.release();
    11631166}
  • trunk/Source/WebCore/css/CSSParser.cpp

    r154877 r154996  
    47954795}
    47964796
     4797// The function parses [ <integer> || <string> ] in <grid-line> (which can be stand alone or with 'span').
     4798bool CSSParser::parseIntegerOrStringFromGridPosition(RefPtr<CSSPrimitiveValue>& numericValue, RefPtr<CSSPrimitiveValue>& gridLineName)
     4799{
     4800    CSSParserValue* value = m_valueList->current();
     4801    if (validUnit(value, FInteger) && value->fValue) {
     4802        numericValue = createPrimitiveNumericValue(value);
     4803        value = m_valueList->next();
     4804        if (value && value->unit == CSSPrimitiveValue::CSS_STRING) {
     4805            gridLineName = createPrimitiveStringValue(m_valueList->current());
     4806            m_valueList->next();
     4807        }
     4808        return true;
     4809    }
     4810
     4811    if (value->unit == CSSPrimitiveValue::CSS_STRING) {
     4812        gridLineName = createPrimitiveStringValue(m_valueList->current());
     4813        value = m_valueList->next();
     4814        if (value && validUnit(value, FInteger) && value->fValue) {
     4815            numericValue = createPrimitiveNumericValue(value);
     4816            m_valueList->next();
     4817        }
     4818        return true;
     4819    }
     4820
     4821    return false;
     4822}
     4823
    47974824PassRefPtr<CSSValue> CSSParser::parseGridPosition()
    47984825{
     
    48044831
    48054832    RefPtr<CSSPrimitiveValue> numericValue;
     4833    RefPtr<CSSPrimitiveValue> gridLineName;
    48064834    bool hasSeenSpanKeyword = false;
    48074835
    4808     if (validUnit(value, FInteger) && value->fValue) {
    4809         numericValue = createPrimitiveNumericValue(value);
    4810         value = m_valueList->next();
     4836    if (parseIntegerOrStringFromGridPosition(numericValue, gridLineName)) {
     4837        value = m_valueList->current();
    48114838        if (value && value->id == CSSValueSpan) {
    48124839            hasSeenSpanKeyword = true;
     
    48154842    } else if (value->id == CSSValueSpan) {
    48164843        hasSeenSpanKeyword = true;
    4817         value = m_valueList->next();
    4818         if (value && (validUnit(value, FInteger) && value->fValue)) {
    4819             numericValue = createPrimitiveNumericValue(value);
    4820             m_valueList->next();
    4821         }
    4822     }
    4823 
    4824     if (!hasSeenSpanKeyword)
    4825         return numericValue.release();
    4826 
    4827     if (!numericValue && hasSeenSpanKeyword)
    4828         return cssValuePool().createIdentifierValue(CSSValueSpan);
     4844        if (m_valueList->next())
     4845            parseIntegerOrStringFromGridPosition(numericValue, gridLineName);
     4846    }
     4847
     4848    // Check that we have consumed all the value list. For shorthands, the parser will pass
     4849    // the whole value list (including the opposite position).
     4850    if (m_valueList->current() && !isForwardSlashOperator(m_valueList->current()))
     4851        return 0;
     4852
     4853    // If we didn't parse anything, this is not a valid grid position.
     4854    if (!hasSeenSpanKeyword && !gridLineName && !numericValue)
     4855        return 0;
    48294856
    48304857    // Negative numbers are not allowed for span (but are for <integer>).
    4831     if (numericValue && numericValue->getIntValue() < 0)
     4858    if (hasSeenSpanKeyword && numericValue && numericValue->getIntValue() < 0)
    48324859        return 0;
    48334860
    48344861    RefPtr<CSSValueList> values = CSSValueList::createSpaceSeparated();
    4835     values->append(cssValuePool().createIdentifierValue(CSSValueSpan));
     4862    if (hasSeenSpanKeyword)
     4863        values->append(cssValuePool().createIdentifierValue(CSSValueSpan));
    48364864    if (numericValue)
    48374865        values->append(numericValue.release());
     4866    if (gridLineName)
     4867        values->append(gridLineName.release());
     4868    ASSERT(values->length());
    48384869    return values.release();
    48394870}
  • trunk/Source/WebCore/css/CSSParser.h

    r154133 r154996  
    572572    bool parseColor(const String&);
    573573
     574    bool parseIntegerOrStringFromGridPosition(RefPtr<CSSPrimitiveValue>& numericValue, RefPtr<CSSPrimitiveValue>& gridLineName);
     575
    574576    enum ParsingMode {
    575577        NormalMode,
  • trunk/Source/WebCore/css/StyleResolver.cpp

    r154909 r154996  
    19741974static bool createGridPosition(CSSValue* value, GridPosition& position)
    19751975{
    1976     // For now, we only accept: 'auto' | <integer> | span && <integer>?
     1976    // For now, we only accept: 'auto' | [ <integer> || <string> ] | span && <integer>?
    19771977    if (value->isPrimitiveValue()) {
     1978#if !ASSERT_DISABLED
    19781979        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
    1979         if (primitiveValue->getValueID() == CSSValueAuto)
    1980             return true;
    1981 
    1982         if (primitiveValue->getValueID() == CSSValueSpan) {
    1983             // If the <integer> is omitted, it defaults to '1'.
    1984             position.setSpanPosition(1);
    1985             return true;
    1986         }
    1987 
    1988         ASSERT(primitiveValue->isNumber());
    1989         position.setIntegerPosition(primitiveValue->getIntValue());
     1980        ASSERT(primitiveValue->getValueID() == CSSValueAuto);
     1981#endif
    19901982        return true;
    19911983    }
     
    19931985    ASSERT_WITH_SECURITY_IMPLICATION(value->isValueList());
    19941986    CSSValueList* values = static_cast<CSSValueList*>(value);
    1995     ASSERT(values->length() == 2);
    1996     ASSERT_WITH_SECURITY_IMPLICATION(values->itemWithoutBoundsCheck(1)->isPrimitiveValue());
    1997     CSSPrimitiveValue* numericValue = static_cast<CSSPrimitiveValue*>(values->itemWithoutBoundsCheck(1));
    1998     ASSERT(numericValue->isNumber());
    1999     position.setSpanPosition(numericValue->getIntValue());
     1987    ASSERT(values->length());
     1988
     1989    bool isSpanPosition = false;
     1990    // The specification makes the <integer> optional, in which case it default to '1'.
     1991    int gridLineNumber = 1;
     1992    String gridLineName;
     1993
     1994    CSSValueListIterator it = values;
     1995    CSSPrimitiveValue* currentValue = static_cast<CSSPrimitiveValue*>(it.value());
     1996    if (currentValue->getValueID() == CSSValueSpan) {
     1997        isSpanPosition = true;
     1998        it.advance();
     1999        currentValue = it.hasMore() ? static_cast<CSSPrimitiveValue*>(it.value()) : 0;
     2000    }
     2001
     2002    if (currentValue && currentValue->isNumber()) {
     2003        gridLineNumber = currentValue->getIntValue();
     2004        it.advance();
     2005        currentValue = it.hasMore() ? static_cast<CSSPrimitiveValue*>(it.value()) : 0;
     2006    }
     2007
     2008    if (currentValue && currentValue->isString()) {
     2009        gridLineName = currentValue->getStringValue();
     2010        it.advance();
     2011    }
     2012
     2013    ASSERT(!it.hasMore());
     2014    if (isSpanPosition)
     2015        position.setSpanPosition(gridLineNumber, gridLineName);
     2016    else
     2017        position.setExplicitPosition(gridLineNumber, gridLineName);
     2018
    20002019    return true;
    20012020}
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r154753 r154996  
    767767    // FIXME: Handle other values for grid-{row,column} like ranges or line names.
    768768    switch (position.type()) {
    769     case IntegerPosition: {
     769    case ExplicitPosition: {
    770770        ASSERT(position.integerPosition());
    771771        if (position.isPositive())
  • trunk/Source/WebCore/rendering/style/GridPosition.h

    r154753 r154996  
    3232#define GridPosition_h
    3333
     34#include <wtf/text/WTFString.h>
     35
    3436namespace WebCore {
    3537
    3638enum GridPositionType {
    3739    AutoPosition,
    38     IntegerPosition,
     40    ExplicitPosition, // [ <integer> || <string> ]
    3941    SpanPosition
    4042};
     
    5254    GridPositionType type() const { return m_type; }
    5355    bool isAuto() const { return m_type == AutoPosition; }
    54     bool isInteger() const { return m_type == IntegerPosition; }
    5556    bool isSpan() const { return m_type == SpanPosition; }
    5657
    57     void setIntegerPosition(int position)
     58    void setExplicitPosition(int position, const String& namedGridLine)
    5859    {
    59         m_type = IntegerPosition;
     60        m_type = ExplicitPosition;
    6061        m_integerPosition = position;
     62        m_namedGridLine = namedGridLine;
    6163    }
    6264
     
    6466    // be. This means that we have to convert the span position to an integer, losing
    6567    // some precision here. It shouldn't be an issue in practice though.
    66     void setSpanPosition(int position)
     68    void setSpanPosition(int position, const String& namedGridLine)
    6769    {
    6870        m_type = SpanPosition;
    6971        m_integerPosition = position;
     72        m_namedGridLine = namedGridLine;
    7073    }
    7174
    7275    int integerPosition() const
    7376    {
    74         ASSERT(type() == IntegerPosition);
     77        ASSERT(type() == ExplicitPosition);
    7578        return m_integerPosition;
     79    }
     80
     81    String namedGridLine() const
     82    {
     83        ASSERT(type() == ExplicitPosition || type() == SpanPosition);
     84        return m_namedGridLine;
    7685    }
    7786
     
    94103    GridPositionType m_type;
    95104    int m_integerPosition;
     105    String m_namedGridLine;
    96106};
    97107
Note: See TracChangeset for help on using the changeset viewer.