Changeset 289722 in webkit


Ignore:
Timestamp:
Feb 13, 2022 5:52:40 PM (5 months ago)
Author:
commit-queue@webkit.org
Message:

Add support for parsing 'subgrid' in grid-template-columns/row
https://bugs.webkit.org/show_bug.cgi?id=236054

Patch by Matt Woodrow <Matt Woodrow> on 2022-02-13
Reviewed by Manuel Rego Casasnovas.

LayoutTests/imported/w3c:

Imported lastest subgrid tests.

  • web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid-expected.txt:
  • web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid.html:
  • web-platform-tests/css/css-grid/subgrid/grid-template-invalid-expected.txt: Added.
  • web-platform-tests/css/css-grid/subgrid/grid-template-invalid.html:
  • web-platform-tests/css/css-grid/subgrid/grid-template-valid-expected.txt: Added.
  • web-platform-tests/css/css-grid/subgrid/grid-template-valid.html:

Source/WebCore:

Adds support for parsing the 'subgrid' keyword followed by a list of line names for
grid-template-columns/rows.
Adds a new CSSSubgridValue wrapper around CSSValueList to represent this.
Also adds support for converting this into style data in StyleBuilderConverter, and serializing
the specified value for computed value (used when the element specified subgrid but doesn't
have an appropriate grid parent).

Tests: imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-invalid.html

imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-valid.html

  • Headers.cmake:
  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::OrderedNamedLinesCollector::namedGridLineCount const):
(WebCore::addValuesForNamedGridLinesAtIndex):
(WebCore::populateSubgridLineNameList):
(WebCore::valueForGridTrackList):

  • css/CSSSubgridValue.cpp: Added.

(WebCore::CSSSubgridValue::customCSSText const):
(WebCore::CSSSubgridValue::CSSSubgridValue):

  • css/CSSSubgridValue.h: Added.
  • css/CSSValue.cpp:

(WebCore::CSSValue::equals const):
(WebCore::CSSValue::cssText const):
(WebCore::CSSValue::destroy):

  • css/CSSValue.h:

(WebCore::CSSValue::isSubgridValue const):

  • css/CSSValueKeywords.in:
  • css/parser/CSSParserContext.cpp:

(WebCore::operator==):
(WebCore::add):

  • css/parser/CSSParserContext.h:
  • css/parser/CSSPropertyParser.cpp:

(WebCore::consumeGridLineNames):
(WebCore::consumeSubgridNameRepeatFunction):
(WebCore::consumeGridTrackList):
(WebCore::consumeGridTemplatesRowsOrColumns):
(WebCore::CSSPropertyParser::parseSingleValue):
(WebCore::CSSPropertyParser::consumeGridTemplateRowsAndAreasAndColumns):
(WebCore::CSSPropertyParser::consumeGridTemplateShorthand):
(WebCore::CSSPropertyParser::consumeGridShorthand):

  • rendering/style/RenderStyle.h:

(WebCore::RenderStyle::gridSubgridRows const):
(WebCore::RenderStyle::gridSubgridColumns const):
(WebCore::RenderStyle::setGridSubgridRows):
(WebCore::RenderStyle::setGridSubgridColumns):

  • rendering/style/StyleGridData.cpp:

(WebCore::StyleGridData::StyleGridData):

  • rendering/style/StyleGridData.h:

(WebCore::StyleGridData::operator== const):

  • style/StyleBuilderConverter.h:

(WebCore::Style::createGridLineNamesList):
(WebCore::Style::BuilderConverter::createGridTrackList):

  • style/StyleBuilderCustom.h:

Source/WTF:

Adds a new experimental preference for subgrid support, disabled by default.

  • Scripts/Preferences/WebPreferencesExperimental.yaml:

LayoutTests:

Updated TestExpectations to list all the subgrid tests individually, now that we pass a few.

  • TestExpectations:
  • platform/gtk/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid-expected.txt: Removed.
  • platform/wpe/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid-expected.txt: Removed.
Location:
trunk
Files:
4 added
2 deleted
25 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r289721 r289722  
     12022-02-13  Matt Woodrow  <mattwoodrow@apple.com>
     2
     3        Add support for parsing 'subgrid' in grid-template-columns/row
     4        https://bugs.webkit.org/show_bug.cgi?id=236054
     5
     6        Reviewed by Manuel Rego Casasnovas.
     7
     8        Updated TestExpectations to list all the subgrid tests individually, now that we pass a few.
     9
     10        * TestExpectations:
     11        * platform/gtk/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid-expected.txt: Removed.
     12        * platform/wpe/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid-expected.txt: Removed.
     13
    1142022-02-13  Brady Eidson  <beidson@apple.com>
    215
  • trunk/LayoutTests/TestExpectations

    r289667 r289722  
    14011401imported/w3c/web-platform-tests/css/css-grid/masonry/tentative/masonry-subgrid-001.html [ ImageOnlyFailure ]
    14021402imported/w3c/web-platform-tests/css/css-grid/masonry/tentative/masonry-subgrid-002.html [ ImageOnlyFailure ]
     1403
     1404imported/w3c/web-platform-tests/css/css-grid/subgrid/abs-pos-002.html [ ImageOnlyFailure ]
     1405imported/w3c/web-platform-tests/css/css-grid/subgrid/abs-pos-003.html [ ImageOnlyFailure ]
     1406imported/w3c/web-platform-tests/css/css-grid/subgrid/abs-pos-004.html [ ImageOnlyFailure ]
     1407imported/w3c/web-platform-tests/css/css-grid/subgrid/baseline-001.html [ ImageOnlyFailure ]
     1408imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-001.html [ ImageOnlyFailure ]
     1409imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-002.html [ ImageOnlyFailure ]
     1410imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-003.html [ ImageOnlyFailure ]
     1411imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-004.html [ ImageOnlyFailure ]
     1412imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-005.html [ ImageOnlyFailure ]
     1413imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-006.html [ ImageOnlyFailure ]
     1414imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-007.html [ ImageOnlyFailure ]
     1415imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-008.html [ ImageOnlyFailure ]
     1416imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-009.html [ ImageOnlyFailure ]
     1417imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-larger-001.html [ ImageOnlyFailure ]
     1418imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-larger-002.html [ ImageOnlyFailure ]
     1419imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-normal-001.html [ ImageOnlyFailure ]
     1420imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-smaller-001.html [ ImageOnlyFailure ]
     1421imported/w3c/web-platform-tests/css/css-grid/subgrid/item-percentage-height-001.html [ ImageOnlyFailure ]
     1422imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-001.html [ ImageOnlyFailure ]
     1423imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-002.html [ ImageOnlyFailure ]
     1424imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-003.html [ ImageOnlyFailure ]
     1425imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-004.html [ ImageOnlyFailure ]
     1426imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-005.html [ ImageOnlyFailure ]
     1427imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-006.html [ ImageOnlyFailure ]
     1428imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-007.html [ ImageOnlyFailure ]
     1429imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-008.html [ ImageOnlyFailure ]
     1430imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-001.html [ ImageOnlyFailure ]
     1431imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-002.html [ ImageOnlyFailure ]
     1432imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-003.html [ ImageOnlyFailure ]
     1433imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-004.html [ ImageOnlyFailure ]
     1434imported/w3c/web-platform-tests/css/css-grid/subgrid/parent-repeat-auto-fit-001.html [ ImageOnlyFailure ]
     1435imported/w3c/web-platform-tests/css/css-grid/subgrid/parent-repeat-auto-fit-002.html [ ImageOnlyFailure ]
     1436imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-001.html [ ImageOnlyFailure ]
     1437imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-002.html [ ImageOnlyFailure ]
     1438imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-003.html [ ImageOnlyFailure ]
     1439imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-004.html [ ImageOnlyFailure ]
     1440imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-005.html [ ImageOnlyFailure ]
     1441imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-006.html [ ImageOnlyFailure ]
     1442imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-007.html [ ImageOnlyFailure ]
     1443imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-008.html [ ImageOnlyFailure ]
     1444imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-item-block-size-001.html [ ImageOnlyFailure ]
     1445imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-001.html [ ImageOnlyFailure ]
     1446imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-002.html [ ImageOnlyFailure ]
     1447imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-003.html [ ImageOnlyFailure ]
     1448imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-004.html [ ImageOnlyFailure ]
     1449imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-subgridded-axis-auto-repeater-crash-001.html [ Crash ]
     1450imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-subgridded-axis-auto-repeater-crash-002.html [ Crash ]
    14031451
    14041452webkit.org/b/149890 fast/css-grid-layout/grid-shorthands-style-format.html [ Failure ]
     
    42404288# CSS Masonry Layout not supported.
    42414289imported/w3c/web-platform-tests/css/css-grid/masonry.tentative [ Skip ]
    4242 webkit.org/b/202115 imported/w3c/web-platform-tests/css/css-grid/subgrid [ Skip ]
    42434290webkit.org/b/204580 imported/w3c/web-platform-tests/css/css-grid/animation/grid-template-columns-001.html [ ImageOnlyFailure ]
    42444291webkit.org/b/204580 imported/w3c/web-platform-tests/css/css-grid/animation/grid-template-rows-001.html [ ImageOnlyFailure ]
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r289721 r289722  
     12022-02-13  Matt Woodrow  <mattwoodrow@apple.com>
     2
     3        Add support for parsing 'subgrid' in grid-template-columns/row
     4        https://bugs.webkit.org/show_bug.cgi?id=236054
     5
     6        Reviewed by Manuel Rego Casasnovas.
     7
     8        Imported lastest subgrid tests.
     9
     10        * web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid-expected.txt:
     11        * web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid.html:
     12        * web-platform-tests/css/css-grid/subgrid/grid-template-invalid-expected.txt: Added.
     13        * web-platform-tests/css/css-grid/subgrid/grid-template-invalid.html:
     14        * web-platform-tests/css/css-grid/subgrid/grid-template-valid-expected.txt: Added.
     15        * web-platform-tests/css/css-grid/subgrid/grid-template-valid.html:
     16
    1172022-02-13  Brady Eidson  <beidson@apple.com>
    218
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid-expected.txt

    r262056 r289722  
    11
    2 FAIL Property grid-template-columns value 'subgrid [a]' computes to 'subgrid [a]' assert_true: 'subgrid [a]' is a supported value for grid-template-columns. expected true got false
    3 FAIL Property grid-template-columns value 'subgrid [a] [b]' computes to 'subgrid [a] [b]' assert_true: 'subgrid [a] [b]' is a supported value for grid-template-columns. expected true got false
    4 FAIL Property grid-template-columns value 'subgrid [a] [b] [b] [c]' computes to 'subgrid [a] [b] [b] [c]' assert_true: 'subgrid [a] [b] [b] [c]' is a supported value for grid-template-columns. expected true got false
    5 FAIL Property grid-template-columns value 'subgrid [a] [b c d] [e f] [e f] [g]' computes to 'subgrid [a] [b c d] [e f] [e f] [g]' assert_true: 'subgrid [a] [b c d] [e f] [e f] [g]' is a supported value for grid-template-columns. expected true got false
    6 FAIL Property grid-template-columns value 'subgrid [a b c] [d] [e f]' computes to 'subgrid [a b c] [d] [e f]' assert_true: 'subgrid [a b c] [d] [e f]' is a supported value for grid-template-columns. expected true got false
    7 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c])' computes to 'subgrid repeat(auto-fill, [c])' assert_true: 'subgrid repeat(auto-fill, [c])' is a supported value for grid-template-columns. expected true got false
    8 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c]) [g] [h i]' computes to 'subgrid repeat(auto-fill, [c]) [g] [h i]' assert_true: 'subgrid repeat(auto-fill, [c]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    9 FAIL Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c]) [g] [h i]' computes to 'subgrid [a] repeat(auto-fill, [c]) [g] [h i]' assert_true: 'subgrid [a] repeat(auto-fill, [c]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    10 FAIL Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c]) [g]' computes to 'subgrid [a b] repeat(auto-fill, [c]) [g]' assert_true: 'subgrid [a b] repeat(auto-fill, [c]) [g]' is a supported value for grid-template-columns. expected true got false
    11 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c]) [g h]' computes to 'subgrid [a] [b] repeat(auto-fill, [c]) [g h]' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c]) [g h]' is a supported value for grid-template-columns. expected true got false
    12 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c])' computes to 'subgrid [a] [b] repeat(auto-fill, [c])' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c])' is a supported value for grid-template-columns. expected true got false
    13 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c d])' computes to 'subgrid repeat(auto-fill, [c d])' assert_true: 'subgrid repeat(auto-fill, [c d])' is a supported value for grid-template-columns. expected true got false
    14 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c d]) [g] [h i]' computes to 'subgrid repeat(auto-fill, [c d]) [g] [h i]' assert_true: 'subgrid repeat(auto-fill, [c d]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    15 FAIL Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c d]) [g] [h i]' computes to 'subgrid [a] repeat(auto-fill, [c d]) [g] [h i]' assert_true: 'subgrid [a] repeat(auto-fill, [c d]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    16 FAIL Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c d]) [g]' computes to 'subgrid [a b] repeat(auto-fill, [c d]) [g]' assert_true: 'subgrid [a b] repeat(auto-fill, [c d]) [g]' is a supported value for grid-template-columns. expected true got false
    17 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c d]) [g h]' computes to 'subgrid [a] [b] repeat(auto-fill, [c d]) [g h]' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c d]) [g h]' is a supported value for grid-template-columns. expected true got false
    18 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c d])' computes to 'subgrid [a] [b] repeat(auto-fill, [c d])' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c d])' is a supported value for grid-template-columns. expected true got false
    19 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d])' computes to 'subgrid repeat(auto-fill, [c] [d])' assert_true: 'subgrid repeat(auto-fill, [c] [d])' is a supported value for grid-template-columns. expected true got false
    20 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d]) [g] [h i]' computes to 'subgrid repeat(auto-fill, [c] [d]) [g] [h i]' assert_true: 'subgrid repeat(auto-fill, [c] [d]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    21 FAIL Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c] [d]) [g] [h i]' computes to 'subgrid [a] repeat(auto-fill, [c] [d]) [g] [h i]' assert_true: 'subgrid [a] repeat(auto-fill, [c] [d]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    22 FAIL Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c] [d]) [g]' computes to 'subgrid [a b] repeat(auto-fill, [c] [d]) [g]' assert_true: 'subgrid [a b] repeat(auto-fill, [c] [d]) [g]' is a supported value for grid-template-columns. expected true got false
    23 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d]) [g h]' computes to 'subgrid [a] [b] repeat(auto-fill, [c] [d]) [g h]' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c] [d]) [g h]' is a supported value for grid-template-columns. expected true got false
    24 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d])' computes to 'subgrid [a] [b] repeat(auto-fill, [c] [d])' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c] [d])' is a supported value for grid-template-columns. expected true got false
    25 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d e])' computes to 'subgrid repeat(auto-fill, [c] [d e])' assert_true: 'subgrid repeat(auto-fill, [c] [d e])' is a supported value for grid-template-columns. expected true got false
    26 FAIL Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d e]) [g] [h i]' computes to 'subgrid repeat(auto-fill, [c] [d e]) [g] [h i]' assert_true: 'subgrid repeat(auto-fill, [c] [d e]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    27 FAIL Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c] [d e]) [g] [h i]' computes to 'subgrid [a] repeat(auto-fill, [c] [d e]) [g] [h i]' assert_true: 'subgrid [a] repeat(auto-fill, [c] [d e]) [g] [h i]' is a supported value for grid-template-columns. expected true got false
    28 FAIL Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c] [d e]) [g]' computes to 'subgrid [a b] repeat(auto-fill, [c] [d e]) [g]' assert_true: 'subgrid [a b] repeat(auto-fill, [c] [d e]) [g]' is a supported value for grid-template-columns. expected true got false
    29 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d e]) [g h]' computes to 'subgrid [a] [b] repeat(auto-fill, [c] [d e]) [g h]' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c] [d e]) [g h]' is a supported value for grid-template-columns. expected true got false
    30 FAIL Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d e])' computes to 'subgrid [a] [b] repeat(auto-fill, [c] [d e])' assert_true: 'subgrid [a] [b] repeat(auto-fill, [c] [d e])' is a supported value for grid-template-columns. expected true got false
     2PASS Property grid-template-columns value 'subgrid []'
     3PASS Property grid-template-columns value 'subgrid [a]'
     4PASS Property grid-template-columns value 'subgrid [a] [b]'
     5PASS Property grid-template-columns value 'subgrid [] [b]'
     6PASS Property grid-template-columns value 'subgrid [a] [b] [b] [c]'
     7PASS Property grid-template-columns value 'subgrid [a] [b c d] [e f] [e f] [g]'
     8PASS Property grid-template-columns value 'subgrid [a b c] [d] [e f]'
     9PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c])'
     10PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [])'
     11PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c]) [g] [h i]'
     12PASS Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c]) [g] [h i]'
     13PASS Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c]) [g]'
     14PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c]) [g h]'
     15PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c])'
     16PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c d])'
     17PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c d]) [g] [h i]'
     18PASS Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c d]) [g] [h i]'
     19PASS Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c d]) [g]'
     20PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c d]) [g h]'
     21PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c d])'
     22PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d])'
     23PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d]) [g] [h i]'
     24PASS Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c] [d]) [g] [h i]'
     25PASS Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c] [d]) [g]'
     26PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d]) [g h]'
     27PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d])'
     28PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d e])'
     29PASS Property grid-template-columns value 'subgrid repeat(auto-fill, [c] [d e]) [g] [h i]'
     30PASS Property grid-template-columns value 'subgrid [a] repeat(auto-fill, [c] [d e]) [g] [h i]'
     31PASS Property grid-template-columns value 'subgrid [a b] repeat(auto-fill, [c] [d e]) [g]'
     32PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d e]) [g h]'
     33PASS Property grid-template-columns value 'subgrid [a] [b] repeat(auto-fill, [c] [d e])'
    3134
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-computed-nogrid.html

    r262056 r289722  
    1717<div id="target"></div>
    1818<script>
     19test_computed_value("grid-template-columns", "subgrid []");
    1920test_computed_value("grid-template-columns", "subgrid [a]");
    2021test_computed_value("grid-template-columns", "subgrid [a] [b]");
     22test_computed_value("grid-template-columns", "subgrid [] [b]");
    2123test_computed_value("grid-template-columns", "subgrid [a] [b] [b] [c]");
    2224test_computed_value("grid-template-columns", "subgrid [a] [b c d] [e f] [e f] [g]");
    2325test_computed_value("grid-template-columns", "subgrid [a b c] [d] [e f]");
    2426test_computed_value("grid-template-columns", "subgrid repeat(auto-fill, [c])");
     27test_computed_value("grid-template-columns", "subgrid repeat(auto-fill, [])");
    2528test_computed_value("grid-template-columns", "subgrid repeat(auto-fill, [c]) [g] [h i]");
    2629test_computed_value("grid-template-columns", "subgrid [a] repeat(auto-fill, [c]) [g] [h i]");
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-invalid.html

    r287823 r289722  
    2323test_invalid_value("grid-template-rows", 'subgrid repeat(2, line)');
    2424test_invalid_value("grid-template-rows", 'subgrid repeat(2,');
     25test_invalid_value("grid-template-rows", 'subgrid repeat(auto-fill, [a]) repeat(auto-fill, [b])');
    2526
    2627test_invalid_value("grid-template-columns", 'subgrid subgrid');
     
    3334test_invalid_value("grid-template-columns", 'subgrid repeat(2, line)');
    3435test_invalid_value("grid-template-columns", 'subgrid repeat(2,');
     36test_invalid_value("grid-template-columns", 'subgrid repeat(auto-fill, [a]) repeat(auto-fill, [b])');
    3537
    3638
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-valid.html

    r287823 r289722  
    2323test_valid_value("grid-template-rows", 'subgrid [] [] [] []');
    2424test_valid_value("grid-template-rows", 'subgrid repeat(auto-fill, [a])');
     25test_valid_value("grid-template-rows", 'subgrid repeat(auto-fill, [])');
    2526test_valid_value("grid-template-rows", 'subgrid [a] repeat(auto-fill, [b])');
    2627test_valid_value("grid-template-rows", 'subgrid [a] repeat(auto-fill, [b]) [c]');
     
    4243test_valid_value("grid-template-columns", 'subgrid [] [] [] []');
    4344test_valid_value("grid-template-columns", 'subgrid repeat(auto-fill, [a])');
     45test_valid_value("grid-template-columns", 'subgrid repeat(auto-fill, [])');
    4446test_valid_value("grid-template-columns", 'subgrid [a] repeat(auto-fill, [b])');
    4547test_valid_value("grid-template-columns", 'subgrid [a] repeat(auto-fill, [b]) [c]');
  • trunk/Source/WTF/ChangeLog

    r289721 r289722  
     12022-02-13  Matt Woodrow  <mattwoodrow@apple.com>
     2
     3        Add support for parsing 'subgrid' in grid-template-columns/row
     4        https://bugs.webkit.org/show_bug.cgi?id=236054
     5
     6        Reviewed by Manuel Rego Casasnovas.
     7
     8        Adds a new experimental preference for subgrid support, disabled by default.
     9
     10        * Scripts/Preferences/WebPreferencesExperimental.yaml:
     11
    1122022-02-13  Brady Eidson  <beidson@apple.com>
    213
  • trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml

    r289683 r289722  
    13501350      default: false
    13511351
     1352SubgridEnabled:
     1353  type: bool
     1354  humanReadableName: "CSS subgrid support"
     1355  humanReadableDescription: "Enable CSS subgrid support"
     1356  defaultValue:
     1357    WebKitLegacy:
     1358      default: false
     1359    WebKit:
     1360      default: false
     1361    WebCore:
     1362      default: false
     1363
    13521364SyntheticEditingCommandsEnabled:
    13531365  type: bool
  • trunk/Source/WebCore/ChangeLog

    r289721 r289722  
     12022-02-13  Matt Woodrow  <mattwoodrow@apple.com>
     2
     3        Add support for parsing 'subgrid' in grid-template-columns/row
     4        https://bugs.webkit.org/show_bug.cgi?id=236054
     5
     6        Reviewed by Manuel Rego Casasnovas.
     7
     8        Adds support for parsing the 'subgrid' keyword followed by a list of line names for
     9        grid-template-columns/rows.
     10        Adds a new CSSSubgridValue wrapper around CSSValueList to represent this.
     11        Also adds support for converting this into style data in StyleBuilderConverter, and serializing
     12        the specified value for computed value (used when the element specified subgrid but doesn't
     13        have an appropriate grid parent).
     14
     15        Tests: imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-invalid.html
     16               imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-template-valid.html
     17
     18        * Headers.cmake:
     19        * Sources.txt:
     20        * WebCore.xcodeproj/project.pbxproj:
     21        * css/CSSComputedStyleDeclaration.cpp:
     22        (WebCore::OrderedNamedLinesCollector::namedGridLineCount const):
     23        (WebCore::addValuesForNamedGridLinesAtIndex):
     24        (WebCore::populateSubgridLineNameList):
     25        (WebCore::valueForGridTrackList):
     26        * css/CSSSubgridValue.cpp: Added.
     27        (WebCore::CSSSubgridValue::customCSSText const):
     28        (WebCore::CSSSubgridValue::CSSSubgridValue):
     29        * css/CSSSubgridValue.h: Added.
     30        * css/CSSValue.cpp:
     31        (WebCore::CSSValue::equals const):
     32        (WebCore::CSSValue::cssText const):
     33        (WebCore::CSSValue::destroy):
     34        * css/CSSValue.h:
     35        (WebCore::CSSValue::isSubgridValue const):
     36        * css/CSSValueKeywords.in:
     37        * css/parser/CSSParserContext.cpp:
     38        (WebCore::operator==):
     39        (WebCore::add):
     40        * css/parser/CSSParserContext.h:
     41        * css/parser/CSSPropertyParser.cpp:
     42        (WebCore::consumeGridLineNames):
     43        (WebCore::consumeSubgridNameRepeatFunction):
     44        (WebCore::consumeGridTrackList):
     45        (WebCore::consumeGridTemplatesRowsOrColumns):
     46        (WebCore::CSSPropertyParser::parseSingleValue):
     47        (WebCore::CSSPropertyParser::consumeGridTemplateRowsAndAreasAndColumns):
     48        (WebCore::CSSPropertyParser::consumeGridTemplateShorthand):
     49        (WebCore::CSSPropertyParser::consumeGridShorthand):
     50        * rendering/style/RenderStyle.h:
     51        (WebCore::RenderStyle::gridSubgridRows const):
     52        (WebCore::RenderStyle::gridSubgridColumns const):
     53        (WebCore::RenderStyle::setGridSubgridRows):
     54        (WebCore::RenderStyle::setGridSubgridColumns):
     55        * rendering/style/StyleGridData.cpp:
     56        (WebCore::StyleGridData::StyleGridData):
     57        * rendering/style/StyleGridData.h:
     58        (WebCore::StyleGridData::operator== const):
     59        * style/StyleBuilderConverter.h:
     60        (WebCore::Style::createGridLineNamesList):
     61        (WebCore::Style::BuilderConverter::createGridTrackList):
     62        * style/StyleBuilderCustom.h:
     63
    1642022-02-13  Brady Eidson  <beidson@apple.com>
    265
  • trunk/Source/WebCore/Headers.cmake

    r289715 r289722  
    547547    css/CSSStyleRule.h
    548548    css/CSSStyleSheet.h
     549    css/CSSSubgridValue.h
    549550    css/CSSToLengthConversionData.h
    550551    css/CSSUnits.h
  • trunk/Source/WebCore/Sources.txt

    r289697 r289722  
    769769css/CSSStyleRule.cpp
    770770css/CSSStyleSheet.cpp
     771css/CSSSubgridValue.cpp
    771772css/CSSSupportsRule.cpp
    772773css/CSSTimingFunctionValue.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r289706 r289722  
    46964696                D000ED2811C1B9CD00C47726 /* SubframeLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = D000ED2611C1B9CD00C47726 /* SubframeLoader.h */; settings = {ATTRIBUTES = (Private, ); }; };
    46974697                D01A27AE10C9BFD800026A42 /* SpaceSplitString.h in Headers */ = {isa = PBXBuildFile; fileRef = D01A27AC10C9BFD800026A42 /* SpaceSplitString.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4698                D026DB0A27AB719E0081B143 /* CSSSubgridValue.h in Headers */ = {isa = PBXBuildFile; fileRef = D026DB0827AB719D0081B143 /* CSSSubgridValue.h */; };
    46984699                D05CED2A0A40BB2C00C5AF38 /* FormatBlockCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = D05CED280A40BB2C00C5AF38 /* FormatBlockCommand.h */; };
    46994700                D06C0D8F0CFD11460065F43F /* RemoveFormatCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = D06C0D8D0CFD11460065F43F /* RemoveFormatCommand.h */; };
     
    1645416455                D01A27AB10C9BFD800026A42 /* SpaceSplitString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpaceSplitString.cpp; sourceTree = "<group>"; };
    1645516456                D01A27AC10C9BFD800026A42 /* SpaceSplitString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpaceSplitString.h; sourceTree = "<group>"; };
     16457                D026DB0827AB719D0081B143 /* CSSSubgridValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSSubgridValue.h; sourceTree = "<group>"; };
     16458                D026DB0B27AB71AF0081B143 /* CSSSubgridValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSSubgridValue.cpp; sourceTree = "<group>"; };
    1645616459                D036DD8D208FFC0C00F9F4B2 /* WebGLCompressedTextureASTC.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = WebGLCompressedTextureASTC.idl; sourceTree = "<group>"; };
    1645716460                D05CED270A40BB2C00C5AF38 /* FormatBlockCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = FormatBlockCommand.cpp; sourceTree = "<group>"; };
     
    3175431757                                A8EA7FFF0A19516E00A8EF5F /* CSSStyleSheet.h */,
    3175531758                                858C39100AA8FF0000B187A4 /* CSSStyleSheet.idl */,
     31759                                D026DB0B27AB71AF0081B143 /* CSSSubgridValue.cpp */,
     31760                                D026DB0827AB719D0081B143 /* CSSSubgridValue.h */,
    3175631761                                FD677734195CAB200072E0D3 /* CSSSupportsRule.cpp */,
    3175731762                                FC63BDB1167AABAC00F9380F /* CSSSupportsRule.h */,
     
    3412634131                                A8EA80070A19516E00A8EF5F /* CSSStyleSheet.h in Headers */,
    3412734132                                4BAFD0D62192146B00C0AB64 /* CSSStyleValue.h in Headers */,
     34133                                D026DB0A27AB719E0081B143 /* CSSSubgridValue.h in Headers */,
    3412834134                                94DE5C921D83011D00164F2A /* CSSSupportsParser.h in Headers */,
    3412934135                                FC54D05716A7673100575E4D /* CSSSupportsRule.h in Headers */,
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r289588 r289722  
    858858    virtual void collectLineNamesForIndex(CSSGridLineNamesValue&, unsigned index) const;
    859859
     860    virtual int namedGridLineCount() const { return m_orderedNamedGridLines.size(); }
     861
    860862protected:
    861863
     
    875877
    876878    void collectLineNamesForIndex(CSSGridLineNamesValue&, unsigned index) const override;
     879
     880    int namedGridLineCount() const override { return m_orderedNamedAutoRepeatGridLines.size(); }
    877881};
    878882
     
    952956}
    953957
    954 static void addValuesForNamedGridLinesAtIndex(OrderedNamedLinesCollector& collector, unsigned i, CSSValueList& list)
     958static void addValuesForNamedGridLinesAtIndex(OrderedNamedLinesCollector& collector, unsigned i, CSSValueList& list, bool renderEmpty = false)
    955959{
    956960    if (collector.isEmpty())
     
    959963    auto lineNames = CSSGridLineNamesValue::create();
    960964    collector.collectLineNamesForIndex(lineNames.get(), i);
    961     if (lineNames->length())
     965    if (lineNames->length() || renderEmpty)
    962966        list.append(WTFMove(lineNames));
    963967}
     
    994998}
    995999
     1000static void populateSubgridLineNameList(CSSValueList& list, OrderedNamedLinesCollector& collector, int start, int end)
     1001{
     1002    for (int i = start; i < end; i++)
     1003        addValuesForNamedGridLinesAtIndex(collector, i, list, true);
     1004}
     1005
     1006static void populateSubgridLineNameList(CSSValueList& list, OrderedNamedLinesCollector& collector)
     1007{
     1008    populateSubgridLineNameList(list, collector, 0, collector.namedGridLineCount());
     1009}
     1010
    9961011static Ref<CSSValue> valueForGridTrackList(GridTrackSizingDirection direction, RenderObject* renderer, const RenderStyle& style)
    9971012{
    9981013    bool isRowAxis = direction == ForColumns;
    9991014    bool isRenderGrid = is<RenderGrid>(renderer);
     1015    bool isSubgrid = isRowAxis ? style.gridSubgridColumns() : style.gridSubgridRows();
    10001016    auto& trackSizes = isRowAxis ? style.gridColumns() : style.gridRows();
    10011017    auto& autoRepeatTrackSizes = isRowAxis ? style.gridAutoRepeatColumns() : style.gridAutoRepeatRows();
     
    10111027    }
    10121028
    1013     if (trackListIsEmpty)
     1029    if (trackListIsEmpty && !isSubgrid)
    10141030        return CSSValuePool::singleton().createIdentifierValue(CSSValueNone);
    10151031
    10161032    auto list = CSSValueList::createSpaceSeparated();
     1033    if (isSubgrid)
     1034        list->append(CSSValuePool::singleton().createIdentifierValue(CSSValueSubgrid));
    10171035
    10181036    // If the element is a grid container, the resolved value is the used value,
    10191037    // specifying track sizes in pixels and expanding the repeat() notation.
    10201038    if (isRenderGrid) {
     1039        // FIXME: We need to handle computed subgrid here.
    10211040        auto* grid = downcast<RenderGrid>(renderer);
    10221041        OrderedNamedLinesCollectorInGridLayout collector(style, isRowAxis, grid->autoRepeatCountForDirection(direction), autoRepeatTrackSizes.size());
     
    10361055    };
    10371056
     1057    OrderedNamedLinesCollectorInsideRepeat repeatCollector(style, isRowAxis);
     1058    if (isSubgrid) {
     1059        if (!repeatCollector.namedGridLineCount()) {
     1060            populateSubgridLineNameList(list.get(), collector);
     1061            return list;
     1062        }
     1063
     1064        // Add the line names that precede the auto repeat().
     1065        int autoRepeatInsertionPoint = isRowAxis ? style.gridAutoRepeatColumnsInsertionPoint() : style.gridAutoRepeatRowsInsertionPoint();
     1066        autoRepeatInsertionPoint = std::clamp<int>(autoRepeatInsertionPoint, 0, collector.namedGridLineCount());
     1067        populateSubgridLineNameList(list.get(), collector, 0, autoRepeatInsertionPoint);
     1068
     1069        // Add a CSSGridAutoRepeatValue with the contents of the auto repeat().
     1070        ASSERT((isRowAxis ? style.gridAutoRepeatColumnsType() : style.gridAutoRepeatRowsType()) == AutoRepeatType::Fill);
     1071        auto repeatedValues = CSSGridAutoRepeatValue::create(CSSValueAutoFill);
     1072        populateSubgridLineNameList(repeatedValues.get(), repeatCollector);
     1073        list->append(repeatedValues.get());
     1074
     1075        // Add the line names that follow the auto repeat().
     1076        populateSubgridLineNameList(list.get(), collector, autoRepeatInsertionPoint, collector.namedGridLineCount());
     1077        return list;
     1078    }
     1079
    10381080    if (autoRepeatTrackSizes.isEmpty()) {
    10391081        // If there's no auto repeat(), just add all the line names and track sizes.
     
    10431085
    10441086    // Add the line names and track sizes that precede the auto repeat().
    1045     int autoRepeatInsertionPoint = std::clamp<int>(isRowAxis ? style.gridAutoRepeatColumnsInsertionPoint() : style.gridAutoRepeatRowsInsertionPoint(), 0, trackSizes.size());
     1087    int autoRepeatInsertionPoint = isRowAxis ? style.gridAutoRepeatColumnsInsertionPoint() : style.gridAutoRepeatRowsInsertionPoint();
     1088    autoRepeatInsertionPoint = std::clamp<int>(autoRepeatInsertionPoint, 0, trackSizes.size());
    10461089    populateGridTrackList(list.get(), collector, trackSizes, getTrackSize, 0, autoRepeatInsertionPoint);
    10471090
     
    10491092    AutoRepeatType autoRepeatType = isRowAxis ? style.gridAutoRepeatColumnsType() : style.gridAutoRepeatRowsType();
    10501093    auto repeatedValues = CSSGridAutoRepeatValue::create(autoRepeatType == AutoRepeatType::Fill ? CSSValueAutoFill : CSSValueAutoFit);
    1051     OrderedNamedLinesCollectorInsideRepeat repeatCollector(style, isRowAxis);
     1094
    10521095    populateGridTrackList(repeatedValues.get(), repeatCollector, autoRepeatTrackSizes, getTrackSize);
    10531096    list->append(repeatedValues.get());
  • trunk/Source/WebCore/css/CSSValue.cpp

    r286086 r289722  
    7070#include "CSSGridLineNamesValue.h"
    7171#include "CSSGridTemplateAreasValue.h"
     72#include "CSSSubgridValue.h"
    7273
    7374#include "DeprecatedCSSOMPrimitiveValue.h"
     
    185186        case GridLineNamesClass:
    186187            return compareCSSValues<CSSGridLineNamesValue>(*this, other);
     188        case SubgridClass:
     189            return compareCSSValues<CSSSubgridValue>(*this, other);
    187190        case GridTemplateAreasClass:
    188191            return compareCSSValues<CSSGridTemplateAreasValue>(*this, other);
     
    288291    case GridLineNamesClass:
    289292        return downcast<CSSGridLineNamesValue>(*this).customCSSText();
     293    case SubgridClass:
     294        return downcast<CSSSubgridValue>(*this).customCSSText();
    290295    case GridTemplateAreasClass:
    291296        return downcast<CSSGridTemplateAreasValue>(*this).customCSSText();
     
    411416        delete downcast<CSSGridLineNamesValue>(this);
    412417        return;
     418    case SubgridClass:
     419        delete downcast<CSSSubgridValue>(this);
     420        return;
    413421    case GridTemplateAreasClass:
    414422        delete downcast<CSSGridTemplateAreasValue>(this);
  • trunk/Source/WebCore/css/CSSValue.h

    r286086 r289722  
    135135    bool isGridTemplateAreasValue() const { return m_classType == GridTemplateAreasClass; }
    136136    bool isGridLineNamesValue() const { return m_classType == GridLineNamesClass; }
     137    bool isSubgridValue() const { return m_classType == SubgridClass; }
    137138    bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; }
    138139
     
    225226        GridAutoRepeatClass,
    226227        GridIntegerRepeatClass,
     228        SubgridClass,
    227229        // Do not append non-list class types here.
    228230    };
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r288869 r289722  
    14211421// grid-template-{columns|rows}
    14221422minmax
     1423subgrid
    14231424
    14241425// grid-auto-flow
  • trunk/Source/WebCore/css/parser/CSSParserContext.cpp

    r289686 r289722  
    113113    , gradientInterpolationColorSpacesEnabled { document.settings().cssGradientInterpolationColorSpacesEnabled() }
    114114    , inputSecurityEnabled { document.settings().cssInputSecurityEnabled() }
     115    , subgridEnabled { document.settings().subgridEnabled() }
    115116#if ENABLE(ATTACHMENT_ELEMENT)
    116117    , attachmentEnabled { RuntimeEnabledFeatures::sharedFeatures().attachmentElementEnabled() }
     
    166167        && a.attachmentEnabled == b.attachmentEnabled
    167168#endif
     169        && a.subgridEnabled == b.subgridEnabled
    168170    ;
    169171}
     
    210212        | context.accentColorEnabled                        << 29
    211213        | context.inputSecurityEnabled                      << 30
    212         | context.mode                                      << 31; // This is multiple bits, so keep it last.
     214        | context.subgridEnabled                            << 31
     215        | (unsigned long long)context.mode                  << 32; // This is multiple bits, so keep it last.
    213216    add(hasher, context.baseURL, context.charset, bits);
    214217}
  • trunk/Source/WebCore/css/parser/CSSParserContext.h

    r288590 r289722  
    9090    bool gradientInterpolationColorSpacesEnabled { false };
    9191    bool inputSecurityEnabled { false };
     92    bool subgridEnabled { false };
    9293
    9394    // RuntimeEnabledFeatures.
  • trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp

    r288675 r289722  
    6060#include "CSSReflectValue.h"
    6161#include "CSSShadowValue.h"
     62#include "CSSSubgridValue.h"
    6263#include "CSSTimingFunctionValue.h"
    6364#include "CSSUnicodeRangeValue.h"
     
    36063607
    36073608// Appends to the passed in CSSGridLineNamesValue if any, otherwise creates a new one. Returns nullptr if an empty list is consumed.
    3608 static RefPtr<CSSGridLineNamesValue> consumeGridLineNames(CSSParserTokenRange& range, CSSGridLineNamesValue* lineNames = nullptr)
     3609static RefPtr<CSSGridLineNamesValue> consumeGridLineNames(CSSParserTokenRange& range, CSSGridLineNamesValue* lineNames = nullptr, bool allowEmpty = false)
    36093610{
    36103611    CSSParserTokenRange rangeCopy = range;
     
    36203621        return nullptr;
    36213622    range = rangeCopy;
    3622     return result->length() ? result : nullptr;
     3623    return (result->length() || allowEmpty) ? result : nullptr;
    36233624}
    36243625
     
    36763677}
    36773678
     3679static bool consumeSubgridNameRepeatFunction(CSSParserTokenRange& range, CSSValueList& list, bool& isAutoRepeat)
     3680{
     3681    CSSParserTokenRange args = consumeFunction(range);
     3682    size_t repetitions = 1;
     3683    isAutoRepeat = identMatches<CSSValueAutoFill>(args.peek().id());
     3684    RefPtr<CSSValueList> repeatedValues;
     3685    if (isAutoRepeat)
     3686        repeatedValues = CSSGridAutoRepeatValue::create(args.consumeIncludingWhitespace().id());
     3687    else {
     3688        auto repetition = consumePositiveIntegerRaw(args);
     3689        if (!repetition)
     3690            return false;
     3691        repetitions = clampTo<size_t>(static_cast<size_t>(*repetition), 0, GridPosition::max());
     3692        repeatedValues = CSSGridIntegerRepeatValue::create(repetitions);
     3693    }
     3694    if (!consumeCommaIncludingWhitespace(args))
     3695        return false;
     3696
     3697    do {
     3698        auto lineNames = consumeGridLineNames(args, nullptr, true);
     3699        if (!lineNames)
     3700            return false;
     3701        repeatedValues->append(lineNames.releaseNonNull());
     3702    } while (!args.atEnd());
     3703
     3704    list.append(repeatedValues.releaseNonNull());
     3705    return true;
     3706}
     3707
    36783708enum TrackListType { GridTemplate, GridTemplateNoRepeat, GridAuto };
    36793709
    3680 static RefPtr<CSSValue> consumeGridTrackList(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackListType trackListType)
    3681 {
     3710static RefPtr<CSSValue> consumeGridTrackList(CSSParserTokenRange& range, const CSSParserContext& context, TrackListType trackListType)
     3711{
     3712    bool seenAutoRepeat = false;
     3713    if (trackListType == GridTemplate && context.subgridEnabled && range.peek().id() == CSSValueSubgrid) {
     3714        consumeIdent(range);
     3715        auto values = CSSSubgridValue::create();
     3716        while (!range.atEnd() && range.peek().type() != DelimiterToken) {
     3717            if (range.peek().functionId() == CSSValueRepeat) {
     3718                bool isAutoRepeat;
     3719                if (!consumeSubgridNameRepeatFunction(range, values, isAutoRepeat))
     3720                    return nullptr;
     3721                if (isAutoRepeat && seenAutoRepeat)
     3722                    return nullptr;
     3723                seenAutoRepeat = seenAutoRepeat || isAutoRepeat;
     3724            } else if (auto value = consumeGridLineNames(range, nullptr, true))
     3725                values->append(value.releaseNonNull());
     3726            else
     3727                return nullptr;
     3728        }
     3729        return values;
     3730    }
    36823731    bool allowGridLineNames = trackListType != GridAuto;
    36833732    RefPtr<CSSValueList> values = CSSValueList::createSpaceSeparated();
     
    36893738   
    36903739    bool allowRepeat = trackListType == GridTemplate;
    3691     bool seenAutoRepeat = false;
    36923740    bool allTracksAreFixedSized = true;
    36933741    do {
     
    36963744            if (!allowRepeat)
    36973745                return nullptr;
    3698             if (!consumeGridTrackRepeatFunction(range, cssParserMode, *values, isAutoRepeat, allTracksAreFixedSized))
     3746            if (!consumeGridTrackRepeatFunction(range, context.mode, *values, isAutoRepeat, allTracksAreFixedSized))
    36993747                return nullptr;
    37003748            if (isAutoRepeat && seenAutoRepeat)
    37013749                return nullptr;
    37023750            seenAutoRepeat = seenAutoRepeat || isAutoRepeat;
    3703         } else if (RefPtr<CSSValue> value = consumeGridTrackSize(range, cssParserMode)) {
     3751        } else if (RefPtr<CSSValue> value = consumeGridTrackSize(range, context.mode)) {
    37043752            if (allTracksAreFixedSized)
    37053753                allTracksAreFixedSized = isGridTrackFixedSized(*value);
     
    37193767}
    37203768
    3721 static RefPtr<CSSValue> consumeGridTemplatesRowsOrColumns(CSSParserTokenRange& range, CSSParserMode cssParserMode)
     3769static RefPtr<CSSValue> consumeGridTemplatesRowsOrColumns(CSSParserTokenRange& range, const CSSParserContext& context)
    37223770{
    37233771    if (range.peek().id() == CSSValueNone)
    37243772        return consumeIdent(range);
    3725     return consumeGridTrackList(range, cssParserMode, GridTemplate);
     3773    return consumeGridTrackList(range, context, GridTemplate);
    37263774}
    37273775
     
    46304678    case CSSPropertyGridAutoColumns:
    46314679    case CSSPropertyGridAutoRows:
    4632         return consumeGridTrackList(m_range, m_context.mode, GridAuto);
     4680        return consumeGridTrackList(m_range, m_context, GridAuto);
    46334681    case CSSPropertyGridTemplateColumns:
    46344682    case CSSPropertyGridTemplateRows:
    4635         return consumeGridTemplatesRowsOrColumns(m_range, m_context.mode);
     4683        return consumeGridTemplatesRowsOrColumns(m_range, m_context);
    46364684    case CSSPropertyGridTemplateAreas:
    46374685        return consumeGridTemplateAreas(m_range);
     
    58805928        if (!consumeSlashIncludingWhitespace(m_range))
    58815929            return false;
    5882         columnsValue = consumeGridTrackList(m_range, m_context.mode, GridTemplateNoRepeat);
     5930        columnsValue = consumeGridTrackList(m_range, m_context, GridTemplateNoRepeat);
    58835931        if (!columnsValue || !m_range.atEnd())
    58845932            return false;
     
    59075955    // 2- <grid-template-rows> / <grid-template-columns>
    59085956    if (!rowsValue)
    5909         rowsValue = consumeGridTrackList(m_range, m_context.mode, GridTemplate);
     5957        rowsValue = consumeGridTrackList(m_range, m_context, GridTemplate);
    59105958
    59115959    if (rowsValue) {
    59125960        if (!consumeSlashIncludingWhitespace(m_range))
    59135961            return false;
    5914         RefPtr<CSSValue> columnsValue = consumeGridTemplatesRowsOrColumns(m_range, m_context.mode);
     5962        RefPtr<CSSValue> columnsValue = consumeGridTemplatesRowsOrColumns(m_range, m_context);
    59155963        if (!columnsValue || !m_range.atEnd())
    59165964            return false;
     
    59866034            autoRowsValue = CSSValuePool::singleton().createIdentifierValue(CSSValueAuto);
    59876035        else {
    5988             autoRowsValue = consumeGridTrackList(m_range, m_context.mode, GridAuto);
     6036            autoRowsValue = consumeGridTrackList(m_range, m_context, GridAuto);
    59896037            if (!autoRowsValue)
    59906038                return false;
     
    59946042        if (m_range.atEnd())
    59956043            return false;
    5996         templateColumns = consumeGridTemplatesRowsOrColumns(m_range, m_context.mode);
     6044        templateColumns = consumeGridTemplatesRowsOrColumns(m_range, m_context);
    59976045        if (!templateColumns)
    59986046            return false;
     
    60126060            autoColumnsValue = CSSValuePool::singleton().createIdentifierValue(CSSValueAuto);
    60136061        else {
    6014             autoColumnsValue = consumeGridTrackList(m_range, m_context.mode, GridAuto);
     6062            autoColumnsValue = consumeGridTrackList(m_range, m_context, GridAuto);
    60156063            if (!autoColumnsValue)
    60166064                return false;
  • trunk/Source/WebCore/rendering/style/RenderStyle.h

    r288942 r289722  
    582582    size_t namedGridAreaColumnCount() const { return m_rareNonInheritedData->grid->namedGridAreaColumnCount; }
    583583    GridAutoFlow gridAutoFlow() const { return static_cast<GridAutoFlow>(m_rareNonInheritedData->grid->gridAutoFlow); }
     584    bool gridSubgridRows() const { return m_rareNonInheritedData->grid->subgridRows; }
     585    bool gridSubgridColumns() const { return m_rareNonInheritedData->grid->subgridColumns; }
    584586    bool isGridAutoFlowDirectionRow() const { return (m_rareNonInheritedData->grid->gridAutoFlow & InternalAutoFlowDirectionRow); }
    585587    bool isGridAutoFlowDirectionColumn() const { return (m_rareNonInheritedData->grid->gridAutoFlow & InternalAutoFlowDirectionColumn); }
     
    12041206    void setNamedGridAreaColumnCount(size_t columnCount) { SET_NESTED_VAR(m_rareNonInheritedData, grid, namedGridAreaColumnCount, columnCount); }
    12051207    void setGridAutoFlow(GridAutoFlow flow) { SET_NESTED_VAR(m_rareNonInheritedData, grid, gridAutoFlow, flow); }
     1208    void setGridSubgridRows(bool subgrid) { SET_NESTED_VAR(m_rareNonInheritedData, grid, subgridRows, subgrid); }
     1209    void setGridSubgridColumns(bool subgrid) { SET_NESTED_VAR(m_rareNonInheritedData, grid, subgridColumns, subgrid); }
    12061210    void setGridItemColumnStart(const GridPosition& columnStartPosition) { SET_NESTED_VAR(m_rareNonInheritedData, gridItem, gridColumnStart, columnStartPosition); }
    12071211    void setGridItemColumnEnd(const GridPosition& columnEndPosition) { SET_NESTED_VAR(m_rareNonInheritedData, gridItem, gridColumnEnd, columnEndPosition); }
  • trunk/Source/WebCore/rendering/style/StyleGridData.cpp

    r262262 r289722  
    5656    , autoRepeatColumnsType(RenderStyle::initialGridAutoRepeatType())
    5757    , autoRepeatRowsType(RenderStyle::initialGridAutoRepeatType())
     58    , subgridRows(false)
     59    , subgridColumns(false)
    5860{
    5961}
     
    8587    , autoRepeatColumnsType(o.autoRepeatColumnsType)
    8688    , autoRepeatRowsType(o.autoRepeatRowsType)
     89    , subgridRows(o.subgridRows)
     90    , subgridColumns(o.subgridColumns)
    8791{
    8892}
  • trunk/Source/WebCore/rendering/style/StyleGridData.h

    r284857 r289722  
    5858            && gridAutoRepeatColumns == o.gridAutoRepeatColumns && gridAutoRepeatRows == o.gridAutoRepeatRows
    5959            && autoRepeatColumnsInsertionPoint == o.autoRepeatColumnsInsertionPoint && autoRepeatRowsInsertionPoint == o.autoRepeatRowsInsertionPoint
    60             && autoRepeatColumnsType == o.autoRepeatColumnsType && autoRepeatRowsType == o.autoRepeatRowsType;
     60            && autoRepeatColumnsType == o.autoRepeatColumnsType && autoRepeatRowsType == o.autoRepeatRowsType && subgridRows == o.subgridRows
     61            && subgridColumns == o.subgridColumns;
    6162    }
    6263
     
    103104    AutoRepeatType autoRepeatRowsType;
    104105
     106    bool subgridRows;
     107    bool subgridColumns;
     108
    105109private:
    106110    StyleGridData();
  • trunk/Source/WebCore/style/StyleBuilderConverter.h

    r288556 r289722  
    4545#include "CSSRayValue.h"
    4646#include "CSSReflectValue.h"
     47#include "CSSSubgridValue.h"
    4748#include "CalcExpressionLength.h"
    4849#include "CalcExpressionOperation.h"
     
    982983{
    983984    ASSERT(value.isGridLineNamesValue());
     985    auto orderedResult = orderedNamedGridLines.add(currentNamedGridLine, Vector<String>());
    984986
    985987    for (auto& namedGridLineValue : downcast<CSSGridLineNamesValue>(value)) {
     
    987989        auto result = namedGridLines.add(namedGridLine, Vector<unsigned>());
    988990        result.iterator->value.append(currentNamedGridLine);
    989         auto orderedResult = orderedNamedGridLines.add(currentNamedGridLine, Vector<String>());
     991
    990992        orderedResult.iterator->value.append(namedGridLine);
    991993    }
     
    10051007    unsigned m_autoRepeatInsertionPoint { RenderStyle::initialGridAutoRepeatInsertionPoint() };
    10061008    AutoRepeatType m_autoRepeatType { RenderStyle::initialGridAutoRepeatType() };
     1009    bool isSubgrid { false };
    10071010};
    10081011
     
    10181021    unsigned currentNamedGridLine = 0;
    10191022    auto handleLineNameOrTrackSize = [&](const CSSValue& currentValue) {
    1020         if (is<CSSGridLineNamesValue>(currentValue))
     1023        if (is<CSSGridLineNamesValue>(currentValue)) {
    10211024            createGridLineNamesList(currentValue, currentNamedGridLine, tracksData.m_namedGridLines, tracksData.m_orderedNamedGridLines);
    1022         else {
     1025            // Subgrids only have line names defined, not track sizes, so we want our count
     1026            // to be the number of lines named rather than number of sized tracks.
     1027            if (tracksData.isSubgrid)
     1028                currentNamedGridLine++;
     1029        } else {
    10231030            ++currentNamedGridLine;
    10241031            tracksData.m_trackSizes.append(createGridTrackSize(currentValue, builderState));
     
    10261033    };
    10271034
     1035    if (is<CSSSubgridValue>(value))
     1036        tracksData.isSubgrid = true;
     1037
     1038    unsigned autoRepeatIndex = 0;
    10281039    for (auto& currentValue : downcast<CSSValueList>(value)) {
    10291040        if (is<CSSGridAutoRepeatValue>(currentValue)) {
    1030             ASSERT(tracksData.m_autoRepeatTrackSizes.isEmpty());
    1031             unsigned autoRepeatIndex = 0;
     1041            ASSERT(!autoRepeatIndex);
     1042            autoRepeatIndex = 0;
    10321043            CSSValueID autoRepeatID = downcast<CSSGridAutoRepeatValue>(currentValue.get()).autoRepeatID();
    10331044            ASSERT(autoRepeatID == CSSValueAutoFill || autoRepeatID == CSSValueAutoFit);
     
    10361047                if (is<CSSGridLineNamesValue>(autoRepeatValue)) {
    10371048                    createGridLineNamesList(autoRepeatValue.get(), autoRepeatIndex, tracksData.m_autoRepeatNamedGridLines, tracksData.m_autoRepeatOrderedNamedGridLines);
     1049                    if (tracksData.isSubgrid)
     1050                        ++autoRepeatIndex;
    10381051                    continue;
    10391052                }
     
    10411054                tracksData.m_autoRepeatTrackSizes.append(createGridTrackSize(autoRepeatValue.get(), builderState));
    10421055            }
    1043             tracksData.m_autoRepeatInsertionPoint = currentNamedGridLine++;
     1056            tracksData.m_autoRepeatInsertionPoint = currentNamedGridLine;
     1057            if (!tracksData.isSubgrid)
     1058                currentNamedGridLine++;
    10441059            continue;
    10451060        }
     
    10591074    // The parser should have rejected any <track-list> without any <track-size> as
    10601075    // this is not conformant to the syntax.
    1061     ASSERT(!tracksData.m_trackSizes.isEmpty() || !tracksData.m_autoRepeatTrackSizes.isEmpty());
     1076    ASSERT(!tracksData.m_trackSizes.isEmpty() || !tracksData.m_autoRepeatTrackSizes.isEmpty() || tracksData.isSubgrid);
    10621077    return true;
    10631078}
  • trunk/Source/WebCore/style/StyleBuilderCustom.h

    r288054 r289722  
    19061906    style.setAutoRepeatNamedGrid##TrackType##Lines(tracksData ? tracksData->m_autoRepeatNamedGridLines : parentStyle->autoRepeatNamedGrid##TrackType##Lines()); \
    19071907    style.setAutoRepeatOrderedNamedGrid##TrackType##Lines(tracksData ? tracksData->m_autoRepeatOrderedNamedGridLines : parentStyle->autoRepeatOrderedNamedGrid##TrackType##Lines()); \
    1908     style.setGridAutoRepeat##TrackType##sType(tracksData ? tracksData->m_autoRepeatType : parentStyle->gridAutoRepeat##TrackType##sType());
     1908    style.setGridAutoRepeat##TrackType##sType(tracksData ? tracksData->m_autoRepeatType : parentStyle->gridAutoRepeat##TrackType##sType()); \
     1909    style.setGridSubgrid##TrackType##s(tracksData ? tracksData->isSubgrid : parentStyle->gridSubgrid##TrackType##s());
    19091910
    19101911#define SET_INHERIT_TRACKS_DATA(style, parentStyle, TrackType) \
Note: See TracChangeset for help on using the changeset viewer.