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();