Changeset 281928 in webkit


Ignore:
Timestamp:
Sep 2, 2021 9:33:06 AM (11 months ago)
Author:
Antti Koivisto
Message:

[CSS Cascade Layers] Support layer argument in @import rules
https://bugs.webkit.org/show_bug.cgi?id=229795

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

  • web-platform-tests/css/css-cascade/layer-import-expected.txt:

Source/WebCore:

Add support for

@import "style.css" layer;
@import "style.css" layer(foo);

  • css/StyleRuleImport.cpp:

(WebCore::StyleRuleImport::create):
(WebCore::StyleRuleImport::StyleRuleImport):

Add layer name member.

  • css/StyleRuleImport.h:
  • css/parser/CSSParserImpl.cpp:

(WebCore::consumeCascadeLayerName):

Factor into a standalone function.

(WebCore::CSSParserImpl::consumeImportRule):

Parse layer and layer() arguments for @import.

(WebCore::CSSParserImpl::consumeLayerRule):

  • style/RuleSet.cpp:

(WebCore::Style::RuleSet::Builder::addRulesFromSheet):

Register the layers specified in import rules.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r281926 r281928  
     12021-09-02  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Cascade Layers] Support layer argument in @import rules
     4        https://bugs.webkit.org/show_bug.cgi?id=229795
     5
     6        Reviewed by Simon Fraser.
     7
     8        * web-platform-tests/css/css-cascade/layer-import-expected.txt:
     9
    1102021-09-02  Youenn Fablet  <youenn@apple.com>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import-expected.txt

    r281917 r281928  
    44PASS A3 Layer rules with import
    55PASS A4 Layer rules with import
    6 FAIL B1 Anonymous imports assert_equals: B1 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    7 FAIL B2 Anonymous imports assert_equals: B2 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
     6PASS B1 Anonymous imports
     7PASS B2 Anonymous imports
    88PASS B3 Anonymous imports
    9 FAIL B4 Anonymous imports assert_equals: B4 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    10 FAIL C1 Named imports assert_equals: C1 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    11 FAIL C2 Named imports assert_equals: C2 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
     9PASS B4 Anonymous imports
     10PASS C1 Named imports
     11PASS C2 Named imports
    1212PASS C3 Named imports
    13 FAIL C4 Named imports assert_equals: C4 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
     13PASS C4 Named imports
    1414PASS C5 Named imports
    1515PASS C6 Named imports
    16 FAIL C7 Named imports assert_equals: C7 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    17 FAIL C8 Named imports assert_equals: C8 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    18 FAIL C9 Named imports assert_equals: C9 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    19 FAIL D1 Layer statement with imports assert_equals: D1 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
     16PASS C7 Named imports
     17PASS C8 Named imports
     18PASS C9 Named imports
     19PASS D1 Layer statement with imports
    2020FAIL D2 Layer statement with imports assert_equals: D2 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    2121FAIL D3 Layer statement with imports assert_equals: D3 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    2222FAIL D4 Layer statement with imports assert_equals: D4 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    2323FAIL D5 Layer statement with imports assert_equals: D5 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
    24 FAIL D6 Layer statement with imports assert_equals: D6 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
     24PASS D6 Layer statement with imports
    2525
  • trunk/Source/WebCore/ChangeLog

    r281926 r281928  
     12021-09-02  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Cascade Layers] Support layer argument in @import rules
     4        https://bugs.webkit.org/show_bug.cgi?id=229795
     5
     6        Reviewed by Simon Fraser.
     7
     8        Add support for
     9
     10        @import "style.css" layer;
     11        @import "style.css" layer(foo);
     12
     13        * css/StyleRuleImport.cpp:
     14        (WebCore::StyleRuleImport::create):
     15        (WebCore::StyleRuleImport::StyleRuleImport):
     16
     17        Add layer name member.
     18
     19        * css/StyleRuleImport.h:
     20        * css/parser/CSSParserImpl.cpp:
     21        (WebCore::consumeCascadeLayerName):
     22
     23        Factor into a standalone function.
     24
     25        (WebCore::CSSParserImpl::consumeImportRule):
     26
     27        Parse layer and layer() arguments for @import.
     28
     29        (WebCore::CSSParserImpl::consumeLayerRule):
     30        * style/RuleSet.cpp:
     31        (WebCore::Style::RuleSet::Builder::addRulesFromSheet):
     32
     33        Register the layers specified in import rules.
     34
    1352021-09-02  Youenn Fablet  <youenn@apple.com>
    236
  • trunk/Source/WebCore/css/StyleRuleImport.cpp

    r278185 r281928  
    3737namespace WebCore {
    3838
    39 Ref<StyleRuleImport> StyleRuleImport::create(const String& href, Ref<MediaQuerySet>&& media)
     39Ref<StyleRuleImport> StyleRuleImport::create(const String& href, Ref<MediaQuerySet>&& media, std::optional<CascadeLayerName>&& cascadeLayerName)
    4040{
    41     return adoptRef(*new StyleRuleImport(href, WTFMove(media)));
     41    return adoptRef(*new StyleRuleImport(href, WTFMove(media), WTFMove(cascadeLayerName)));
    4242}
    4343
    44 StyleRuleImport::StyleRuleImport(const String& href, Ref<MediaQuerySet>&& media)
     44StyleRuleImport::StyleRuleImport(const String& href, Ref<MediaQuerySet>&& media, std::optional<CascadeLayerName>&& cascadeLayerName)
    4545    : StyleRuleBase(StyleRuleType::Import)
    4646    , m_styleSheetClient(this)
    4747    , m_strHref(href)
    4848    , m_mediaQueries(WTFMove(media))
     49    , m_cascadeLayerName(WTFMove(cascadeLayerName))
    4950{
    5051    if (!m_mediaQueries)
  • trunk/Source/WebCore/css/StyleRuleImport.h

    r251655 r281928  
    3636    WTF_MAKE_FAST_ALLOCATED;
    3737public:
    38     static Ref<StyleRuleImport> create(const String& href, Ref<MediaQuerySet>&&);
     38    static Ref<StyleRuleImport> create(const String& href, Ref<MediaQuerySet>&&, std::optional<CascadeLayerName>&&);
    3939
    4040    ~StyleRuleImport();
     
    5353    const CachedCSSStyleSheet* cachedCSSStyleSheet() const { return m_cachedSheet.get(); }
    5454
     55    const std::optional<CascadeLayerName>& cascadeLayerName() const { return m_cascadeLayerName; }
     56
    5557private:
    5658    // NOTE: We put the CachedStyleSheetClient in a member instead of inheriting from it
    5759    // to avoid adding a vptr to StyleRuleImport.
    58 class ImportedStyleSheetClient final : public CachedStyleSheetClient {
     60    class ImportedStyleSheetClient final : public CachedStyleSheetClient {
    5961    public:
    6062        ImportedStyleSheetClient(StyleRuleImport* ownerRule) : m_ownerRule(ownerRule) { }
     
    7173    friend class ImportedStyleSheetClient;
    7274
    73     StyleRuleImport(const String& href, Ref<MediaQuerySet>&&);
     75    StyleRuleImport(const String& href, Ref<MediaQuerySet>&&, std::optional<CascadeLayerName>&&);
    7476
    7577    StyleSheetContents* m_parentStyleSheet { nullptr };
     
    7981    RefPtr<MediaQuerySet> m_mediaQueries;
    8082    RefPtr<StyleSheetContents> m_styleSheet;
     83    std::optional<CascadeLayerName> m_cascadeLayerName;
    8184    CachedResourceHandle<CachedCSSStyleSheet> m_cachedSheet;
    8285    bool m_loading { false };
  • trunk/Source/WebCore/css/parser/CSSParserImpl.cpp

    r281701 r281928  
    508508}
    509509
     510enum class AllowAnonymous { Yes, No };
     511static std::optional<CascadeLayerName> consumeCascadeLayerName(CSSParserTokenRange& range, AllowAnonymous allowAnonymous)
     512{
     513    CascadeLayerName name;
     514    if (range.atEnd()) {
     515        if (allowAnonymous == AllowAnonymous::Yes)
     516            return name;
     517        return { };
     518    }
     519
     520    while (true) {
     521        auto nameToken = range.consume();
     522        if (nameToken.type() != IdentToken)
     523            return { };
     524
     525        name.append(nameToken.value().toAtomString());
     526
     527        if (range.peek().type() != DelimiterToken || range.peek().delimiter() != '.')
     528            break;
     529        range.consume();
     530    }
     531
     532    range.consumeWhitespace();
     533    return name;
     534}
     535
    510536RefPtr<StyleRuleImport> CSSParserImpl::consumeImportRule(CSSParserTokenRange prelude)
    511537{
     
    521547        m_observerWrapper->observer().endRuleBody(endOffset);
    522548    }
     549
     550    prelude.consumeWhitespace();
     551
     552    auto consumeCascadeLayer = [&]() -> std::optional<CascadeLayerName> {
     553        if (!m_context.cascadeLayersEnabled)
     554            return { };
     555       
     556        auto& token = prelude.peek();
     557        if (token.type() == FunctionToken && equalIgnoringASCIICase(token.value(), "layer")) {
     558            auto contents = CSSPropertyParserHelpers::consumeFunction(prelude);
     559            return consumeCascadeLayerName(contents, AllowAnonymous::No);
     560        }
     561        if (token.type() == IdentToken && equalIgnoringASCIICase(token.value(), "layer")) {
     562            prelude.consumeIncludingWhitespace();
     563            return CascadeLayerName { };
     564        }
     565        return { };
     566    };
     567
     568    auto cascadeLayerName = consumeCascadeLayer();
     569    auto mediaQuerySet = MediaQueryParser::parseMediaQuerySet(prelude, MediaQueryParserContext(m_context));
    523570   
    524     return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(prelude, MediaQueryParserContext(m_context)).releaseNonNull());
     571    return StyleRuleImport::create(uri, mediaQuerySet.releaseNonNull(), WTFMove(cascadeLayerName));
    525572}
    526573
     
    688735    auto preludeCopy = prelude;
    689736
    690     auto consumeName = [&]() -> std::optional<CascadeLayerName> {
    691         CascadeLayerName name;
    692         // Anonymous case.
    693         if (prelude.atEnd())
    694             return name;
    695 
    696         while (true) {
    697             auto nameToken = prelude.consume();
    698             if (nameToken.type() != IdentToken)
    699                 return { };
    700 
    701             name.append(nameToken.value().toAtomString());
    702 
    703             if (prelude.peek().type() != DelimiterToken || prelude.peek().delimiter() != '.')
    704                 break;
    705             prelude.consume();
    706         }
    707 
    708         prelude.consumeWhitespace();
    709         return name;
    710     };
    711 
    712737    if (!block) {
    713738        // List syntax.
    714739        Vector<CascadeLayerName> nameList;
    715740        while (true) {
    716             auto name = consumeName();
     741            auto name = consumeCascadeLayerName(prelude, AllowAnonymous::No);
    717742            if (!name)
    718743                return nullptr;
     
    738763    }
    739764
    740     auto name = consumeName();
     765    auto name = consumeCascadeLayerName(prelude, AllowAnonymous::Yes);
    741766    if (!name)
    742767        return nullptr;
  • trunk/Source/WebCore/style/RuleSet.cpp

    r281798 r281928  
    377377        if (!rule->styleSheet())
    378378            continue;
    379 
    380         if (mediaQueryCollector.pushAndEvaluate(rule->mediaQueries()))
     379       
     380        if (mediaQueryCollector.pushAndEvaluate(rule->mediaQueries())) {
     381            auto& cascadeLayerName = rule->cascadeLayerName();
     382            if (cascadeLayerName)
     383                pushCascadeLayer(*cascadeLayerName);
     384
    381385            addRulesFromSheet(*rule->styleSheet());
     386
     387            if (cascadeLayerName)
     388                popCascadeLayer(*cascadeLayerName);
     389        }
    382390        mediaQueryCollector.pop(rule->mediaQueries());
    383391    }
Note: See TracChangeset for help on using the changeset viewer.