Title: [281928] trunk
Revision
281928
Author
an...@apple.com
Date
2021-09-02 09:33:06 -0700 (Thu, 02 Sep 2021)

Log 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.

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (281927 => 281928)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-09-02 16:33:06 UTC (rev 281928)
@@ -1,3 +1,12 @@
+2021-09-02  Antti Koivisto  <an...@apple.com>
+
+        [CSS Cascade Layers] Support layer argument in @import rules
+        https://bugs.webkit.org/show_bug.cgi?id=229795
+
+        Reviewed by Simon Fraser.
+
+        * web-platform-tests/css/css-cascade/layer-import-expected.txt:
+
 2021-09-02  Youenn Fablet  <you...@apple.com>
 
         Migrate LibWebRTCMediaEndpoint from OnRenegotiationNeeded to OnRenegotiationNeededEvent

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import-expected.txt (281927 => 281928)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import-expected.txt	2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import-expected.txt	2021-09-02 16:33:06 UTC (rev 281928)
@@ -3,23 +3,23 @@
 PASS A2 Layer rules with import
 PASS A3 Layer rules with import
 PASS A4 Layer rules with import
-FAIL B1 Anonymous imports assert_equals: B1 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL B2 Anonymous imports assert_equals: B2 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS B1 Anonymous imports
+PASS B2 Anonymous imports
 PASS B3 Anonymous imports
-FAIL B4 Anonymous imports assert_equals: B4 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C1 Named imports assert_equals: C1 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C2 Named imports assert_equals: C2 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS B4 Anonymous imports
+PASS C1 Named imports
+PASS C2 Named imports
 PASS C3 Named imports
-FAIL C4 Named imports assert_equals: C4 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS C4 Named imports
 PASS C5 Named imports
 PASS C6 Named imports
-FAIL C7 Named imports assert_equals: C7 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C8 Named imports assert_equals: C8 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C9 Named imports assert_equals: C9 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-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)"
+PASS C7 Named imports
+PASS C8 Named imports
+PASS C9 Named imports
+PASS D1 Layer statement with imports
 FAIL 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)"
 FAIL 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)"
 FAIL 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)"
 FAIL 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)"
-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)"
+PASS D6 Layer statement with imports
 

Modified: trunk/Source/WebCore/ChangeLog (281927 => 281928)


--- trunk/Source/WebCore/ChangeLog	2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/ChangeLog	2021-09-02 16:33:06 UTC (rev 281928)
@@ -1,3 +1,37 @@
+2021-09-02  Antti Koivisto  <an...@apple.com>
+
+        [CSS Cascade Layers] Support layer argument in @import rules
+        https://bugs.webkit.org/show_bug.cgi?id=229795
+
+        Reviewed by Simon Fraser.
+
+        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.
+
 2021-09-02  Youenn Fablet  <you...@apple.com>
 
         Migrate LibWebRTCMediaEndpoint from OnRenegotiationNeeded to OnRenegotiationNeededEvent

Modified: trunk/Source/WebCore/css/StyleRuleImport.cpp (281927 => 281928)


--- trunk/Source/WebCore/css/StyleRuleImport.cpp	2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/css/StyleRuleImport.cpp	2021-09-02 16:33:06 UTC (rev 281928)
@@ -36,16 +36,17 @@
 
 namespace WebCore {
 
-Ref<StyleRuleImport> StyleRuleImport::create(const String& href, Ref<MediaQuerySet>&& media)
+Ref<StyleRuleImport> StyleRuleImport::create(const String& href, Ref<MediaQuerySet>&& media, std::optional<CascadeLayerName>&& cascadeLayerName)
 {
-    return adoptRef(*new StyleRuleImport(href, WTFMove(media)));
+    return adoptRef(*new StyleRuleImport(href, WTFMove(media), WTFMove(cascadeLayerName)));
 }
 
-StyleRuleImport::StyleRuleImport(const String& href, Ref<MediaQuerySet>&& media)
+StyleRuleImport::StyleRuleImport(const String& href, Ref<MediaQuerySet>&& media, std::optional<CascadeLayerName>&& cascadeLayerName)
     : StyleRuleBase(StyleRuleType::Import)
     , m_styleSheetClient(this)
     , m_strHref(href)
     , m_mediaQueries(WTFMove(media))
+    , m_cascadeLayerName(WTFMove(cascadeLayerName))
 {
     if (!m_mediaQueries)
         m_mediaQueries = MediaQuerySet::create(String(), MediaQueryParserContext());

Modified: trunk/Source/WebCore/css/StyleRuleImport.h (281927 => 281928)


--- trunk/Source/WebCore/css/StyleRuleImport.h	2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/css/StyleRuleImport.h	2021-09-02 16:33:06 UTC (rev 281928)
@@ -35,7 +35,7 @@
 class StyleRuleImport final : public StyleRuleBase {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    static Ref<StyleRuleImport> create(const String& href, Ref<MediaQuerySet>&&);
+    static Ref<StyleRuleImport> create(const String& href, Ref<MediaQuerySet>&&, std::optional<CascadeLayerName>&&);
 
     ~StyleRuleImport();
     
@@ -52,10 +52,12 @@
     void requestStyleSheet();
     const CachedCSSStyleSheet* cachedCSSStyleSheet() const { return m_cachedSheet.get(); }
 
+    const std::optional<CascadeLayerName>& cascadeLayerName() const { return m_cascadeLayerName; }
+
 private:
     // NOTE: We put the CachedStyleSheetClient in a member instead of inheriting from it
     // to avoid adding a vptr to StyleRuleImport.
-class ImportedStyleSheetClient final : public CachedStyleSheetClient {
+    class ImportedStyleSheetClient final : public CachedStyleSheetClient {
     public:
         ImportedStyleSheetClient(StyleRuleImport* ownerRule) : m_ownerRule(ownerRule) { }
         virtual ~ImportedStyleSheetClient() = default;
@@ -70,7 +72,7 @@
     void setCSSStyleSheet(const String& href, const URL& baseURL, const String& charset, const CachedCSSStyleSheet*);
     friend class ImportedStyleSheetClient;
 
-    StyleRuleImport(const String& href, Ref<MediaQuerySet>&&);
+    StyleRuleImport(const String& href, Ref<MediaQuerySet>&&, std::optional<CascadeLayerName>&&);
 
     StyleSheetContents* m_parentStyleSheet { nullptr };
 
@@ -78,6 +80,7 @@
     String m_strHref;
     RefPtr<MediaQuerySet> m_mediaQueries;
     RefPtr<StyleSheetContents> m_styleSheet;
+    std::optional<CascadeLayerName> m_cascadeLayerName;
     CachedResourceHandle<CachedCSSStyleSheet> m_cachedSheet;
     bool m_loading { false };
 };

Modified: trunk/Source/WebCore/css/parser/CSSParserImpl.cpp (281927 => 281928)


--- trunk/Source/WebCore/css/parser/CSSParserImpl.cpp	2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/css/parser/CSSParserImpl.cpp	2021-09-02 16:33:06 UTC (rev 281928)
@@ -507,6 +507,32 @@
     return StyleRuleCharset::create();
 }
 
+enum class AllowAnonymous { Yes, No };
+static std::optional<CascadeLayerName> consumeCascadeLayerName(CSSParserTokenRange& range, AllowAnonymous allowAnonymous)
+{
+    CascadeLayerName name;
+    if (range.atEnd()) {
+        if (allowAnonymous == AllowAnonymous::Yes)
+            return name;
+        return { };
+    }
+
+    while (true) {
+        auto nameToken = range.consume();
+        if (nameToken.type() != IdentToken)
+            return { };
+
+        name.append(nameToken.value().toAtomString());
+
+        if (range.peek().type() != DelimiterToken || range.peek().delimiter() != '.')
+            break;
+        range.consume();
+    }
+
+    range.consumeWhitespace();
+    return name;
+}
+
 RefPtr<StyleRuleImport> CSSParserImpl::consumeImportRule(CSSParserTokenRange prelude)
 {
     AtomString uri(consumeStringOrURI(prelude));
@@ -520,8 +546,29 @@
         m_observerWrapper->observer().startRuleBody(endOffset);
         m_observerWrapper->observer().endRuleBody(endOffset);
     }
+
+    prelude.consumeWhitespace();
+
+    auto consumeCascadeLayer = [&]() -> std::optional<CascadeLayerName> {
+        if (!m_context.cascadeLayersEnabled)
+            return { };
+        
+        auto& token = prelude.peek();
+        if (token.type() == FunctionToken && equalIgnoringASCIICase(token.value(), "layer")) {
+            auto contents = CSSPropertyParserHelpers::consumeFunction(prelude);
+            return consumeCascadeLayerName(contents, AllowAnonymous::No);
+        }
+        if (token.type() == IdentToken && equalIgnoringASCIICase(token.value(), "layer")) {
+            prelude.consumeIncludingWhitespace();
+            return CascadeLayerName { };
+        }
+        return { };
+    };
+
+    auto cascadeLayerName = consumeCascadeLayer();
+    auto mediaQuerySet = MediaQueryParser::parseMediaQuerySet(prelude, MediaQueryParserContext(m_context));
     
-    return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(prelude, MediaQueryParserContext(m_context)).releaseNonNull());
+    return StyleRuleImport::create(uri, mediaQuerySet.releaseNonNull(), WTFMove(cascadeLayerName));
 }
 
 RefPtr<StyleRuleNamespace> CSSParserImpl::consumeNamespaceRule(CSSParserTokenRange prelude)
@@ -687,33 +734,11 @@
 
     auto preludeCopy = prelude;
 
-    auto consumeName = [&]() -> std::optional<CascadeLayerName> {
-        CascadeLayerName name;
-        // Anonymous case.
-        if (prelude.atEnd())
-            return name;
-
-        while (true) {
-            auto nameToken = prelude.consume();
-            if (nameToken.type() != IdentToken)
-                return { };
-
-            name.append(nameToken.value().toAtomString());
-
-            if (prelude.peek().type() != DelimiterToken || prelude.peek().delimiter() != '.')
-                break;
-            prelude.consume();
-        }
-
-        prelude.consumeWhitespace();
-        return name;
-    };
-
     if (!block) {
         // List syntax.
         Vector<CascadeLayerName> nameList;
         while (true) {
-            auto name = consumeName();
+            auto name = consumeCascadeLayerName(prelude, AllowAnonymous::No);
             if (!name)
                 return nullptr;
             nameList.append(*name);
@@ -737,7 +762,7 @@
         return StyleRuleLayer::create(WTFMove(nameList));
     }
 
-    auto name = consumeName();
+    auto name = consumeCascadeLayerName(prelude, AllowAnonymous::Yes);
     if (!name)
         return nullptr;
 

Modified: trunk/Source/WebCore/style/RuleSet.cpp (281927 => 281928)


--- trunk/Source/WebCore/style/RuleSet.cpp	2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/style/RuleSet.cpp	2021-09-02 16:33:06 UTC (rev 281928)
@@ -376,9 +376,17 @@
     for (auto& rule : sheet.importRules()) {
         if (!rule->styleSheet())
             continue;
+        
+        if (mediaQueryCollector.pushAndEvaluate(rule->mediaQueries())) {
+            auto& cascadeLayerName = rule->cascadeLayerName();
+            if (cascadeLayerName)
+                pushCascadeLayer(*cascadeLayerName);
 
-        if (mediaQueryCollector.pushAndEvaluate(rule->mediaQueries()))
             addRulesFromSheet(*rule->styleSheet());
+
+            if (cascadeLayerName)
+                popCascadeLayer(*cascadeLayerName);
+        }
         mediaQueryCollector.pop(rule->mediaQueries());
     }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to