⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 276152 in webkit


Ignore:
Timestamp:
Apr 16, 2021, 12:19:04 PM (5 years ago)
Author:
commit-queue@webkit.org
Message:

[css-counter-styles] Parse and add feature flag for @counter-style
https://bugs.webkit.org/show_bug.cgi?id=223150

Patch by Tyler Wilcock <Tyler Wilcock> on 2021-04-16
Reviewed by Darin Adler.

LayoutTests/imported/w3c:

@counter-style and its descriptors are now exposed behind a feature
flag, so pass some tests and fail others for a different reason
because this patch doesn't actually implement descriptor parsing and
setting yet.

  • web-platform-tests/css/css-counter-styles/counter-style-additive-symbols-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-fallback-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-name-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-negative-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-pad-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-prefix-suffix-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-range-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-speak-as-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-symbols-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/counter-style-system-syntax-expected.txt:
  • web-platform-tests/css/css-counter-styles/idlharness-expected.txt:
  • web-platform-tests/css/cssom/CSSCounterStyleRule-expected.txt:

Source/WebCore:

Parse @counter-style (without implementing descriptor parsing) behind
a new feature flag, CSSCounterStyleAtRulesEnabled. A separate feature
flag for @counter-style <image> symbol values has also been added, as
image symbols have extra complexities that we won't want to hold the
entire feature back on.
https://www.w3.org/TR/css-counter-styles-3

The CSSCounterStyleRule IDL interface is also added and implemented,
and similarly feature flagged.
https://www.w3.org/TR/css-counter-styles-3/#apis

Test: webexposed/counter-style-is-not-exposed.html and existing WPTs.

  • CMakeLists.txt:

Add CSSCounterStyleRule.idl.

  • DerivedSources-input.xcfilelist:

Add CSSCounterStyleRule.idl.

  • DerivedSources-output.xcfilelist:

Add JSCSSCounterStyleRule.h and JSCSSCounterStyleRule.cpp.

  • DerivedSources.make:

Add CSSCounterStyleRule.idl.

  • Sources.txt:

Add CSSCounterStyleRule.cpp and JSCSSCounterStyleRule.cpp.

  • WebCore.xcodeproj/project.pbxproj:

Add CounterStyle.h, CounterStyle.cpp, and CounterStyle.idl.

  • bindings/js/JSCSSRuleCustom.cpp:

(WebCore::toJSNewlyCreated):
Support CSSCounterStyleRule.

  • bindings/js/WebCoreBuiltinNames.h:

Add macro(CSSCounterStyleRule) to generate counter-style built-in
names.

  • css/CSSCounterStyleRule.cpp: Added.

(WebCore::StyleRuleCounterStyle::StyleRuleCounterStyle):
(WebCore::StyleRuleCounterStyle::create):
(WebCore::StyleRuleCounterStyle::mutableProperties):
(WebCore::CSSCounterStyleRule::CSSCounterStyleRule):
(WebCore::CSSCounterStyleRule::reattach):
(WebCore::CSSCounterStyleRule::cssText const):

  • css/CSSCounterStyleRule.h: Added.

(isType): Add specialized rule.isCounterStyleRule() implementation.

  • css/CSSCounterStyleRule.idl: Added.
  • css/CSSRule.cpp: Add new StyleRuleType::CounterStyle COMPILE_ASSERT.
  • css/CSSRule.h:

Add COUNTER_STYLE_RULE constant. Also add comment // WebIDL enum to
disable enum_casing lint, since these values are named to match IDL
attributes.

  • css/CSSRule.idl: Add COUNTER_STYLE_RULE constant behind flag.
  • css/StyleRule.cpp:

(WebCore::StyleRuleBase::destroy):
(WebCore::StyleRuleBase::copy const):
(WebCore::StyleRuleBase::createCSSOMWrapper const):
Handle newly added StyleRuleType::CounterStyle.

  • css/StyleRule.h:

(WebCore::StyleRuleBase::isCounterStyleRule const): Added.

  • css/StyleRuleType.h: Add StyleRuleType::CounterStyle
  • css/StyleSheetContents.cpp:

(WebCore::traverseRulesInVector):
(WebCore::StyleSheetContents::traverseSubresources const):
If @counter-style image symbols flag is enabled, do traverse
subresources.

  • css/parser/CSSAtRuleID.cpp:

If the @counter-style feature flag is enabled, return newly added
CSSAtRuleCounterStyle ID.

(WebCore::cssAtRuleID):

  • css/parser/CSSAtRuleID.h:

Add CSSAtRuleCounterStyle ID.

  • css/parser/CSSParserContext.cpp:

(WebCore::operator==):

  • css/parser/CSSParserContext.h:

(WebCore::CSSParserContextHash::hash):
Add cssCounterStyleAtRulesEnabled and
cssCounterStyleAtRuleImageSymbolsEnabled flags.

  • css/parser/CSSParserFastPaths.cpp:

(WebCore::CSSParserFastPaths::isValidKeywordPropertyAndValue):
Refactor to use new CSSPropertyParserHelpers::isPredefinedCounterStyle
method.

  • css/parser/CSSParserImpl.cpp:

(WebCore::computeNewAllowedRules):
(WebCore::CSSParserImpl::consumeAtRule):
(WebCore::CSSParserImpl::consumeCounterStyleRule): Added.
(WebCore::CSSParserImpl::consumeDeclarationList):
(WebCore::CSSParserImpl::consumeDeclaration):

  • css/parser/CSSParserImpl.h:

Handle new @counter-style rule.

  • css/parser/CSSPropertyParser.cpp:

(WebCore::CSSPropertyParser::parseValue): Handle
StyleRuleType::CounterStyle.
(WebCore::consumeCounterContent):
Refactor to use new CSSPropertyParserHelpers::isPredefinedCounterStyle
method.
(WebCore::CSSPropertyParser::parseCounterStyleDescriptor):
Add placeholder for future @counter-style descriptor parsing work.

  • css/parser/CSSPropertyParser.h:

Add parseCounterStyleDescriptor method

  • css/parser/CSSPropertyParserHelpers.h:
  • css/parser/CSSPropertyParserHelpers.cpp:

(WebCore::CSSPropertyParserHelpers::consumeCustomIdent):
Add new flag that allows consumed custom ident values to be lowercased
on-parse. This is necessary for some <counter-style-name> values.
(WebCore::CSSPropertyParserHelpers::isPredefinedCounterStyle): Added.
(WebCore::CSSPropertyParserHelpers::consumeCounterStyleName):
(WebCore::CSSPropertyParserHelpers::consumeCounterStyleNameInPrelude):
Parse @counter-style names, both in-prelude names and non-prelude
names (e.g. as part of the extends descriptor).

Source/WTF:

  • Scripts/Preferences/WebPreferencesExperimental.yaml: Add CSSCounterStyleAtRulesEnabled and CSSCounterStyleAtRuleImageSymbolsEnabled flags.

Tools:

  • DumpRenderTree/TestOptions.cpp:

(WTR::TestOptions::defaults):
Add false defaults for CSSCounterStyleAtRulesEnabled and
CSSCounterStyleAtRuleImageSymbolsEnabled flags.

LayoutTests:

Add tests ensuring @counter-style is not exposed when feature flag is
disabled.

  • webexposed/counter-style-is-not-exposed-expected.txt: Added.
  • webexposed/counter-style-is-not-exposed.html: Added.
Location:
trunk
Files:
5 added
45 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r276135 r276152  
     12021-04-16  Tyler Wilcock  <twilco.o@protonmail.com>
     2
     3        [css-counter-styles] Parse and add feature flag for @counter-style
     4        https://bugs.webkit.org/show_bug.cgi?id=223150
     5
     6        Reviewed by Darin Adler.
     7
     8        Add tests ensuring @counter-style is not exposed when feature flag is
     9        disabled.
     10
     11        * webexposed/counter-style-is-not-exposed-expected.txt: Added.
     12        * webexposed/counter-style-is-not-exposed.html: Added.
     13
    1142021-04-16  Zalan Bujtas  <zalan@apple.com>
    215
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r276138 r276152  
     12021-04-16  Tyler Wilcock  <twilco.o@protonmail.com>
     2
     3        [css-counter-styles] Parse and add feature flag for @counter-style
     4        https://bugs.webkit.org/show_bug.cgi?id=223150
     5
     6        Reviewed by Darin Adler.
     7
     8        @counter-style and its descriptors are now exposed behind a feature
     9        flag, so pass some tests and fail others for a different reason
     10        because this patch doesn't actually implement descriptor parsing and
     11        setting yet.
     12
     13        * web-platform-tests/css/css-counter-styles/counter-style-additive-symbols-syntax-expected.txt:
     14        * web-platform-tests/css/css-counter-styles/counter-style-fallback-expected.txt:
     15        * web-platform-tests/css/css-counter-styles/counter-style-name-syntax-expected.txt:
     16        * web-platform-tests/css/css-counter-styles/counter-style-negative-syntax-expected.txt:
     17        * web-platform-tests/css/css-counter-styles/counter-style-pad-syntax-expected.txt:
     18        * web-platform-tests/css/css-counter-styles/counter-style-prefix-suffix-syntax-expected.txt:
     19        * web-platform-tests/css/css-counter-styles/counter-style-range-syntax-expected.txt:
     20        * web-platform-tests/css/css-counter-styles/counter-style-speak-as-syntax-expected.txt:
     21        * web-platform-tests/css/css-counter-styles/counter-style-symbols-syntax-expected.txt:
     22        * web-platform-tests/css/css-counter-styles/counter-style-system-syntax-expected.txt:
     23        * web-platform-tests/css/css-counter-styles/idlharness-expected.txt:
     24        * web-platform-tests/css/cssom/CSSCounterStyleRule-expected.txt:
     25
    1262021-04-16  Antoine Quint  <graouts@webkit.org>
    227
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-additive-symbols-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'additive-symbols: 1 "X"' is valid assert_equals: expected (undefined) undefined but got (string) "1 \"X\""
    3 FAIL @counter-style 'additive-symbols: "X" 1' is valid assert_equals: expected (undefined) undefined but got (string) "1 \"X\""
    4 FAIL @counter-style 'additive-symbols: 5 "V", 1 "I"' is valid assert_equals: expected (undefined) undefined but got (string) "5 \"V\", 1 \"I\""
     2FAIL @counter-style 'additive-symbols: 1 "X"' is valid assert_not_equals: got disallowed value -1
     3FAIL @counter-style 'additive-symbols: "X" 1' is valid assert_not_equals: got disallowed value -1
     4FAIL @counter-style 'additive-symbols: 5 "V", 1 "I"' is valid assert_not_equals: got disallowed value -1
    55PASS @counter-style 'additive-symbols: ' is invalid
    66PASS @counter-style 'additive-symbols: -1 "X"' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-fallback-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'fallback: bar' is valid assert_equals: expected (undefined) undefined but got (string) "bar"
     2FAIL @counter-style 'fallback: bar' is valid assert_not_equals: got disallowed value -1
    33PASS @counter-style 'fallback: "bar"' is invalid
    44PASS @counter-style 'fallback: none' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-name-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style name foo is valid assert_not_equals: got disallowed value undefined
     2PASS @counter-style name foo is valid
    33PASS @counter-style name  is invalid
    44PASS @counter-style name none is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-negative-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'negative: "X"' is valid assert_equals: expected (undefined) undefined but got (string) "\"X\""
    3 FAIL @counter-style 'negative: "X" "X"' is valid assert_equals: expected (undefined) undefined but got (string) "\"X\" \"X\""
     2FAIL @counter-style 'negative: "X"' is valid assert_not_equals: got disallowed value -1
     3FAIL @counter-style 'negative: "X" "X"' is valid assert_not_equals: got disallowed value -1
    44PASS @counter-style 'negative: "X" "X" "X"' is invalid
    55
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-pad-syntax-expected.txt

    r273065 r276152  
    22PASS @counter-style 'pad: 10' is invalid
    33PASS @counter-style 'pad: "X"' is invalid
    4 FAIL @counter-style 'pad: 10 "X"' is valid assert_equals: expected (undefined) undefined but got (string) "10 \"X\""
    5 FAIL @counter-style 'pad: "X" 10' is valid assert_equals: expected (undefined) undefined but got (string) "10 \"X\""
     4FAIL @counter-style 'pad: 10 "X"' is valid assert_not_equals: got disallowed value -1
     5FAIL @counter-style 'pad: "X" 10' is valid assert_not_equals: got disallowed value -1
    66PASS @counter-style 'pad: -1 "X"' is invalid
    77PASS @counter-style 'pad: "X" -1' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-prefix-suffix-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'prefix: "string"' is valid assert_equals: expected (undefined) undefined but got (string) "\"string\""
    3 FAIL @counter-style 'suffix: "string"' is valid assert_equals: expected (undefined) undefined but got (string) "\"string\""
    4 FAIL @counter-style 'prefix: "initial"' is valid assert_equals: expected (undefined) undefined but got (string) "\"initial\""
    5 FAIL @counter-style 'suffix: "initial"' is valid assert_equals: expected (undefined) undefined but got (string) "\"initial\""
    6 FAIL @counter-style 'prefix: "inherit"' is valid assert_equals: expected (undefined) undefined but got (string) "\"inherit\""
    7 FAIL @counter-style 'suffix: "inherit"' is valid assert_equals: expected (undefined) undefined but got (string) "\"inherit\""
    8 FAIL @counter-style 'prefix: "unset"' is valid assert_equals: expected (undefined) undefined but got (string) "\"unset\""
    9 FAIL @counter-style 'suffix: "unset"' is valid assert_equals: expected (undefined) undefined but got (string) "\"unset\""
    10 FAIL @counter-style 'prefix: custom-ident' is valid assert_equals: expected (undefined) undefined but got (string) "custom-ident"
    11 FAIL @counter-style 'suffix: custom-ident' is valid assert_equals: expected (undefined) undefined but got (string) "custom-ident"
     2FAIL @counter-style 'prefix: "string"' is valid assert_not_equals: got disallowed value -1
     3FAIL @counter-style 'suffix: "string"' is valid assert_not_equals: got disallowed value -1
     4FAIL @counter-style 'prefix: "initial"' is valid assert_not_equals: got disallowed value -1
     5FAIL @counter-style 'suffix: "initial"' is valid assert_not_equals: got disallowed value -1
     6FAIL @counter-style 'prefix: "inherit"' is valid assert_not_equals: got disallowed value -1
     7FAIL @counter-style 'suffix: "inherit"' is valid assert_not_equals: got disallowed value -1
     8FAIL @counter-style 'prefix: "unset"' is valid assert_not_equals: got disallowed value -1
     9FAIL @counter-style 'suffix: "unset"' is valid assert_not_equals: got disallowed value -1
     10FAIL @counter-style 'prefix: custom-ident' is valid assert_not_equals: got disallowed value -1
     11FAIL @counter-style 'suffix: custom-ident' is valid assert_not_equals: got disallowed value -1
    1212PASS @counter-style 'prefix: initial' is invalid
    1313PASS @counter-style 'suffix: initial' is invalid
     
    1616PASS @counter-style 'prefix: unset' is invalid
    1717PASS @counter-style 'suffix: unset' is invalid
    18 FAIL @counter-style 'prefix: url("https://example.com/foo.png")' is valid assert_equals: expected (undefined) undefined but got (string) "url(\"https://example.com/foo.png\")"
    19 FAIL @counter-style 'suffix: url("https://example.com/foo.png")' is valid assert_equals: expected (undefined) undefined but got (string) "url(\"https://example.com/foo.png\")"
    20 FAIL @counter-style 'prefix: url(https://example.com/foo.png)' is valid assert_equals: expected (undefined) undefined but got (string) "url(\"https://example.com/foo.png\")"
    21 FAIL @counter-style 'suffix: url(https://example.com/foo.png)' is valid assert_equals: expected (undefined) undefined but got (string) "url(\"https://example.com/foo.png\")"
    22 FAIL @counter-style 'prefix: linear-gradient(yellow, blue)' is valid assert_equals: expected (undefined) undefined but got (string) "linear-gradient(yellow, blue)"
    23 FAIL @counter-style 'suffix: linear-gradient(yellow, blue)' is valid assert_equals: expected (undefined) undefined but got (string) "linear-gradient(yellow, blue)"
     18FAIL @counter-style 'prefix: url("https://example.com/foo.png")' is valid assert_not_equals: got disallowed value -1
     19FAIL @counter-style 'suffix: url("https://example.com/foo.png")' is valid assert_not_equals: got disallowed value -1
     20FAIL @counter-style 'prefix: url(https://example.com/foo.png)' is valid assert_not_equals: got disallowed value -1
     21FAIL @counter-style 'suffix: url(https://example.com/foo.png)' is valid assert_not_equals: got disallowed value -1
     22FAIL @counter-style 'prefix: linear-gradient(yellow, blue)' is valid assert_not_equals: got disallowed value -1
     23FAIL @counter-style 'suffix: linear-gradient(yellow, blue)' is valid assert_not_equals: got disallowed value -1
    2424PASS @counter-style 'prefix: ' is invalid
    2525PASS @counter-style 'suffix: ' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-range-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'range: auto' is valid assert_equals: expected (undefined) undefined but got (string) "auto"
    3 FAIL @counter-style 'range: infinite infinite' is valid assert_equals: expected (undefined) undefined but got (string) "infinite infinite"
    4 FAIL @counter-style 'range: infinite 0' is valid assert_equals: expected (undefined) undefined but got (string) "infinite 0"
    5 FAIL @counter-style 'range: 0 infinite' is valid assert_equals: expected (undefined) undefined but got (string) "0 infinite"
    6 FAIL @counter-style 'range: infinite 0, 5 10, 100 infinite' is valid assert_equals: expected (undefined) undefined but got (string) "infinite 0, 5 10, 100 infinite"
    7 FAIL @counter-style 'range: infinite 10, 5 20, 15 infinite' is valid assert_equals: expected (undefined) undefined but got (string) "infinite 10, 5 20, 15 infinite"
     2FAIL @counter-style 'range: auto' is valid assert_not_equals: got disallowed value -1
     3FAIL @counter-style 'range: infinite infinite' is valid assert_not_equals: got disallowed value -1
     4FAIL @counter-style 'range: infinite 0' is valid assert_not_equals: got disallowed value -1
     5FAIL @counter-style 'range: 0 infinite' is valid assert_not_equals: got disallowed value -1
     6FAIL @counter-style 'range: infinite 0, 5 10, 100 infinite' is valid assert_not_equals: got disallowed value -1
     7FAIL @counter-style 'range: infinite 10, 5 20, 15 infinite' is valid assert_not_equals: got disallowed value -1
    88PASS @counter-style 'range: ' is invalid
    99PASS @counter-style 'range: 0 -1' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-speak-as-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'speak-as: auto' is valid assert_equals: expected (undefined) undefined but got (string) "auto"
    3 FAIL @counter-style 'speak-as: bullets' is valid assert_equals: expected (undefined) undefined but got (string) "bullets"
    4 FAIL @counter-style 'speak-as: numbers' is valid assert_equals: expected (undefined) undefined but got (string) "numbers"
    5 FAIL @counter-style 'speak-as: words' is valid assert_equals: expected (undefined) undefined but got (string) "words"
    6 FAIL @counter-style 'speak-as: spell-out' is valid assert_equals: expected (undefined) undefined but got (string) "spell-out"
    7 FAIL @counter-style 'speak-as: bar' is valid assert_equals: expected (undefined) undefined but got (string) "bar"
    8 FAIL @counter-style 'speak-as: spellout' is valid assert_equals: expected (undefined) undefined but got (string) "spellout"
     2FAIL @counter-style 'speak-as: auto' is valid assert_not_equals: got disallowed value -1
     3FAIL @counter-style 'speak-as: bullets' is valid assert_not_equals: got disallowed value -1
     4FAIL @counter-style 'speak-as: numbers' is valid assert_not_equals: got disallowed value -1
     5FAIL @counter-style 'speak-as: words' is valid assert_not_equals: got disallowed value -1
     6FAIL @counter-style 'speak-as: spell-out' is valid assert_not_equals: got disallowed value -1
     7FAIL @counter-style 'speak-as: bar' is valid assert_not_equals: got disallowed value -1
     8FAIL @counter-style 'speak-as: spellout' is valid assert_not_equals: got disallowed value -1
    99PASS @counter-style 'speak-as: bullets numbers' is invalid
    1010PASS @counter-style 'speak-as: none' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-symbols-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'symbols: "X"' is valid assert_equals: expected (undefined) undefined but got (string) "\"X\""
    3 FAIL @counter-style 'symbols: "X" "X"' is valid assert_equals: expected (undefined) undefined but got (string) "\"X\" \"X\""
    4 FAIL @counter-style 'symbols: ident "X"' is valid assert_equals: expected (undefined) undefined but got (string) "ident \"X\""
    5 FAIL @counter-style 'symbols: ident "X" url("foo.jpg")' is valid assert_equals: expected (undefined) undefined but got (string) "ident \"X\" url(\"foo.jpg\")"
     2FAIL @counter-style 'symbols: "X"' is valid assert_not_equals: got disallowed value -1
     3FAIL @counter-style 'symbols: "X" "X"' is valid assert_not_equals: got disallowed value -1
     4FAIL @counter-style 'symbols: ident "X"' is valid assert_not_equals: got disallowed value -1
     5FAIL @counter-style 'symbols: ident "X" url("foo.jpg")' is valid assert_not_equals: got disallowed value -1
    66PASS @counter-style 'symbols: ' is invalid
    77PASS @counter-style 'symbols: initial "X" "X"' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/counter-style-system-syntax-expected.txt

    r273065 r276152  
    11
    2 FAIL @counter-style 'system: cyclic' is valid assert_equals: expected (undefined) undefined but got (string) "cyclic"
    3 FAIL @counter-style 'system: fixed' is valid assert_equals: expected (undefined) undefined but got (string) "fixed"
    4 FAIL @counter-style 'system: fixed 100' is valid assert_equals: expected (undefined) undefined but got (string) "fixed 100"
    5 FAIL @counter-style 'system: fixed -1' is valid assert_equals: expected (undefined) undefined but got (string) "fixed -1"
    6 FAIL @counter-style 'system: symbolic' is valid assert_equals: expected (undefined) undefined but got (string) "symbolic"
    7 FAIL @counter-style 'system: alphabetic' is valid assert_equals: expected (undefined) undefined but got (string) "alphabetic"
    8 FAIL @counter-style 'system: numeric' is valid assert_equals: expected (undefined) undefined but got (string) "numeric"
    9 FAIL @counter-style 'system: additive' is valid assert_equals: expected (undefined) undefined but got (string) "additive"
    10 FAIL @counter-style 'system: extends bar' is valid assert_equals: expected (undefined) undefined but got (string) "extends bar"
     2FAIL @counter-style 'system: cyclic' is valid assert_not_equals: got disallowed value -1
     3FAIL @counter-style 'system: fixed' is valid assert_not_equals: got disallowed value -1
     4FAIL @counter-style 'system: fixed 100' is valid assert_not_equals: got disallowed value -1
     5FAIL @counter-style 'system: fixed -1' is valid assert_not_equals: got disallowed value -1
     6FAIL @counter-style 'system: symbolic' is valid assert_not_equals: got disallowed value -1
     7FAIL @counter-style 'system: alphabetic' is valid assert_not_equals: got disallowed value -1
     8FAIL @counter-style 'system: numeric' is valid assert_not_equals: got disallowed value -1
     9FAIL @counter-style 'system: additive' is valid assert_not_equals: got disallowed value -1
     10FAIL @counter-style 'system: extends bar' is valid assert_not_equals: got disallowed value -1
    1111PASS @counter-style 'system: float' is invalid
    1212PASS @counter-style 'system: cyclic cyclic' is invalid
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-counter-styles/idlharness-expected.txt

    r273065 r276152  
    44PASS Partial interface CSSRule: original interface defined
    55PASS Partial interface CSSRule: member names are unique
    6 FAIL CSSCounterStyleRule interface: existence and properties of interface object assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    7 FAIL CSSCounterStyleRule interface object length assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    8 FAIL CSSCounterStyleRule interface object name assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    9 FAIL CSSCounterStyleRule interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    10 FAIL CSSCounterStyleRule interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    11 FAIL CSSCounterStyleRule interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    12 FAIL CSSCounterStyleRule interface: attribute name assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    13 FAIL CSSCounterStyleRule interface: attribute system assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    14 FAIL CSSCounterStyleRule interface: attribute symbols assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    15 FAIL CSSCounterStyleRule interface: attribute additiveSymbols assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    16 FAIL CSSCounterStyleRule interface: attribute negative assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    17 FAIL CSSCounterStyleRule interface: attribute prefix assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    18 FAIL CSSCounterStyleRule interface: attribute suffix assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    19 FAIL CSSCounterStyleRule interface: attribute range assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    20 FAIL CSSCounterStyleRule interface: attribute pad assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    21 FAIL CSSCounterStyleRule interface: attribute speakAs assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    22 FAIL CSSCounterStyleRule interface: attribute fallback assert_own_property: self does not have own property "CSSCounterStyleRule" expected property "CSSCounterStyleRule" missing
    23 FAIL CSSCounterStyleRule must be primary interface of counter assert_equals: wrong typeof object expected "object" but got "undefined"
    24 FAIL Stringification of counter assert_equals: wrong typeof object expected "object" but got "undefined"
    25 FAIL CSSCounterStyleRule interface: counter must inherit property "name" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    26 FAIL CSSCounterStyleRule interface: counter must inherit property "system" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    27 FAIL CSSCounterStyleRule interface: counter must inherit property "symbols" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    28 FAIL CSSCounterStyleRule interface: counter must inherit property "additiveSymbols" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    29 FAIL CSSCounterStyleRule interface: counter must inherit property "negative" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    30 FAIL CSSCounterStyleRule interface: counter must inherit property "prefix" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    31 FAIL CSSCounterStyleRule interface: counter must inherit property "suffix" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    32 FAIL CSSCounterStyleRule interface: counter must inherit property "range" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    33 FAIL CSSCounterStyleRule interface: counter must inherit property "pad" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    34 FAIL CSSCounterStyleRule interface: counter must inherit property "speakAs" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    35 FAIL CSSCounterStyleRule interface: counter must inherit property "fallback" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    36 FAIL CSSRule interface: counter must inherit property "COUNTER_STYLE_RULE" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
    37 FAIL CSSRule interface: constant COUNTER_STYLE_RULE on interface object assert_own_property: expected property "COUNTER_STYLE_RULE" missing
    38 FAIL CSSRule interface: constant COUNTER_STYLE_RULE on interface prototype object assert_own_property: expected property "COUNTER_STYLE_RULE" missing
     6PASS CSSCounterStyleRule interface: existence and properties of interface object
     7PASS CSSCounterStyleRule interface object length
     8PASS CSSCounterStyleRule interface object name
     9PASS CSSCounterStyleRule interface: existence and properties of interface prototype object
     10PASS CSSCounterStyleRule interface: existence and properties of interface prototype object's "constructor" property
     11PASS CSSCounterStyleRule interface: existence and properties of interface prototype object's @@unscopables property
     12PASS CSSCounterStyleRule interface: attribute name
     13PASS CSSCounterStyleRule interface: attribute system
     14PASS CSSCounterStyleRule interface: attribute symbols
     15PASS CSSCounterStyleRule interface: attribute additiveSymbols
     16PASS CSSCounterStyleRule interface: attribute negative
     17PASS CSSCounterStyleRule interface: attribute prefix
     18PASS CSSCounterStyleRule interface: attribute suffix
     19PASS CSSCounterStyleRule interface: attribute range
     20PASS CSSCounterStyleRule interface: attribute pad
     21PASS CSSCounterStyleRule interface: attribute speakAs
     22PASS CSSCounterStyleRule interface: attribute fallback
     23PASS CSSCounterStyleRule must be primary interface of counter
     24PASS Stringification of counter
     25PASS CSSCounterStyleRule interface: counter must inherit property "name" with the proper type
     26PASS CSSCounterStyleRule interface: counter must inherit property "system" with the proper type
     27PASS CSSCounterStyleRule interface: counter must inherit property "symbols" with the proper type
     28PASS CSSCounterStyleRule interface: counter must inherit property "additiveSymbols" with the proper type
     29PASS CSSCounterStyleRule interface: counter must inherit property "negative" with the proper type
     30PASS CSSCounterStyleRule interface: counter must inherit property "prefix" with the proper type
     31PASS CSSCounterStyleRule interface: counter must inherit property "suffix" with the proper type
     32PASS CSSCounterStyleRule interface: counter must inherit property "range" with the proper type
     33PASS CSSCounterStyleRule interface: counter must inherit property "pad" with the proper type
     34PASS CSSCounterStyleRule interface: counter must inherit property "speakAs" with the proper type
     35PASS CSSCounterStyleRule interface: counter must inherit property "fallback" with the proper type
     36PASS CSSRule interface: counter must inherit property "COUNTER_STYLE_RULE" with the proper type
     37PASS CSSRule interface: constant COUNTER_STYLE_RULE on interface object
     38PASS CSSRule interface: constant COUNTER_STYLE_RULE on interface prototype object
    3939
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/cssom/CSSCounterStyleRule-expected.txt

    r268961 r276152  
    11
    2 FAIL CSSCounterStyleRule.cssText doesn't serialize with newlines undefined is not an object (evaluating 'rule.cssText')
     2PASS CSSCounterStyleRule.cssText doesn't serialize with newlines
    33
  • trunk/Source/WTF/ChangeLog

    r276033 r276152  
     12021-04-16  Tyler Wilcock  <twilco.o@protonmail.com>
     2
     3        [css-counter-styles] Parse and add feature flag for @counter-style
     4        https://bugs.webkit.org/show_bug.cgi?id=223150
     5
     6        Reviewed by Darin Adler.
     7
     8        * Scripts/Preferences/WebPreferencesExperimental.yaml:
     9         Add CSSCounterStyleAtRulesEnabled and CSSCounterStyleAtRuleImageSymbolsEnabled flags.
     10
    1112021-04-15  Alex Christensen  <achristensen@webkit.org>
    212
  • trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml

    r275496 r276152  
    161161      default: false
    162162
     163CSSCounterStyleAtRuleImageSymbolsEnabled:
     164  type: bool
     165  humanReadableName: "CSS @counter-style <image> symbols"
     166  humanReadableDescription: "Enable support for <image> symbols in CSS @counter-style rules"
     167  defaultValue:
     168    WebKitLegacy:
     169      default: false
     170    WebKit:
     171      default: false
     172    WebCore:
     173      default: false
     174
     175CSSCounterStyleAtRulesEnabled:
     176  type: bool
     177  humanReadableName: "CSS @counter-style"
     178  humanReadableDescription: "Enable support for CSS @counter-style rules"
     179  defaultValue:
     180    WebKitLegacy:
     181      default: false
     182    WebKit:
     183      default: false
     184    WebCore:
     185      default: false
     186
    163187CSSCustomPropertiesAndValuesEnabled:
    164188  type: bool
  • trunk/Source/WebCore/CMakeLists.txt

    r276111 r276152  
    737737
    738738    css/CSSConditionRule.idl
     739    css/CSSCounterStyleRule.idl
    739740    css/CSSFontFaceRule.idl
    740741    css/CSSGroupingRule.idl
  • trunk/Source/WebCore/ChangeLog

    r276147 r276152  
     12021-04-16  Tyler Wilcock  <twilco.o@protonmail.com>
     2
     3        [css-counter-styles] Parse and add feature flag for @counter-style
     4        https://bugs.webkit.org/show_bug.cgi?id=223150
     5
     6        Reviewed by Darin Adler.
     7
     8        Parse @counter-style (without implementing descriptor parsing) behind
     9        a new feature flag, CSSCounterStyleAtRulesEnabled.  A separate feature
     10        flag for @counter-style <image> symbol values has also been added, as
     11        image symbols have extra complexities that we won't want to hold the
     12        entire feature back on.
     13        https://www.w3.org/TR/css-counter-styles-3
     14
     15        The CSSCounterStyleRule IDL interface is also added and implemented,
     16        and similarly feature flagged.
     17        https://www.w3.org/TR/css-counter-styles-3/#apis
     18
     19        Test: webexposed/counter-style-is-not-exposed.html and existing WPTs.
     20
     21        * CMakeLists.txt:
     22        Add CSSCounterStyleRule.idl.
     23
     24        * DerivedSources-input.xcfilelist:
     25        Add CSSCounterStyleRule.idl.
     26
     27        * DerivedSources-output.xcfilelist:
     28        Add JSCSSCounterStyleRule.h and JSCSSCounterStyleRule.cpp.
     29
     30        * DerivedSources.make:
     31        Add CSSCounterStyleRule.idl.
     32
     33        * Sources.txt:
     34        Add CSSCounterStyleRule.cpp and JSCSSCounterStyleRule.cpp.
     35
     36        * WebCore.xcodeproj/project.pbxproj:
     37        Add CounterStyle.h, CounterStyle.cpp, and CounterStyle.idl.
     38
     39        * bindings/js/JSCSSRuleCustom.cpp:
     40        (WebCore::toJSNewlyCreated):
     41        Support CSSCounterStyleRule.
     42
     43        * bindings/js/WebCoreBuiltinNames.h:
     44        Add macro(CSSCounterStyleRule) to generate counter-style built-in
     45        names.
     46
     47        * css/CSSCounterStyleRule.cpp: Added.
     48        (WebCore::StyleRuleCounterStyle::StyleRuleCounterStyle):
     49        (WebCore::StyleRuleCounterStyle::create):
     50        (WebCore::StyleRuleCounterStyle::mutableProperties):
     51        (WebCore::CSSCounterStyleRule::CSSCounterStyleRule):
     52        (WebCore::CSSCounterStyleRule::reattach):
     53        (WebCore::CSSCounterStyleRule::cssText const):
     54
     55        * css/CSSCounterStyleRule.h: Added.
     56        (isType): Add specialized rule.isCounterStyleRule() implementation.
     57
     58        * css/CSSCounterStyleRule.idl: Added.
     59        * css/CSSRule.cpp: Add new StyleRuleType::CounterStyle COMPILE_ASSERT.
     60        * css/CSSRule.h:
     61        Add COUNTER_STYLE_RULE constant.  Also add comment `// WebIDL enum` to
     62        disable enum_casing lint, since these values are named to match IDL
     63        attributes.
     64        * css/CSSRule.idl: Add COUNTER_STYLE_RULE constant behind flag.
     65
     66        * css/StyleRule.cpp:
     67        (WebCore::StyleRuleBase::destroy):
     68        (WebCore::StyleRuleBase::copy const):
     69        (WebCore::StyleRuleBase::createCSSOMWrapper const):
     70        Handle newly added StyleRuleType::CounterStyle.
     71
     72        * css/StyleRule.h:
     73        (WebCore::StyleRuleBase::isCounterStyleRule const): Added.
     74
     75        * css/StyleRuleType.h: Add StyleRuleType::CounterStyle
     76
     77        * css/StyleSheetContents.cpp:
     78        (WebCore::traverseRulesInVector):
     79        (WebCore::StyleSheetContents::traverseSubresources const):
     80        If @counter-style image symbols flag is enabled, do traverse
     81        subresources.
     82
     83        * css/parser/CSSAtRuleID.cpp:
     84        If the @counter-style feature flag is enabled, return newly added
     85        CSSAtRuleCounterStyle ID.
     86
     87        (WebCore::cssAtRuleID):
     88        * css/parser/CSSAtRuleID.h:
     89        Add CSSAtRuleCounterStyle ID.
     90
     91        * css/parser/CSSParserContext.cpp:
     92        (WebCore::operator==):
     93        * css/parser/CSSParserContext.h:
     94        (WebCore::CSSParserContextHash::hash):
     95        Add cssCounterStyleAtRulesEnabled and
     96        cssCounterStyleAtRuleImageSymbolsEnabled flags.
     97
     98        * css/parser/CSSParserFastPaths.cpp:
     99        (WebCore::CSSParserFastPaths::isValidKeywordPropertyAndValue):
     100        Refactor to use new CSSPropertyParserHelpers::isPredefinedCounterStyle
     101        method.
     102
     103        * css/parser/CSSParserImpl.cpp:
     104        (WebCore::computeNewAllowedRules):
     105        (WebCore::CSSParserImpl::consumeAtRule):
     106        (WebCore::CSSParserImpl::consumeCounterStyleRule): Added.
     107        (WebCore::CSSParserImpl::consumeDeclarationList):
     108        (WebCore::CSSParserImpl::consumeDeclaration):
     109        * css/parser/CSSParserImpl.h:
     110        Handle new @counter-style rule.
     111
     112        * css/parser/CSSPropertyParser.cpp:
     113        (WebCore::CSSPropertyParser::parseValue): Handle
     114        StyleRuleType::CounterStyle.
     115        (WebCore::consumeCounterContent):
     116        Refactor to use new CSSPropertyParserHelpers::isPredefinedCounterStyle
     117        method.
     118        (WebCore::CSSPropertyParser::parseCounterStyleDescriptor):
     119        Add placeholder for future @counter-style descriptor parsing work.
     120
     121        * css/parser/CSSPropertyParser.h:
     122        Add parseCounterStyleDescriptor method
     123
     124        * css/parser/CSSPropertyParserHelpers.h:
     125        * css/parser/CSSPropertyParserHelpers.cpp:
     126        (WebCore::CSSPropertyParserHelpers::consumeCustomIdent):
     127        Add new flag that allows consumed custom ident values to be lowercased
     128        on-parse.  This is necessary for some <counter-style-name> values.
     129        (WebCore::CSSPropertyParserHelpers::isPredefinedCounterStyle): Added.
     130        (WebCore::CSSPropertyParserHelpers::consumeCounterStyleName):
     131        (WebCore::CSSPropertyParserHelpers::consumeCounterStyleNameInPrelude):
     132        Parse @counter-style names, both in-prelude names and non-prelude
     133        names (e.g. as part of the `extends` descriptor).
     134
    11352021-04-16  Chris Dumez  <cdumez@apple.com>
    2136
  • trunk/Source/WebCore/DerivedSources-input.xcfilelist

    r275314 r276152  
    721721$(PROJECT_DIR)/crypto/parameters/RsaPssParams.idl
    722722$(PROJECT_DIR)/css/CSSConditionRule.idl
     723$(PROJECT_DIR)/css/CSSCounterStyleRule.idl
    723724$(PROJECT_DIR)/css/CSSFontFaceRule.idl
    724725$(PROJECT_DIR)/css/CSSGroupingRule.idl
  • trunk/Source/WebCore/DerivedSources-output.xcfilelist

    r275314 r276152  
    284284$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSConditionRule.cpp
    285285$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSConditionRule.h
     286$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSCounterStyleRule.cpp
     287$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSCounterStyleRule.h
    286288$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSFontFaceRule.cpp
    287289$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSCSSFontFaceRule.h
  • trunk/Source/WebCore/DerivedSources.make

    r275314 r276152  
    618618    $(WebCore)/crypto/parameters/RsaPssParams.idl \
    619619    $(WebCore)/css/CSSConditionRule.idl \
     620    $(WebCore)/css/CSSCounterStyleRule.idl \
    620621    $(WebCore)/css/CSSFontFaceRule.idl \
    621622    $(WebCore)/css/CSSGroupingRule.idl \
  • trunk/Source/WebCore/Sources.txt

    r276017 r276152  
    724724css/CSSConditionRule.cpp
    725725css/CSSContentDistributionValue.cpp
     726css/CSSCounterStyleRule.cpp
    726727css/CSSCrossfadeValue.cpp
    727728css/CSSCursorImageValue.cpp
     
    28362837JSCSSAnimation.cpp
    28372838JSCSSConditionRule.cpp
     2839JSCSSCounterStyleRule.cpp
    28382840JSCSSFontFaceRule.cpp
    28392841JSCSSGroupingRule.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r276120 r276152  
    30913091                98CE432A129E00E5005821DC /* LinkLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 98CE4329129E00E5005821DC /* LinkLoader.h */; settings = {ATTRIBUTES = (Private, ); }; };
    30923092                98EB1F951313FE0500D0E1EA /* NotImplemented.h in Headers */ = {isa = PBXBuildFile; fileRef = 98EB1F941313FE0500D0E1EA /* NotImplemented.h */; settings = {ATTRIBUTES = (Private, ); }; };
     3093                98F9D66925FDE02200BD842D /* CSSCounterStyleRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 98F9D66825FDDFE800BD842D /* CSSCounterStyleRule.h */; settings = {ATTRIBUTES = (Private, ); }; };
    30933094                9920398318B95BC600B39AF9 /* UserInputBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 9920398118B95BC600B39AF9 /* UserInputBridge.h */; settings = {ATTRIBUTES = (Private, ); }; };
    30943095                994C603A253A277300BDF060 /* InspectorFrontendAPIDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 994C6037253A277200BDF060 /* InspectorFrontendAPIDispatcher.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1212412125                98CE4329129E00E5005821DC /* LinkLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkLoader.h; sourceTree = "<group>"; };
    1212512126                98EB1F941313FE0500D0E1EA /* NotImplemented.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotImplemented.h; sourceTree = "<group>"; };
     12127                98F9D66525FDDFE700BD842D /* CSSCounterStyleRule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSCounterStyleRule.cpp; sourceTree = "<group>"; };
     12128                98F9D66725FDDFE800BD842D /* CSSCounterStyleRule.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CSSCounterStyleRule.idl; sourceTree = "<group>"; };
     12129                98F9D66825FDDFE800BD842D /* CSSCounterStyleRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSCounterStyleRule.h; sourceTree = "<group>"; };
    1212612130                9908B0ED1BCACF9100ED0F65 /* ByteLengthQueuingStrategy.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = ByteLengthQueuingStrategy.js; sourceTree = "<group>"; };
    1212712131                9908B0EE1BCACF9100ED0F65 /* CountQueuingStrategy.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = CountQueuingStrategy.js; sourceTree = "<group>"; };
     
    2960129605                                9DAC7C521AF2CAA100437C44 /* CSSContentDistributionValue.cpp */,
    2960229606                                9DAC7C531AF2CAA100437C44 /* CSSContentDistributionValue.h */,
     29607                                98F9D66525FDDFE700BD842D /* CSSCounterStyleRule.cpp */,
     29608                                98F9D66825FDDFE800BD842D /* CSSCounterStyleRule.h */,
     29609                                98F9D66725FDDFE800BD842D /* CSSCounterStyleRule.idl */,
    2960329610                                2D8FEBDA143E3EF70072502B /* CSSCrossfadeValue.cpp */,
    2960429611                                2D8FEBDB143E3EF70072502B /* CSSCrossfadeValue.h */,
     
    3195931966                                930AAC9A250EB8490013DA9F /* CSSConditionRule.h in Headers */,
    3196031967                                9DAC7C551AF2CAA200437C44 /* CSSContentDistributionValue.h in Headers */,
     31968                                98F9D66925FDE02200BD842D /* CSSCounterStyleRule.h in Headers */,
    3196131969                                2D8FEBDD143E3EF70072502B /* CSSCrossfadeValue.h in Headers */,
    3196231970                                AA21ECCD0ABF0FC6002B834C /* CSSCursorImageValue.h in Headers */,
     
    3211632124                                41A3D58F101C152D00316D07 /* DedicatedWorkerThread.h in Headers */,
    3211732125                                FD06DFA6134A4DEF006F5D7D /* DefaultAudioDestinationNode.h in Headers */,
     32126                                E4F38D1B2626F13B007B1064 /* DefaultResourceLoadPriority.h in Headers */,
    3211832127                                CD83D36221122A210076E11C /* DeferrableTask.h in Headers */,
    3211932128                                FD31602C12B0267600C1A359 /* DelayDSPKernel.h in Headers */,
     
    3461534624                                BCEA487A097D93020094C9E4 /* RenderLayer.h in Headers */,
    3461634625                                0F580CFF0F12DE9B0051D689 /* RenderLayerBacking.h in Headers */,
    34617                                 E4F38D1B2626F13B007B1064 /* DefaultResourceLoadPriority.h in Headers */,
    3461834626                                0F580CFD0F12DE9B0051D689 /* RenderLayerCompositor.h in Headers */,
    3461934627                                3C244FEAA375AC633F88BE6F /* RenderLayerModelObject.h in Headers */,
  • trunk/Source/WebCore/bindings/js/JSCSSRuleCustom.cpp

    r273138 r276152  
    2727#include "JSCSSRule.h"
    2828
     29#include "CSSCounterStyleRule.h"
    2930#include "CSSFontFaceRule.h"
    3031#include "CSSImportRule.h"
     
    3637#include "CSSStyleRule.h"
    3738#include "CSSSupportsRule.h"
     39#include "JSCSSCounterStyleRule.h"
    3840#include "JSCSSFontFaceRule.h"
    3941#include "JSCSSImportRule.h"
     
    8183    case CSSRule::SUPPORTS_RULE:
    8284        return createWrapper<CSSSupportsRule>(globalObject, WTFMove(rule));
     85    case CSSRule::COUNTER_STYLE_RULE:
     86        return createWrapper<CSSCounterStyleRule>(globalObject, WTFMove(rule));
    8387    default:
    8488        return createWrapper<CSSRule>(globalObject, WTFMove(rule));
  • trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h

    r274983 r276152  
    7676    macro(CredentialsContainer) \
    7777    macro(CSSAnimation) \
     78    macro(CSSCounterStyleRule) \
    7879    macro(CSSImageValue) \
    7980    macro(CSSNumericValue) \
  • trunk/Source/WebCore/css/CSSCounterStyleRule.idl

    r276149 r276152  
    11/*
    2  * Copyright (C) 2019 Apple Inc. All rights reserved.
     2 * Copyright (C) 2021 Tyler Wilcock <twilco.o@protonmail.com>.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #pragma once
    27 
    28 namespace WebCore {
    29 
    30 enum class StyleRuleType : uint8_t {
    31     Unknown, // Not used.
    32     Style,
    33     Charset, // Not used. These are internally strings owned by the style sheet.
    34     Import,
    35     Media,
    36     FontFace,
    37     Page,
    38     Keyframes,
    39     Keyframe, // Not used. These are internally non-rule StyleRuleKeyframe objects.
    40     Namespace = 10,
    41     Supports = 12,
     26// https://www.w3.org/TR/css-counter-styles-3/#the-csscounterstylerule-interface
     27[
     28    EnabledBySetting=CSSCounterStyleAtRules,
     29    Exposed=Window
     30] interface CSSCounterStyleRule : CSSRule {
     31   attribute DOMString name;
     32   attribute DOMString system;
     33   attribute DOMString symbols;
     34   attribute DOMString additiveSymbols;
     35   attribute DOMString negative;
     36   attribute DOMString prefix;
     37   attribute DOMString suffix;
     38   attribute DOMString range;
     39   attribute DOMString pad;
     40   attribute DOMString speakAs;
     41   attribute DOMString fallback;
    4242};
    43 
    44 } // namespace WebCore
  • trunk/Source/WebCore/css/CSSRule.cpp

    r256477 r276152  
    4747COMPILE_ASSERT(StyleRuleType::Keyframe == static_cast<StyleRuleType>(CSSRule::Type::KEYFRAME_RULE), enums_should_match);
    4848COMPILE_ASSERT(StyleRuleType::Namespace == static_cast<StyleRuleType>(CSSRule::Type::NAMESPACE_RULE), enums_should_match);
     49COMPILE_ASSERT(StyleRuleType::CounterStyle == static_cast<StyleRuleType>(CSSRule::Type::COUNTER_STYLE_RULE), enums_should_match);
    4950COMPILE_ASSERT(StyleRuleType::Supports == static_cast<StyleRuleType>(CSSRule::Type::SUPPORTS_RULE), enums_should_match);
    5051
  • trunk/Source/WebCore/css/CSSRule.h

    r267576 r276152  
    3737    virtual ~CSSRule() = default;
    3838
     39    // WebIDL enum
    3940    enum Type {
    4041        UNKNOWN_RULE,
     
    4950        MARGIN_RULE,
    5051        NAMESPACE_RULE,
    51         SUPPORTS_RULE = 12,
     52        COUNTER_STYLE_RULE,
     53        SUPPORTS_RULE
    5254    };
    5355
  • trunk/Source/WebCore/css/CSSRule.idl

    r267576 r276152  
    4343    const unsigned short MARGIN_RULE = 9;
    4444    const unsigned short NAMESPACE_RULE = 10;
     45    [EnabledBySetting=CSSCounterStyleAtRules] const unsigned short COUNTER_STYLE_RULE = 11;
    4546    const unsigned short SUPPORTS_RULE = 12;
    4647
  • trunk/Source/WebCore/css/StyleRule.cpp

    r267576 r276152  
    2323#include "StyleRule.h"
    2424
     25#include "CSSCounterStyleRule.h"
    2526#include "CSSDeferredParser.h"
    2627#include "CSSFontFaceRule.h"
     
    9192        delete downcast<StyleRuleCharset>(this);
    9293        return;
     94    case StyleRuleType::CounterStyle:
     95        delete downcast<StyleRuleCounterStyle>(this);
     96        return;
    9397    case StyleRuleType::Unknown:
    9498        ASSERT_NOT_REACHED();
     
    113117    case StyleRuleType::Keyframes:
    114118        return downcast<StyleRuleKeyframes>(*this).copy();
     119    case StyleRuleType::CounterStyle:
     120        return downcast<StyleRuleCounterStyle>(*this).copy();
    115121    case StyleRuleType::Import:
    116122    case StyleRuleType::Namespace:
     
    153159    case StyleRuleType::Namespace:
    154160        rule = CSSNamespaceRule::create(downcast<StyleRuleNamespace>(self), parentSheet);
     161        break;
     162    case StyleRuleType::CounterStyle:
     163        rule = CSSCounterStyleRule::create(downcast<StyleRuleCounterStyle>(self), parentSheet);
    155164        break;
    156165    case StyleRuleType::Unknown:
  • trunk/Source/WebCore/css/StyleRule.h

    r267576 r276152  
    4848   
    4949    bool isCharsetRule() const { return type() == StyleRuleType::Charset; }
     50    bool isCounterStyleRule() const { return type() == StyleRuleType::CounterStyle; }
    5051    bool isFontFaceRule() const { return type() == StyleRuleType::FontFace; }
    5152    bool isKeyframesRule() const { return type() == StyleRuleType::Keyframes; }
  • trunk/Source/WebCore/css/StyleRuleType.h

    r256477 r276152  
    3939    Keyframe, // Not used. These are internally non-rule StyleRuleKeyframe objects.
    4040    Namespace = 10,
     41    CounterStyle = 11,
    4142    Supports = 12,
    4243};
  • trunk/Source/WebCore/css/StyleSheetContents.cpp

    r273897 r276152  
    445445        case StyleRuleType::Unknown:
    446446        case StyleRuleType::Charset:
     447        case StyleRuleType::CounterStyle:
    447448        case StyleRuleType::Keyframe:
    448449        case StyleRuleType::Supports:
     
    479480                return handler(*cachedResource);
    480481            return false;
     482        case StyleRuleType::CounterStyle:
     483            return m_parserContext.counterStyleAtRuleImageSymbolsEnabled;
    481484        case StyleRuleType::Media:
    482485        case StyleRuleType::Page:
  • trunk/Source/WebCore/css/parser/CSSAtRuleID.cpp

    r222259 r276152  
    5757    if (equalIgnoringASCIICase(name, "apply"))
    5858        return CSSAtRuleApply;
     59    if (equalIgnoringASCIICase(name, "counter-style"))
     60        return CSSAtRuleCounterStyle;
    5961    return CSSAtRuleInvalid;
    6062}
  • trunk/Source/WebCore/css/parser/CSSAtRuleID.h

    r222259 r276152  
    4848    CSSAtRuleWebkitKeyframes = 10,
    4949    CSSAtRuleApply = 11,
     50    CSSAtRuleCounterStyle = 12,
    5051};
    5152
  • trunk/Source/WebCore/css/parser/CSSParserContext.cpp

    r275650 r276152  
    7474    , constantPropertiesEnabled { document.settings().constantPropertiesEnabled() }
    7575    , containmentEnabled { document.settings().cssContainmentEnabled() }
     76    , counterStyleAtRulesEnabled { document.settings().cssCounterStyleAtRulesEnabled() }
     77    , counterStyleAtRuleImageSymbolsEnabled { document.settings().cssCounterStyleAtRuleImageSymbolsEnabled() }
    7678    , cssColor4 { document.settings().cssColor4() }
    7779    , deferredCSSParserEnabled { document.settings().deferredCSSParserEnabled() }
     
    114116        && a.constantPropertiesEnabled == b.constantPropertiesEnabled
    115117        && a.containmentEnabled == b.containmentEnabled
     118        && a.counterStyleAtRulesEnabled == b.counterStyleAtRulesEnabled
     119        && a.counterStyleAtRuleImageSymbolsEnabled == b.counterStyleAtRuleImageSymbolsEnabled
    116120        && a.cssColor4 == b.cssColor4
    117121        && a.deferredCSSParserEnabled == b.deferredCSSParserEnabled
  • trunk/Source/WebCore/css/parser/CSSParserContext.h

    r275650 r276152  
    6161    bool constantPropertiesEnabled { false };
    6262    bool containmentEnabled { false };
     63    bool counterStyleAtRulesEnabled { false };
     64    bool counterStyleAtRuleImageSymbolsEnabled { false };
    6365    bool cssColor4 { false };
    6466    bool deferredCSSParserEnabled { false };
  • trunk/Source/WebCore/css/parser/CSSParserFastPaths.cpp

    r272987 r276152  
    3636#include "CSSPrimitiveValue.h"
    3737#include "CSSPropertyParser.h"
     38#include "CSSPropertyParserHelpers.h"
    3839#include "CSSValueList.h"
    3940#include "CSSValuePool.h"
     
    662663        // See section CSS_PROP_LIST_STYLE_TYPE of file CSSValueKeywords.in
    663664        // for the list of supported list-style-types.
    664         return (valueID >= CSSValueDisc && valueID <= CSSValueKatakanaIroha) || valueID == CSSValueNone;
     665        return CSSPropertyParserHelpers::isPredefinedCounterStyle(valueID) || valueID == CSSValueNone;
    665666    case CSSPropertyMaskType:
    666667        return valueID == CSSValueLuminance || valueID == CSSValueAlpha;
  • trunk/Source/WebCore/css/parser/CSSParserImpl.cpp

    r275610 r276152  
    3232
    3333#include "CSSAtRuleID.h"
     34#include "CSSCounterStyleRule.h"
    3435#include "CSSCustomPropertyValue.h"
    3536#include "CSSDeferredParser.h"
     
    338339static CSSParserImpl::AllowedRulesType computeNewAllowedRules(CSSParserImpl::AllowedRulesType allowedRules, StyleRuleBase* rule)
    339340{
    340     if (!rule || allowedRules == CSSParserImpl::KeyframeRules || allowedRules == CSSParserImpl::NoRules)
     341    if (!rule || allowedRules == CSSParserImpl::KeyframeRules || allowedRules == CSSParserImpl::CounterStyleRules || allowedRules == CSSParserImpl::NoRules)
    341342        return allowedRules;
    342343    ASSERT(allowedRules <= CSSParserImpl::RegularRules);
     
    449450    case CSSAtRulePage:
    450451        return consumePageRule(prelude, block);
     452    case CSSAtRuleCounterStyle:
     453        return consumeCounterStyleRule(prelude, block);
    451454    default:
    452455        return nullptr; // Parse error, unrecognised at-rule with block
     
    651654   
    652655    return StyleRulePage::create(createStyleProperties(m_parsedProperties, m_context.mode), WTFMove(selectorList));
     656}
     657
     658RefPtr<StyleRuleCounterStyle> CSSParserImpl::consumeCounterStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
     659{
     660    if (!m_context.counterStyleAtRulesEnabled)
     661        return nullptr;
     662
     663    auto rangeCopy = prelude; // For inspector callbacks
     664    auto name = CSSPropertyParserHelpers::consumeCounterStyleNameInPrelude(rangeCopy);
     665    if (name.isNull())
     666        return nullptr;
     667
     668    if (m_observerWrapper) {
     669        m_observerWrapper->observer().startRuleHeader(StyleRuleType::CounterStyle, m_observerWrapper->startOffset(rangeCopy));
     670        m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset(prelude));
     671        m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(block));
     672        m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(block));
     673    }
     674
     675    consumeDeclarationList(block, StyleRuleType::CounterStyle);
     676    return StyleRuleCounterStyle::create(name, createStyleProperties(m_parsedProperties, m_context.mode));
    653677}
    654678
     
    729753    ASSERT(m_parsedProperties.isEmpty());
    730754
    731     bool useObserver = m_observerWrapper && (ruleType == StyleRuleType::Style || ruleType == StyleRuleType::Keyframe);
     755    bool useObserver = m_observerWrapper && (ruleType == StyleRuleType::Style || ruleType == StyleRuleType::Keyframe || ruleType == StyleRuleType::CounterStyle);
    732756    if (useObserver) {
    733757        m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(range));
     
    811835    }
    812836
    813     if (important && (ruleType == StyleRuleType::FontFace || ruleType == StyleRuleType::Keyframe))
     837    if (important && (ruleType == StyleRuleType::FontFace || ruleType == StyleRuleType::Keyframe || ruleType == StyleRuleType::CounterStyle))
    814838        return;
    815839
  • trunk/Source/WebCore/css/parser/CSSParserImpl.h

    r274520 r276152  
    4646class CSSSelectorList;
    4747class CSSTokenizer;
     48class StyleRuleCounterStyle;
    4849class StyleRuleKeyframe;
    4950class StyleRule;
     
    8081        KeyframeRules,
    8182        ApplyRules, // For @apply inside style rules
     83        CounterStyleRules,
    8284        NoRules, // For parsing at-rules inside declaration lists
    8385    };
     
    133135    RefPtr<StyleRuleKeyframes> consumeKeyframesRule(bool webkitPrefixed, CSSParserTokenRange prelude, CSSParserTokenRange block);
    134136    RefPtr<StyleRulePage> consumePageRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
     137    RefPtr<StyleRuleCounterStyle> consumeCounterStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
    135138   
    136139    // FIXME-NEWPARSER: Support "apply"
  • trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp

    r276017 r276152  
    235235    if (ruleType == StyleRuleType::FontFace)
    236236        parseSuccess = parser.parseFontFaceDescriptor(propertyID);
     237    else if (ruleType == StyleRuleType::CounterStyle)
     238        parseSuccess = parser.parseCounterStyleDescriptor(propertyID, context);
    237239    else
    238240        parseSuccess = parser.parseValueStart(propertyID, important);
     
    22432245    if (consumeCommaIncludingWhitespace(args)) {
    22442246        CSSValueID id = args.peek().id();
    2245         if ((id != CSSValueNone && (id < CSSValueDisc || id > CSSValueKatakanaIroha)))
     2247        if ((id != CSSValueNone && !isPredefinedCounterStyle(id)))
    22462248            return nullptr;
    22472249        listStyle = consumeIdent(args);
     
    44354437}
    44364438
     4439RefPtr<CSSValue> CSSPropertyParser::parseCounterStyleDescriptor(CSSPropertyID propId, CSSParserTokenRange& range, const CSSParserContext& context)
     4440{
     4441    if (!context.counterStyleAtRulesEnabled)
     4442        return nullptr;
     4443    // FIXME: Implement this function when we can parse @counter-style descriptors.
     4444    UNUSED_PARAM(propId);
     4445    UNUSED_PARAM(range);
     4446    UNUSED_PARAM(context);
     4447    return nullptr;
     4448}
     4449
     4450bool CSSPropertyParser::parseCounterStyleDescriptor(CSSPropertyID propId, const CSSParserContext& context)
     4451{
     4452    auto parsedValue = parseCounterStyleDescriptor(propId, m_range, context);
     4453    if (!parsedValue || !m_range.atEnd())
     4454        return false;
     4455
     4456    addProperty(propId, CSSPropertyInvalid, *parsedValue, false);
     4457    return true;
     4458}
     4459
    44374460bool CSSPropertyParser::parseFontFaceDescriptor(CSSPropertyID propId)
    44384461{
  • trunk/Source/WebCore/css/parser/CSSPropertyParser.h

    r276017 r276152  
    5757    static void collectParsedCustomPropertyValueDependencies(const String& syntax, bool isRoot, HashSet<CSSPropertyID>& dependencies, const CSSParserTokenRange&, const CSSParserContext&);
    5858
     59    static RefPtr<CSSValue> parseCounterStyleDescriptor(CSSPropertyID, CSSParserTokenRange&, const CSSParserContext&);
     60
    5961private:
    6062    CSSPropertyParser(const CSSParserTokenRange&, const CSSParserContext&, Vector<CSSProperty, 256>*, bool consumeWhitespace = true);
     
    7274    bool parseViewportDescriptor(CSSPropertyID propId, bool important);
    7375    bool parseFontFaceDescriptor(CSSPropertyID);
     76    bool parseCounterStyleDescriptor(CSSPropertyID, const CSSParserContext&);
    7477
    7578    void addProperty(CSSPropertyID, CSSPropertyID, Ref<CSSValue>&&, bool important, bool implicit = false);
  • trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp

    r276017 r276152  
    671671// to do other plumbing work first (like changing Pair to CSSValuePair and make it not
    672672// use only primitive values).
    673 RefPtr<CSSPrimitiveValue> consumeCustomIdent(CSSParserTokenRange& range)
     673RefPtr<CSSPrimitiveValue> consumeCustomIdent(CSSParserTokenRange& range, bool shouldLowercase)
    674674{
    675675    if (range.peek().type() != IdentToken || isCSSWideKeyword(range.peek().id()))
    676676        return nullptr;
    677     return CSSValuePool::singleton().createValue(range.consumeIncludingWhitespace().value().toString(), CSSUnitType::CSS_STRING);
     677    auto identifier = range.consumeIncludingWhitespace().value();
     678    return CSSValuePool::singleton().createValue(shouldLowercase ? identifier.convertToASCIILowercase() : identifier.toString(), CSSUnitType::CSS_STRING);
    678679}
    679680
     
    29312932}
    29322933
     2934// https://www.w3.org/TR/css-counter-styles-3/#predefined-counters
     2935bool isPredefinedCounterStyle(CSSValueID valueID)
     2936{
     2937    return valueID >= CSSValueDisc && valueID <= CSSValueKatakanaIroha;
     2938}
     2939
     2940// https://www.w3.org/TR/css-counter-styles-3/#typedef-counter-style-name
     2941RefPtr<CSSPrimitiveValue> consumeCounterStyleName(CSSParserTokenRange& range)
     2942{
     2943    // <counter-style-name> is a <custom-ident> that is not an ASCII case-insensitive match for "none".
     2944    auto valueID = range.peek().id();
     2945    if (valueID == CSSValueNone)
     2946        return nullptr;
     2947    // If the value is an ASCII case-insensitive match for any of the predefined counter styles, lowercase it.
     2948    if (auto name = consumeCustomIdent(range, isPredefinedCounterStyle(valueID)))
     2949        return name;
     2950    return nullptr;
     2951}
     2952
     2953// https://www.w3.org/TR/css-counter-styles-3/#typedef-counter-style-name
     2954AtomString consumeCounterStyleNameInPrelude(CSSParserTokenRange& prelude)
     2955{
     2956    auto nameToken = prelude.consumeIncludingWhitespace();
     2957    if (!prelude.atEnd())
     2958        return AtomString();
     2959    // Ensure this token is a valid <custom-ident>.
     2960    if (nameToken.type() != IdentToken || isCSSWideKeyword(nameToken.id()))
     2961        return AtomString();
     2962    // In the context of the prelude of an @counter-style rule, a <counter-style-name> must not be an ASCII
     2963    // case-insensitive match for "decimal" or "disc". No <counter-style-name>, prelude or not, may be an ASCII
     2964    // case-insensitive match for "none".
     2965    if (identMatches<CSSValueDecimal, CSSValueDisc, CSSValueNone>(nameToken.id()))
     2966        return AtomString();
     2967    auto name = nameToken.value();
     2968    return isPredefinedCounterStyle(nameToken.id()) ? name.convertToASCIILowercase() : name.toString();
     2969}
     2970
    29332971Optional<CSSValueID> consumeFontVariantCSS21Raw(CSSParserTokenRange& range)
    29342972{
  • trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.h

    r276017 r276152  
    107107template<CSSValueID... allowedIdents> RefPtr<CSSPrimitiveValue> consumeIdentWorkerSafe(CSSParserTokenRange&, CSSValuePool&);
    108108
    109 RefPtr<CSSPrimitiveValue> consumeCustomIdent(CSSParserTokenRange&);
     109RefPtr<CSSPrimitiveValue> consumeCustomIdent(CSSParserTokenRange&, bool shouldLowercase = false);
    110110RefPtr<CSSPrimitiveValue> consumeString(CSSParserTokenRange&);
    111111StringView consumeUrlAsStringView(CSSParserTokenRange&);
     
    165165    Vector<FontFamilyRaw> family;
    166166};
     167
     168bool isPredefinedCounterStyle(CSSValueID);
     169RefPtr<CSSPrimitiveValue> consumeCounterStyleName(CSSParserTokenRange&);
     170AtomString consumeCounterStyleNameInPrelude(CSSParserTokenRange&);
    167171
    168172Optional<CSSValueID> consumeFontVariantCSS21Raw(CSSParserTokenRange&);
  • trunk/Tools/ChangeLog

    r276148 r276152  
     12021-04-16  Tyler Wilcock  <twilco.o@protonmail.com>
     2
     3        [css-counter-styles] Parse and add feature flag for @counter-style
     4        https://bugs.webkit.org/show_bug.cgi?id=223150
     5
     6        Reviewed by Darin Adler.
     7
     8        * DumpRenderTree/TestOptions.cpp:
     9        (WTR::TestOptions::defaults):
     10        Add `false` defaults for CSSCounterStyleAtRulesEnabled and
     11        CSSCounterStyleAtRuleImageSymbolsEnabled flags.
     12
    1132021-04-16  Chris Dumez  <cdumez@apple.com>
    214
  • trunk/Tools/DumpRenderTree/TestOptions.cpp

    r275912 r276152  
    134134            { "AttachmentElementEnabled", false },
    135135            { "CSSContainmentEnabled", false },
     136            { "CSSCounterStyleAtRuleEnabled", false },
     137            { "CSSCounterStyleAtRuleImageSymbolsEnabled", false },
    136138            { "CSSLogicalEnabled", false },
    137139            { "CSSOMViewSmoothScrollingEnabled", false },
Note: See TracChangeset for help on using the changeset viewer.