haikuwebkit/LayoutTests/webexposed/counter-style-image-symbols...

17 lines
734 B
HTML
Raw Permalink Normal View History

[css-counter-styles] Parse @counter-style descriptors https://bugs.webkit.org/show_bug.cgi?id=224718 Patch by Tyler Wilcock <twilco.o@protonmail.com> on 2021-04-22 Reviewed by Darin Adler. LayoutTests/imported/w3c: Parsing for all @counter-style descriptors is implemented with this patch, so mark more tests passing. You'll notice that some @counter-style descriptors implemented in this patch did not gain any passing tests (e.g. `pad`, `negative`). In all of these cases, the expected results contain a <string> value, and we fail only because we incorrectly don't serialize these <string> values with quotes. I have manually confirmed in all cases that these values are properly parsed, so it's just the serialization that's incorrect. These <string> values serialize without quotes because WebKit's representation of custom identifiers is not a separate type, but instead overloaded onto the CSS_STRING type. This means that during serialization time, WebKit must guess whether it is actually serializing a string (and include quotes if so), or if it's serializing a custom ident (leaving off quotes if so). Relevant code snippet: https://github.com/WebKit/WebKit/blob/36caeec07975bd5f47db8ac6b749c2787230a461/Source/WebCore/css/CSSMarkup.cpp#L153#L161 Relevant changelog snippet from David Hyatt, 2016-12-07: > We also overload CSS_STRING primitive value type and have it act as both a string > and a custom identifier. This is lame, since the parser should have made two different > types of objects instead, but since our parser doesn't do that yet, I added a serializeAsStringOrCustomIdent > that preserves our old behavior of "quote the string only if needed." In this case what > that really meant was "Try to guess that we were originally a custom ident and leave off > quotes if so." This function will go away once we properly create CSSStringValues and > CSSCustomIdentValues instead of turning the latter into strings. * web-platform-tests/css/css-counter-styles/counter-style-fallback-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-system-syntax-expected.txt: Source/WebCore: Implement parsing and CSSCounterStyleRule IDL interface for @counter-style descriptors. See spec for full details on all descriptors: https://drafts.csswg.org/css-counter-styles-3/#the-counter-style-rule Test: webexposed/counter-style-image-symbols-not-exposed.html and WPTs * css/CSSComputedStyleDeclaration.cpp: (WebCore::ComputedStyleExtractor::valueForPropertyInStyle): Return `nullptr` for new @counter-style descriptor properties. * css/CSSCounterStyleRule.cpp: (WebCore::toCounterStyleSystemEnum): (WebCore::symbolsValidForSystem): (WebCore::StyleRuleCounterStyle::newValueInvalidOrEqual const): (WebCore::CSSCounterStyleRule::cssText const): (WebCore::CSSCounterStyleRule::setName): (WebCore::CSSCounterStyleRule::setterInternal): (WebCore::CSSCounterStyleRule::setSystem): (WebCore::CSSCounterStyleRule::setNegative): (WebCore::CSSCounterStyleRule::setPrefix): (WebCore::CSSCounterStyleRule::setSuffix): (WebCore::CSSCounterStyleRule::setRange): (WebCore::CSSCounterStyleRule::setPad): (WebCore::CSSCounterStyleRule::setFallback): (WebCore::CSSCounterStyleRule::setSymbols): (WebCore::CSSCounterStyleRule::setAdditiveSymbols): (WebCore::CSSCounterStyleRule::setSpeakAs): Implement setters and tangential functionality required by setters. * css/CSSCounterStyleRule.h: Replace FIXME with actual descriptor getter and setter implementations. * css/CSSProperties.json: Add @counter-style descriptor properties. * css/CSSValueKeywords.in: Add new values required for `system` and `speak-as` @counter-style descriptor properties. * css/parser/CSSParserContext.cpp: (WebCore::CSSParserContext::isPropertyRuntimeDisabled const): Ensure new @counter-style descriptors are disabled at runtime based on CSSParserContext state. * css/parser/CSSPropertyParser.cpp: (WebCore::consumeCounterStyleSystem): (WebCore::consumeCounterStyleSymbol): (WebCore::consumeCounterStyleNegative): (WebCore::consumeCounterStyleRangeBound): (WebCore::consumeCounterStyleRange): (WebCore::consumeCounterStylePad): (WebCore::consumeCounterStyleSymbols): (WebCore::consumeCounterStyleAdditiveSymbols): (WebCore::consumeCounterStyleSpeakAs): (WebCore::CSSPropertyParser::parseCounterStyleDescriptor): Parse @counter-style descriptors. Tools: * DumpRenderTree/TestOptions.cpp: (WTR::TestOptions::defaults): Fix typo (missing 's'). CSSCounterStyleAtRulesEnabled, not CSSCounterStyleAtRuleEnabled. LayoutTests: Add test ensuring <image> @counter-style symbol values cannot be parsed when the `counterStyleAtRuleImageSymbolsEnabled` feature flag is disabled. --- This test is skipped on Windows because I haven't been able to get the required feature flags (CSSCounterStyleAtRulesEnabled and CSSCounterStyleAtRuleImageSymbolsEnabled) to work properly for that port. The code hidden behind these flags is all in the CSS parser, which is not unique to Windows, so I think we can be confident that if the test passes on all other platforms, that the behavior is correct on Windows too. One attempt at implementing the necessary Windows-specific flag functionality is here: https://bugs.webkit.org/attachment.cgi?id=426371&action=edit Which failed to compile[1] with this error: > C:\cygwin\home\buildbot\worker\Windows-EWS\build\Tools\DumpRenderTree\win\DumpRenderTree.cpp(834,51): error C2039: 'setCSSCounterStyleAtRulesEnabled': is not a member of 'IWebPreferencesPrivate7' [C:\cygwin\home\buildbot\worker\Windows-EWS\build\WebKitBuild\Release\Tools\DumpRenderTree\DumpRenderTreeLib.vcxproj] > C:\cygwin\home\buildbot\worker\Windows-EWS\build\Tools\DumpRenderTree\win\DumpRenderTree.cpp(835,62): error C2039: 'setCSSCounterStyleAtRuleImageSymbolsEnabled': is not a member of 'IWebPreferencesPrivate7' [C:\cygwin\home\buildbot\worker\Windows-EWS\build\WebKitBuild\Release\Tools\DumpRenderTree\DumpRenderTreeLib.vcxproj] Those methods are present in `IWebPreferencesPrivate7.idl`, and implemented similarly to other flags in other places (e.g. win/WebPreferences.{h, cpp}, win/WebPreferenceKeysPrivate.h). I can't reproduce this compilation error on my Windows machine. I then tried removing the lines that caused the above compilation failure. Those setters are called in DumpRenderTree::enableExperimentalFeatures, so in lieu of enabling these flags there I could enable the flag I need via test header. That patch is: https://bugs.webkit.org/attachment.cgi?id=426509&action=edit This results in successful compilation, but causes lots (all?) of the layout tests to fail[2] with a stacktrace that looks like: Canonical link: https://commits.webkit.org/236947@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@276488 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2021-04-23 05:25:40 +00:00
<!DOCTYPE html> <!-- webkit-test-runner [ CSSCounterStyleAtRuleImageSymbolsEnabled=false ] -->
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<style>
@counter-style foo {
system: cyclic;
suffix: " ";
symbols: linear-gradient(yellow, blue);
}
</style>
<script>
test(function() {
const cssRules = document.styleSheets[0].cssRules
assert_equals(cssRules.length, 1, 'Should\'ve been able to parse @counter-style.')
assert_equals(cssRules[0].symbols, '', 'Shouldn\'t have been able to parse image symbol value with the runtime feature flag disabled.')
}, '@counter-style image symbols are not exposed')
</script>