Title: [283718] trunk
Revision
283718
Author
[email protected]
Date
2021-10-07 10:18:56 -0700 (Thu, 07 Oct 2021)

Log Message

Cascade layer styles should be lower priority than unlayered styles
https://bugs.webkit.org/show_bug.cgi?id=231342

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

Update from the WPT repo.

* web-platform-tests/css/css-cascade/layer-basic.html:
* web-platform-tests/css/css-cascade/layer-font-face-override-expected.txt:
* web-platform-tests/css/css-cascade/layer-font-face-override.html:
* web-platform-tests/css/css-cascade/layer-import.html:
* web-platform-tests/css/css-cascade/layer-keyframes-override-expected.txt:
* web-platform-tests/css/css-cascade/layer-keyframes-override.html:
* web-platform-tests/css/css-cascade/layer-stylesheet-sharing.html:

Source/WebCore:

Update the implementation to match the resolution for https://github.com/w3c/csswg-drafts/issues/6284.

* style/ElementRuleCollector.cpp:
(WebCore::Style::ElementRuleCollector::addMatchedRule):
(WebCore::Style::compareRules):
* style/ElementRuleCollector.h:
* style/RuleSet.h:
(WebCore::Style::RuleSet::cascadeLayerPriorityForIdentifier const):
(WebCore::Style::RuleSet::cascadeLayerPriorityFor const):

Return std::numeric_limits<unsigned>::max() for unlayered rules.

(WebCore::Style::RuleSet::cascadeLayerOrderForIdentifier const): Deleted.
(WebCore::Style::RuleSet::cascadeLayerOrderFor const): Deleted.

Also update naming order->priority to better match the spec text.

* style/RuleSetBuilder.cpp:
(WebCore::Style::RuleSetBuilder::~RuleSetBuilder):
(WebCore::Style::RuleSetBuilder::updateCascadeLayerPriorities):
(WebCore::Style::RuleSetBuilder::addMutatingRulesToResolver):
(WebCore::Style::RuleSetBuilder::updateCascadeLayerOrder): Deleted.
* style/RuleSetBuilder.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-10-07 17:18:56 UTC (rev 283718)
@@ -1,3 +1,20 @@
+2021-10-07  Antti Koivisto  <[email protected]>
+
+        Cascade layer styles should be lower priority than unlayered styles
+        https://bugs.webkit.org/show_bug.cgi?id=231342
+
+        Reviewed by Simon Fraser.
+
+        Update from the WPT repo.
+
+        * web-platform-tests/css/css-cascade/layer-basic.html:
+        * web-platform-tests/css/css-cascade/layer-font-face-override-expected.txt:
+        * web-platform-tests/css/css-cascade/layer-font-face-override.html:
+        * web-platform-tests/css/css-cascade/layer-import.html:
+        * web-platform-tests/css/css-cascade/layer-keyframes-override-expected.txt:
+        * web-platform-tests/css/css-cascade/layer-keyframes-override.html:
+        * web-platform-tests/css/css-cascade/layer-stylesheet-sharing.html:
+
 2021-10-07  Rob Buis  <[email protected]>
 
         Resync the-img-element WPT tests from upstream

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-basic.html (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-basic.html	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-basic.html	2021-10-07 17:18:56 UTC (rev 283718)
@@ -26,9 +26,9 @@
     {
         title: 'A2 Anonymous layers',
         style: `
-            target { color: red; }
+            target { color: green; }
             @layer {
-                target { color: green; }
+                target { color: red; }
             }
         `,
     },
@@ -36,9 +36,9 @@
         title: 'A3 Anonymous layers',
         style: `
             @layer {
-                target { color: green; }
+                target { color: red; }
             }
-            target { color: red; }
+            target { color: green; }
         `,
     },
     {
@@ -61,7 +61,6 @@
                     target { color: green; }
                 }
             }
-            target { color: red; }
         `,
     },
     {
@@ -73,7 +72,6 @@
                 }
                 target { color: red; }
             }
-            target { color: red; }
         `,
     },
     {
@@ -143,9 +141,9 @@
         title: 'B2 Named layers',
         style: `
             @layer A {
-                target { color: green; }
+                target { color: red; }
             }
-            target { color: red; }
+            target { color: green; }
         `,
     },
     {
@@ -157,7 +155,6 @@
             @layer A {
                 target { color: green; }
             }
-            target { color: red; }
         `,
     },
     {
@@ -508,11 +505,10 @@
     },
 ];
 
-for (var i = 0; i < testCases.length; ++i) {
-    var testCase = testCases[i];
-    var documentStyle = document.createElement('style');
-    documentStyle.appendChild(document.createTextNode(testCase['style']));
-    document.head.appendChild(documentStyle);
+for (let testCase of testCases) {
+    const styleElement = document.createElement('style');
+    styleElement.textContent = testCase['style'];
+    document.head.append(styleElement);
 
     test(function () {
         var targets = document.querySelectorAll('target');
@@ -521,7 +517,7 @@
                       testCase['title'] + ", target '" + target.classList[0] + "'");
     }, testCase['title']);
 
-    document.head.removeChild(documentStyle)
+    styleElement.remove();
 }
 </script>
 </body>

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override-expected.txt (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override-expected.txt	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override-expected.txt	2021-10-07 17:18:56 UTC (rev 283718)
@@ -1,6 +1,6 @@
 Test
 
-PASS @font-face layered overrides unlayered
+PASS @font-face unlayered overrides layered
 PASS @font-face override between layers
 PASS @font-face override update with appended sheet 1
 PASS @font-face override update with appended sheet 2

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override.html (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override.html	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override.html	2021-10-07 17:18:56 UTC (rev 283718)
@@ -18,7 +18,7 @@
 
 const testCases = [
   {
-    title: '@font-face layered overrides unlayered',
+    title: '@font-face unlayered overrides layered',
     style: `
       #target {
         font-family: custom-font;
@@ -27,13 +27,13 @@
       @layer {
         @font-face {
           font-family: custom-font;
-          src: url('/fonts/Ahem.ttf');
+          src: url('/fonts/noto/noto-sans-v8-latin-regular.woff') format('woff');
         }
       }
 
       @font-face {
         font-family: custom-font;
-        src: url('/fonts/noto/noto-sans-v8-latin-regular.woff') format('woff');
+        src: url('/fonts/Ahem.ttf');
       }
     `
   },

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import.html (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import.html	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import.html	2021-10-07 17:18:56 UTC (rev 283718)
@@ -57,9 +57,9 @@
     {
         title: 'A1 Layer rules with import',
         style: `
-            @import url(basic-red.css);
+            @import url(basic-green.css);
             @layer {
-                target { color: green; }
+                target { color: red; }
             }
         `
     },
@@ -66,15 +66,15 @@
     {
         title: 'A2 Layer rules with import',
         style: `
-            @import url(layer-green.css);
-            target { color: red; }
+            @import url(layer-red.css);
+            target { color: green; }
         `
     },
     {
         title: 'A3 Layer rules with import',
         style: `
-            @import url(layer-green.css);
-            @import url(basic-red.css);
+            @import url(basic-green.css);
+            @import url(layer-red.css);
         `
     },
     {
@@ -92,8 +92,8 @@
     {
         title: 'B1 Anonymous imports',
         style: `
-            @import url(basic-green.css) layer;
-            target { color: red; }
+            @import url(basic-red.css) layer;
+            target { color: green; }
         `
     },
     {
@@ -122,8 +122,8 @@
     {
         title: 'C1 Named imports',
         style: `
-            @import url(basic-green.css) layer(A);
-            target { color: red; }
+            @import url(basic-red.css) layer(A);
+            target { color: green; }
         `
     },
     {
@@ -260,18 +260,20 @@
         const styleText = testCase['style'].replaceAll(/url\((.+?)\)/g, (match, p1) => {
             return `url(data:text/css,${ encodeURI(imports[p1]) })`;
         });
-        styleElement.appendChild(document.createTextNode(styleText));
+        styleElement.textContent = styleText;
 
         await new Promise(resolve => {
             styleElement._onload_ = resolve;
-            document.head.appendChild(styleElement);
+            document.head.append(styleElement);
         });
 
-        const targets = document.querySelectorAll('target');
-        for (target of targets)
-            assert_equals(window.getComputedStyle(target).color, 'rgb(0, 128, 0)', testCase['title'] + ", target '" + target.classList[0] + "'");
-
-       document.head.removeChild(styleElement);
+        try {
+            const targets = document.querySelectorAll('target');
+            for (target of targets)
+                assert_equals(window.getComputedStyle(target).color, 'rgb(0, 128, 0)', testCase['title'] + ", target '" + target.classList[0] + "'");
+        } finally {
+            styleElement.remove();
+        }
     }, testCase['title']);
 }
 </script>

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override-expected.txt (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override-expected.txt	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override-expected.txt	2021-10-07 17:18:56 UTC (rev 283718)
@@ -1,5 +1,5 @@
 
-PASS @keyframes layered overrides unlayered
+PASS @keyframes unlayered overrides layered
 PASS @keyframes override between layers
 PASS @keyframes override update with appended sheet 1
 PASS @keyframes override update with appended sheet 2

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override.html (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override.html	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override.html	2021-10-07 17:18:56 UTC (rev 283718)
@@ -23,7 +23,7 @@
 
 const testCases = [
   {
-    title: '@keyframes layered overrides unlayered',
+    title: '@keyframes unlayered overrides layered',
     style: `
       #target {
         animation: anim 1s paused;
@@ -31,12 +31,12 @@
 
       @layer {
         @keyframes anim {
-          from { background-color: green; }
+          from { background-color: red; }
         }
       }
 
       @keyframes anim {
-        from { background-color: red; }
+        from { background-color: green; }
       }
     `
   },

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-stylesheet-sharing.html (283717 => 283718)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-stylesheet-sharing.html	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-stylesheet-sharing.html	2021-10-07 17:18:56 UTC (rev 283718)
@@ -10,7 +10,6 @@
     display: block;
     width: 100px;
     height: 100px;
-    background-color: red;
   }
 </style>
 <link rel=stylesheet href=""

Modified: trunk/Source/WebCore/ChangeLog (283717 => 283718)


--- trunk/Source/WebCore/ChangeLog	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/Source/WebCore/ChangeLog	2021-10-07 17:18:56 UTC (rev 283718)
@@ -1,3 +1,34 @@
+2021-10-07  Antti Koivisto  <[email protected]>
+
+        Cascade layer styles should be lower priority than unlayered styles
+        https://bugs.webkit.org/show_bug.cgi?id=231342
+
+        Reviewed by Simon Fraser.
+
+        Update the implementation to match the resolution for https://github.com/w3c/csswg-drafts/issues/6284.
+
+        * style/ElementRuleCollector.cpp:
+        (WebCore::Style::ElementRuleCollector::addMatchedRule):
+        (WebCore::Style::compareRules):
+        * style/ElementRuleCollector.h:
+        * style/RuleSet.h:
+        (WebCore::Style::RuleSet::cascadeLayerPriorityForIdentifier const):
+        (WebCore::Style::RuleSet::cascadeLayerPriorityFor const):
+
+        Return std::numeric_limits<unsigned>::max() for unlayered rules.
+
+        (WebCore::Style::RuleSet::cascadeLayerOrderForIdentifier const): Deleted.
+        (WebCore::Style::RuleSet::cascadeLayerOrderFor const): Deleted.
+
+        Also update naming order->priority to better match the spec text.
+
+        * style/RuleSetBuilder.cpp:
+        (WebCore::Style::RuleSetBuilder::~RuleSetBuilder):
+        (WebCore::Style::RuleSetBuilder::updateCascadeLayerPriorities):
+        (WebCore::Style::RuleSetBuilder::addMutatingRulesToResolver):
+        (WebCore::Style::RuleSetBuilder::updateCascadeLayerOrder): Deleted.
+        * style/RuleSetBuilder.h:
+
 2021-10-06  Simon Fraser  <[email protected]>
 
         Clean up state maintenance around animated scrolls

Modified: trunk/Source/WebCore/style/ElementRuleCollector.cpp (283717 => 283718)


--- trunk/Source/WebCore/style/ElementRuleCollector.cpp	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/Source/WebCore/style/ElementRuleCollector.cpp	2021-10-07 17:18:56 UTC (rev 283718)
@@ -113,8 +113,8 @@
 
 inline void ElementRuleCollector::addMatchedRule(const RuleData& ruleData, unsigned specificity, const MatchRequest& matchRequest)
 {
-    auto cascadeLayerOrder = matchRequest.ruleSet ? matchRequest.ruleSet->cascadeLayerOrderFor(ruleData) : 0;
-    m_matchedRules.append({ &ruleData, specificity, matchRequest.styleScopeOrdinal, cascadeLayerOrder });
+    auto cascadeLayerPriority = matchRequest.ruleSet ? matchRequest.ruleSet->cascadeLayerPriorityFor(ruleData) : RuleSet::cascadeLayerPriorityForUnlayered;
+    m_matchedRules.append({ &ruleData, specificity, matchRequest.styleScopeOrdinal, cascadeLayerPriority });
 }
 
 void ElementRuleCollector::clearMatchedRules()
@@ -546,8 +546,8 @@
     if (r1.styleScopeOrdinal != r2.styleScopeOrdinal)
         return r1.styleScopeOrdinal > r2.styleScopeOrdinal;
 
-    if (r1.cascadeLayerOrder != r2.cascadeLayerOrder)
-        return r1.cascadeLayerOrder < r2.cascadeLayerOrder;
+    if (r1.cascadeLayerPriority != r2.cascadeLayerPriority)
+        return r1.cascadeLayerPriority < r2.cascadeLayerPriority;
 
     if (r1.specificity != r2.specificity)
         return r1.specificity < r2.specificity;

Modified: trunk/Source/WebCore/style/ElementRuleCollector.h (283717 => 283718)


--- trunk/Source/WebCore/style/ElementRuleCollector.h	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/Source/WebCore/style/ElementRuleCollector.h	2021-10-07 17:18:56 UTC (rev 283718)
@@ -62,7 +62,7 @@
     const RuleData* ruleData;
     unsigned specificity;
     ScopeOrdinal styleScopeOrdinal;
-    unsigned cascadeLayerOrder;
+    unsigned cascadeLayerPriority;
 };
 
 struct MatchedProperties {

Modified: trunk/Source/WebCore/style/RuleSet.h (283717 => 283718)


--- trunk/Source/WebCore/style/RuleSet.h	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/Source/WebCore/style/RuleSet.h	2021-10-07 17:18:56 UTC (rev 283718)
@@ -103,7 +103,8 @@
     bool hasShadowPseudoElementRules() const { return !m_shadowPseudoElementRules.isEmpty(); }
     bool hasHostPseudoClassRulesMatchingInShadowTree() const { return m_hasHostPseudoClassRulesMatchingInShadowTree; }
 
-    unsigned cascadeLayerOrderFor(const RuleData&) const;
+    static constexpr auto cascadeLayerPriorityForUnlayered = std::numeric_limits<unsigned>::max();
+    unsigned cascadeLayerPriorityFor(const RuleData&) const;
 
 private:
     friend class RuleSetBuilder;
@@ -131,11 +132,11 @@
     struct CascadeLayer {
         CascadeLayerName resolvedName;
         CascadeLayerIdentifier parentIdentifier;
-        unsigned order { 0 };
+        unsigned priority { 0 };
     };
     CascadeLayer& cascadeLayerForIdentifier(CascadeLayerIdentifier identifier) { return m_cascadeLayers[identifier - 1]; }
     const CascadeLayer& cascadeLayerForIdentifier(CascadeLayerIdentifier identifier) const { return m_cascadeLayers[identifier - 1]; }
-    unsigned cascadeLayerOrderForIdentifier(CascadeLayerIdentifier) const;
+    unsigned cascadeLayerPriorityForIdentifier(CascadeLayerIdentifier) const;
 
     struct DynamicMediaQueryRules {
         Vector<Ref<const MediaQuerySet>> mediaQuerySets;
@@ -192,19 +193,19 @@
     return tagRules->get(key);
 }
 
-inline unsigned RuleSet::cascadeLayerOrderForIdentifier(CascadeLayerIdentifier identifier) const
+inline unsigned RuleSet::cascadeLayerPriorityForIdentifier(CascadeLayerIdentifier identifier) const
 {
     if (!identifier)
-        return 0;
-    return cascadeLayerForIdentifier(identifier).order;
+        return cascadeLayerPriorityForUnlayered;
+    return cascadeLayerForIdentifier(identifier).priority;
 }
 
-inline unsigned RuleSet::cascadeLayerOrderFor(const RuleData& ruleData) const
+inline unsigned RuleSet::cascadeLayerPriorityFor(const RuleData& ruleData) const
 {
     if (m_cascadeLayerIdentifierForRulePosition.size() <= ruleData.position())
-        return 0;
+        return cascadeLayerPriorityForUnlayered;
     auto identifier = m_cascadeLayerIdentifierForRulePosition[ruleData.position()];
-    return cascadeLayerOrderForIdentifier(identifier);
+    return cascadeLayerPriorityForIdentifier(identifier);
 }
 
 } // namespace Style

Modified: trunk/Source/WebCore/style/RuleSetBuilder.cpp (283717 => 283718)


--- trunk/Source/WebCore/style/RuleSetBuilder.cpp	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/Source/WebCore/style/RuleSetBuilder.cpp	2021-10-07 17:18:56 UTC (rev 283718)
@@ -50,7 +50,7 @@
     if (!m_ruleSet)
         return;
 
-    updateCascadeLayerOrder();
+    updateCascadeLayerPriorities();
     updateDynamicMediaQueries();
     addMutatingRulesToResolver();
 
@@ -222,7 +222,7 @@
     }
 }
 
-void RuleSetBuilder::updateCascadeLayerOrder()
+void RuleSetBuilder::updateCascadeLayerPriorities()
 {
     if (m_cascadeLayerIdentifierMap.isEmpty())
         return;
@@ -244,16 +244,17 @@
         return a < b;
     };
 
-    Vector<RuleSet::CascadeLayerIdentifier> orderVector;
     auto layerCount = m_ruleSet->m_cascadeLayers.size();
-    orderVector.reserveInitialCapacity(layerCount);
+
+    Vector<RuleSet::CascadeLayerIdentifier> layersInPriorityOrder;
+    layersInPriorityOrder.reserveInitialCapacity(layerCount);
     for (RuleSet::CascadeLayerIdentifier identifier = 1; identifier <= layerCount; ++identifier)
-        orderVector.uncheckedAppend(identifier);
+        layersInPriorityOrder.uncheckedAppend(identifier);
 
-    std::sort(orderVector.begin(), orderVector.end(), compare);
+    std::sort(layersInPriorityOrder.begin(), layersInPriorityOrder.end(), compare);
 
-    for (unsigned i = 0; i < orderVector.size(); ++i)
-        m_ruleSet->cascadeLayerForIdentifier(orderVector[i]).order = i + 1;
+    for (unsigned priority = 0; priority < layerCount; ++priority)
+        m_ruleSet->cascadeLayerForIdentifier(layersInPriorityOrder[priority]).priority = priority;
 }
 
 void RuleSetBuilder::addMutatingRulesToResolver()
@@ -262,9 +263,9 @@
         return;
 
     auto compareLayers = [&](const auto& a, const auto& b) {
-        auto aOrder = m_ruleSet->cascadeLayerOrderForIdentifier(a.layerIdentifier);
-        auto bOrder = m_ruleSet->cascadeLayerOrderForIdentifier(b.layerIdentifier);
-        return aOrder < bOrder;
+        auto aPriority = m_ruleSet->cascadeLayerPriorityForIdentifier(a.layerIdentifier);
+        auto bPriority = m_ruleSet->cascadeLayerPriorityForIdentifier(b.layerIdentifier);
+        return aPriority < bPriority;
     };
 
     // The order may change so we need to reprocess resolver mutating rules from earlier stylesheets.

Modified: trunk/Source/WebCore/style/RuleSetBuilder.h (283717 => 283718)


--- trunk/Source/WebCore/style/RuleSetBuilder.h	2021-10-07 16:49:28 UTC (rev 283717)
+++ trunk/Source/WebCore/style/RuleSetBuilder.h	2021-10-07 17:18:56 UTC (rev 283718)
@@ -44,7 +44,7 @@
     void registerLayers(const Vector<CascadeLayerName>&);
     void pushCascadeLayer(const CascadeLayerName&);
     void popCascadeLayer(const CascadeLayerName&);
-    void updateCascadeLayerOrder();
+    void updateCascadeLayerPriorities();
     void addMutatingRulesToResolver();
     void updateDynamicMediaQueries();
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to