Title: [284182] trunk
Revision
284182
Author
[email protected]
Date
2021-10-14 11:37:42 -0700 (Thu, 14 Oct 2021)

Log Message

[CSS Cascade Layers] Layer should have higher priority than its descendant layers
https://bugs.webkit.org/show_bug.cgi?id=231725

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-counter-style-override-expected.txt:
* web-platform-tests/css/css-cascade/layer-counter-style-override.html:
* 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.html:
* web-platform-tests/css/css-cascade/layer-property-override-expected.txt:
* web-platform-tests/css/css-cascade/layer-property-override.html:
* web-platform-tests/css/css-cascade/layer-scroll-timeline-override-expected.txt:
* web-platform-tests/css/css-cascade/layer-scroll-timeline-override.html:
* web-platform-tests/css/css-cascade/presentational-hints-cascade-expected.txt:
* web-platform-tests/css/css-cascade/presentational-hints-cascade.html:

Source/WebCore:

The spec was updated in https://github.com/w3c/csswg-drafts/commit/a6fc16e1b65868c6f984918cc76ad9b238e7139e

"Cascade layers are sorted by the order in which they first are declared, with nested layers grouped
within their parent layers before any unlayered rules."

* style/RuleSetBuilder.cpp:
(WebCore::Style::RuleSetBuilder::updateCascadeLayerPriorities):

Change the sorting order so parents sort after their children.

* style/RuleSetBuilder.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-10-14 18:37:42 UTC (rev 284182)
@@ -1,3 +1,25 @@
+2021-10-14  Antti Koivisto  <[email protected]>
+
+        [CSS Cascade Layers] Layer should have higher priority than its descendant layers
+        https://bugs.webkit.org/show_bug.cgi?id=231725
+
+        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-counter-style-override-expected.txt:
+        * web-platform-tests/css/css-cascade/layer-counter-style-override.html:
+        * 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.html:
+        * web-platform-tests/css/css-cascade/layer-property-override-expected.txt:
+        * web-platform-tests/css/css-cascade/layer-property-override.html:
+        * web-platform-tests/css/css-cascade/layer-scroll-timeline-override-expected.txt:
+        * web-platform-tests/css/css-cascade/layer-scroll-timeline-override.html:
+        * web-platform-tests/css/css-cascade/presentational-hints-cascade-expected.txt:
+        * web-platform-tests/css/css-cascade/presentational-hints-cascade.html:
+
 2021-10-14  Tim Nguyen  <[email protected]>
 
         Don't run focusing steps on disconnected or inert <dialog>

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


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-basic.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-basic.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -56,9 +56,9 @@
         title: 'A5 Anonymous layers',
         style: `
             @layer {
-                target { color: red; }
+                target { color: green; }
                 @layer {
-                    target { color: green; }
+                    target { color: red; }
                 }
             }
         `,
@@ -68,9 +68,9 @@
         style: `
             @layer {
                 @layer {
-                    target { color: green; }
+                    target { color: red; }
                 }
-                target { color: red; }
+                target { color: green; }
             }
         `,
     },
@@ -85,9 +85,9 @@
             }
             @layer {
                 @layer {
-                    target { color: green; }
+                    target { color: red; }
                 }
-                target { color: red; }
+                target { color: green; }
             }
         `,
     },
@@ -104,9 +104,9 @@
             }
             @layer {
                 @layer {
-                    target { color: green; }
+                    target { color: red; }
                 }
-                target { color: red; }
+                target { color: green; }
             }
         `,
     },
@@ -122,10 +122,10 @@
             @layer {
                 @layer {
                     @layer {
-                        target { color: green; }
+                        target { color: red; }
                     }
                 }
-                target { color: red; }
+                target { color: green; }
             }
         `,
     },
@@ -175,9 +175,9 @@
         title: 'B5 Named layers',
         style: `
             @layer A {
-                target { color: red; }
+                target { color: green; }
                 @layer A {
-                    target { color: green; }
+                    target { color: red; }
                 }
             }
         `,
@@ -362,11 +362,11 @@
         style: `
             @layer A {
                 @layer {
-                    target { color: green; }
+                    target { color: red; }
                 }
             }
             @layer A {
-                target { color: red; }
+                target { color: green; }
             }
         `,
     },

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-counter-style-override-expected.txt (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-counter-style-override-expected.txt	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-counter-style-override-expected.txt	2021-10-14 18:37:42 UTC (rev 284182)
@@ -1,5 +1,5 @@
 
-FAIL @counter-style layered overrides unlayered assert_equals: expected "31.21875px" but got "0px"
+FAIL @counter-style unlayered overrides layered assert_equals: expected "31.21875px" but got "0px"
 FAIL @counter-style override between layers assert_equals: expected "31.21875px" but got "6px"
 FAIL @counter-style override update with appended sheet 1 assert_equals: expected "31.21875px" but got "6px"
 FAIL @counter-style override update with appended sheet 2 assert_equals: expected "31.21875px" but got "6px"

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-counter-style-override.html (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-counter-style-override.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-counter-style-override.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -35,21 +35,21 @@
 
 const testCases = [
   {
-    title: '@counter-style layered overrides unlayered',
+    title: '@counter-style unlayered overrides layered',
     style: `
       #target::before {
         content: counter(dont-care, custom-counter-style);
       }
 
+      @counter-style custom-counter-style {
+        system: extends four;
+      }
+
       @layer {
         @counter-style custom-counter-style {
-          system: extends four;
+          system: extends three;
         }
       }
-
-      @counter-style custom-counter-style {
-        system: extends three;
-      }
     `
   },
 

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


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-font-face-override.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -24,6 +24,11 @@
         font-family: custom-font;
       }
 
+      @font-face {
+        font-family: custom-font;
+        src: url('/fonts/Ahem.ttf');
+      }
+
       @layer {
         @font-face {
           font-family: custom-font;
@@ -30,11 +35,6 @@
           src: url('/fonts/noto/noto-sans-v8-latin-regular.woff') format('woff');
         }
       }
-
-      @font-face {
-        font-family: custom-font;
-        src: url('/fonts/Ahem.ttf');
-      }
     `
   },
 

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


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -145,9 +145,9 @@
     {
         title: 'C4 Named imports',
         style: `
-            @import url(layer-green.css) layer(A);
+            @import url(layer-red.css) layer(A);
             @layer A {
-                target { color: red; }
+                target { color: green; }
             }
         `
     },
@@ -192,8 +192,8 @@
         title: 'C9 Named imports',
         style: `
             @import url(basic-red.css) layer(A);
-            @import url(basic-green.css) layer(B.A);
-            @import url(basic-red.css) layer(B);
+            @import url(basic-red.css) layer(B.A);
+            @import url(basic-green.css) layer(B);
         `
     },
     {

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


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-keyframes-override.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -29,15 +29,15 @@
         animation: anim 1s paused;
       }
 
+      @keyframes anim {
+        from { background-color: green; }
+      }
+
       @layer {
         @keyframes anim {
           from { background-color: red; }
         }
       }
-
-      @keyframes anim {
-        from { background-color: green; }
-      }
     `
   },
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-property-override-expected.txt (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-property-override-expected.txt	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-property-override-expected.txt	2021-10-14 18:37:42 UTC (rev 284182)
@@ -1,5 +1,5 @@
 
-FAIL @property layered overrides unlayered assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
+FAIL @property unlayered overrides layered assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
 FAIL @property override between layers assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
 FAIL @property override update with appended sheet 1 assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
 FAIL @property override update with appended sheet 2 assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-property-override.html (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-property-override.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-property-override.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -23,26 +23,26 @@
 
 const testCases = [
   {
-    title: '@property layered overrides unlayered',
+    title: '@property unlayered overrides layered',
     style: `
       #target {
         background-color: var(--foo);
       }
 
+      @property --foo {
+        syntax: '<color>';
+        inherits: false;
+        initial-value: green;
+      }
+
       @layer {
         @property --foo {
           syntax: '<color>';
           inherits: false;
-          initial-value: green;
+          initial-value: red;
         }
       }
-
-      @property --foo {
-        syntax: '<color>';
-        inherits: false;
-        initial-value: red;
-      }
-    `
+   `
   },
 
   {

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-scroll-timeline-override-expected.txt (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-scroll-timeline-override-expected.txt	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-scroll-timeline-override-expected.txt	2021-10-14 18:37:42 UTC (rev 284182)
@@ -1,5 +1,5 @@
 
-FAIL @scroll-timeline layered overrides unlayered assert_true: This test requires @scroll-timeline support expected true got false
+FAIL @scroll-timeline unlayered overrides layered assert_true: This test requires @scroll-timeline support expected true got false
 FAIL @scroll-timeline override between layers assert_true: This test requires @scroll-timeline support expected true got false
 FAIL @scroll-timeline override update with appended sheet 1 assert_true: This test requires @scroll-timeline support expected true got false
 FAIL @scroll-timeline override update with appended sheet 2 assert_true: This test requires @scroll-timeline support expected true got false

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-scroll-timeline-override.html (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-scroll-timeline-override.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-scroll-timeline-override.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -46,25 +46,25 @@
 
 const testCases = [
   {
-    title: '@scroll-timeline layered overrides unlayered',
+    title: '@scroll-timeline unlayered overrides layered',
     style: `
       #target {
         animation-timeline: timeline;
       }
 
+      @scroll-timeline timeline {
+        source: selector(#scroller);
+        start: 0px;
+        end: 50px;
+      }
+
       @layer {
         @scroll-timeline timeline {
           source: selector(#scroller);
           start: 0px;
-          end: 50px;
+          end: 100px;
         }
       }
-
-      @scroll-timeline timeline {
-        source: selector(#scroller);
-        start: 0px;
-        end: 100px;
-      }
     `
   },
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/presentational-hints-cascade-expected.txt (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/presentational-hints-cascade-expected.txt	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/presentational-hints-cascade-expected.txt	2021-10-14 18:37:42 UTC (rev 284182)
@@ -2,4 +2,5 @@
 
 PASS Presentational hints have lower precedence than regular author style sheets
 PASS Presentational hints have lower precedence than the style attribute
+PASS Presentational hints have lower precedence than layered style
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/presentational-hints-cascade.html (284181 => 284182)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/presentational-hints-cascade.html	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/presentational-hints-cascade.html	2021-10-14 18:37:42 UTC (rev 284182)
@@ -12,10 +12,17 @@
 #target1 {
   width: 100px;
 }
+
+@layer {
+  #target3 {
+    width: 100px;
+  }
+}
 </style>
 
 <img class=test id=target1 width=200>
 <img class=test id=target2 width=200 style="width: 100px">
+<img class=test id=target3 width=200>
 
 <script>
 test(() => {
@@ -25,4 +32,8 @@
 test(() => {
   assert_equals(getComputedStyle(target2).width, '100px');
 }, 'Presentational hints have lower precedence than the style attribute');
+
+test(() => {
+  assert_equals(getComputedStyle(target3).width, '100px');
+}, 'Presentational hints have lower precedence than layered style');
 </script>

Modified: trunk/Source/WebCore/ChangeLog (284181 => 284182)


--- trunk/Source/WebCore/ChangeLog	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/Source/WebCore/ChangeLog	2021-10-14 18:37:42 UTC (rev 284182)
@@ -1,3 +1,22 @@
+2021-10-14  Antti Koivisto  <[email protected]>
+
+        [CSS Cascade Layers] Layer should have higher priority than its descendant layers
+        https://bugs.webkit.org/show_bug.cgi?id=231725
+
+        Reviewed by Simon Fraser.
+
+        The spec was updated in https://github.com/w3c/csswg-drafts/commit/a6fc16e1b65868c6f984918cc76ad9b238e7139e
+
+        "Cascade layers are sorted by the order in which they first are declared, with nested layers grouped
+        within their parent layers before any unlayered rules."
+
+        * style/RuleSetBuilder.cpp:
+        (WebCore::Style::RuleSetBuilder::updateCascadeLayerPriorities):
+
+        Change the sorting order so parents sort after their children.
+        
+        * style/RuleSetBuilder.h:
+
 2021-10-14  Tim Horton  <[email protected]>
 
         Further adjust style of alternate form control design

Modified: trunk/Source/WebCore/style/RuleSetBuilder.cpp (284181 => 284182)


--- trunk/Source/WebCore/style/RuleSetBuilder.cpp	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/Source/WebCore/style/RuleSetBuilder.cpp	2021-10-14 18:37:42 UTC (rev 284182)
@@ -235,20 +235,27 @@
         return;
 
     auto compare = [&](auto a, auto b) {
-        while (a && b) {
-            // Identifiers are in parse order which almost corresponds to the layer priority order.
-            // The only exception is when a sublayer gets added to a layer after adding other non-sublayers.
-            // To resolve this we need look for a shared ancestor layer.
+        while (true) {
+            // Identifiers are in parse order.
             auto aParent = m_ruleSet->cascadeLayerForIdentifier(a).parentIdentifier;
             auto bParent = m_ruleSet->cascadeLayerForIdentifier(b).parentIdentifier;
-            if (aParent == bParent || aParent == b || bParent == a)
-                break;
+
+            // For sibling layers, the later layer in parse order has a higher priority.
+            if (aParent == bParent)
+                return a < b;
+
+            // For nested layers, the parent layer has a higher priority.
+            if (aParent == b)
+                return true;
+            if (a == bParent)
+                return false;
+
+            // Traverse to parent. Parent layer identifiers are always lower.
             if (aParent > bParent)
                 a = aParent;
             else
                 b = bParent;
         }
-        return a < b;
     };
 
     auto layerCount = m_ruleSet->m_cascadeLayers.size();

Modified: trunk/Source/WebCore/style/RuleSetBuilder.h (284181 => 284182)


--- trunk/Source/WebCore/style/RuleSetBuilder.h	2021-10-14 18:30:47 UTC (rev 284181)
+++ trunk/Source/WebCore/style/RuleSetBuilder.h	2021-10-14 18:37:42 UTC (rev 284182)
@@ -74,11 +74,11 @@
     Resolver* m_resolver { nullptr };
     const ShrinkToFit m_shrinkToFit { ShrinkToFit::Enable };
 
-    CascadeLayerName m_resolvedCascadeLayerName { };
-    HashMap<CascadeLayerName, RuleSet::CascadeLayerIdentifier> m_cascadeLayerIdentifierMap { };
+    CascadeLayerName m_resolvedCascadeLayerName;
+    HashMap<CascadeLayerName, RuleSet::CascadeLayerIdentifier> m_cascadeLayerIdentifierMap;
     RuleSet::CascadeLayerIdentifier m_currentCascadeLayerIdentifier { 0 };
 
-    Vector<RuleSet::ResolverMutatingRule> m_collectedResolverMutatingRules { };
+    Vector<RuleSet::ResolverMutatingRule> m_collectedResolverMutatingRules;
     bool didSeeResolverMutationWithinDynamicMediaQuery { false };
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to