Title: [287018] trunk
Revision
287018
Author
[email protected]
Date
2021-12-14 02:13:54 -0800 (Tue, 14 Dec 2021)

Log Message

[CSS Cascade Layers] revert-layer should revert style attribute to regular author style
https://bugs.webkit.org/show_bug.cgi?id=234082

Reviewed by Simon Fraser.

Source/WebCore:

If 'revert-layer' keyword is used in style attribute it should revert to regular author style
on the default cascade level.

* style/PropertyCascade.cpp:
(WebCore::Style::PropertyCascade::PropertyCascade):

Make the maximum level (used for revert cascades) an std::optional.

(WebCore::Style::PropertyCascade::setPropertyInternal):
(WebCore::Style::PropertyCascade::addMatch):

Factor the revert test into a lambda.
We can never revert to an attribute style so always skip them.

* style/PropertyCascade.h:
(WebCore::Style::PropertyCascade::PropertyCascade):
(WebCore::Style::PropertyCascade::maximumCascadeLevel const): Deleted.
(WebCore::Style::PropertyCascade::maximumCascadeLayerPriority const): Deleted.
* style/RuleSet.h:
* style/StyleBuilder.cpp:
(WebCore::Style::Builder::applyCustomProperty):
(WebCore::Style::Builder::applyCascadeProperty):
(WebCore::Style::Builder::applyRollbackCascadeProperty):

Keep a pointer to the current property being applied in state instead of individual priority values.

(WebCore::Style::Builder::applyProperty):
(WebCore::Style::Builder::ensureRollbackCascadeForRevert):
(WebCore::Style::Builder::ensureRollbackCascadeForRevertLayer):

If the current property is from attribute style it reverts to the same layer.

* style/StyleBuilder.h:
* style/StyleBuilderState.h:
(WebCore::Style::BuilderState::styleScopeOrdinal const):

LayoutTests:

* TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (287017 => 287018)


--- trunk/LayoutTests/ChangeLog	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/LayoutTests/ChangeLog	2021-12-14 10:13:54 UTC (rev 287018)
@@ -1,3 +1,12 @@
+2021-12-14  Antti Koivisto  <[email protected]>
+
+        [CSS Cascade Layers] revert-layer should revert style attribute to regular author style
+        https://bugs.webkit.org/show_bug.cgi?id=234082
+
+        Reviewed by Simon Fraser.
+
+        * TestExpectations:
+
 2021-12-13  John Wilander  <[email protected]>
 
         PCM: Remove old DB update and migration code, and add a unit test for destination token DB columns

Modified: trunk/LayoutTests/TestExpectations (287017 => 287018)


--- trunk/LayoutTests/TestExpectations	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/LayoutTests/TestExpectations	2021-12-14 10:13:54 UTC (rev 287018)
@@ -2181,10 +2181,8 @@
 
 imported/w3c/web-platform-tests/css/css-cascade/important-prop.html [ ImageOnlyFailure ]
 webkit.org/b/187093 [ Debug ] imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml.html [ Skip ]
-webkit.org/b/233937 imported/w3c/web-platform-tests/css/css-cascade/revert-layer-009.html [ ImageOnlyFailure ]
 webkit.org/b/233937 imported/w3c/web-platform-tests/css/css-cascade/revert-layer-010.html [ ImageOnlyFailure ]
 webkit.org/b/233937 imported/w3c/web-platform-tests/css/css-cascade/revert-layer-011.html [ ImageOnlyFailure ]
-webkit.org/b/233937 imported/w3c/web-platform-tests/css/css-cascade/revert-layer-012.html [ ImageOnlyFailure ]
 
 webkit.org/b/148801 imported/w3c/web-platform-tests/css/css-color/t422-rgba-onscreen-b.xht [ ImageOnlyFailure ]
 webkit.org/b/148801 imported/w3c/web-platform-tests/css/css-color/t422-rgba-onscreen-multiple-boxes-c.xht [ ImageOnlyFailure ]

Modified: trunk/Source/WebCore/ChangeLog (287017 => 287018)


--- trunk/Source/WebCore/ChangeLog	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/Source/WebCore/ChangeLog	2021-12-14 10:13:54 UTC (rev 287018)
@@ -1,3 +1,46 @@
+2021-12-14  Antti Koivisto  <[email protected]>
+
+        [CSS Cascade Layers] revert-layer should revert style attribute to regular author style
+        https://bugs.webkit.org/show_bug.cgi?id=234082
+
+        Reviewed by Simon Fraser.
+
+        If 'revert-layer' keyword is used in style attribute it should revert to regular author style
+        on the default cascade level.
+
+        * style/PropertyCascade.cpp:
+        (WebCore::Style::PropertyCascade::PropertyCascade):
+
+        Make the maximum level (used for revert cascades) an std::optional.
+
+        (WebCore::Style::PropertyCascade::setPropertyInternal):
+        (WebCore::Style::PropertyCascade::addMatch):
+
+        Factor the revert test into a lambda.
+        We can never revert to an attribute style so always skip them.
+
+        * style/PropertyCascade.h:
+        (WebCore::Style::PropertyCascade::PropertyCascade):
+        (WebCore::Style::PropertyCascade::maximumCascadeLevel const): Deleted.
+        (WebCore::Style::PropertyCascade::maximumCascadeLayerPriority const): Deleted.
+        * style/RuleSet.h:
+        * style/StyleBuilder.cpp:
+        (WebCore::Style::Builder::applyCustomProperty):
+        (WebCore::Style::Builder::applyCascadeProperty):
+        (WebCore::Style::Builder::applyRollbackCascadeProperty):
+
+        Keep a pointer to the current property being applied in state instead of individual priority values.
+
+        (WebCore::Style::Builder::applyProperty):
+        (WebCore::Style::Builder::ensureRollbackCascadeForRevert):
+        (WebCore::Style::Builder::ensureRollbackCascadeForRevertLayer):
+
+        If the current property is from attribute style it reverts to the same layer.
+
+        * style/StyleBuilder.h:
+        * style/StyleBuilderState.h:
+        (WebCore::Style::BuilderState::styleScopeOrdinal const):
+
 2021-12-14  Youenn Fablet  <[email protected]>
 
         Null pointer crash in FetchResponse::clone

Modified: trunk/Source/WebCore/style/PropertyCascade.cpp (287017 => 287018)


--- trunk/Source/WebCore/style/PropertyCascade.cpp	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/Source/WebCore/style/PropertyCascade.cpp	2021-12-14 10:13:54 UTC (rev 287018)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "PropertyCascade.h"
 
+#include "CSSCustomPropertyValue.h"
 #include "CSSPaintImageValue.h"
 #include "CSSPrimitiveValueMappings.h"
 #include "CSSValuePool.h"
@@ -80,11 +81,11 @@
     buildCascade();
 }
 
-PropertyCascade::PropertyCascade(const PropertyCascade& parent, CascadeLevel maximumCascadeLevel, CascadeLayerPriority maximumCascadeLayerPriority)
+PropertyCascade::PropertyCascade(const PropertyCascade& parent, CascadeLevel maximumCascadeLevel, std::optional<CascadeLayerPriority> maximumCascadeLayerPriorityForRollback)
     : m_matchResult(parent.m_matchResult)
     , m_includedProperties(parent.m_includedProperties)
     , m_maximumCascadeLevel(maximumCascadeLevel)
-    , m_maximumCascadeLayerPriority(maximumCascadeLayerPriority)
+    , m_maximumCascadeLayerPriorityForRollback(maximumCascadeLayerPriorityForRollback)
     , m_direction(parent.direction())
     , m_directionIsUnresolved(false)
 {
@@ -116,9 +117,10 @@
 {
     ASSERT(matchedProperties.linkMatchType <= SelectorChecker::MatchAll);
     property.id = id;
-    property.level = cascadeLevel;
+    property.cascadeLevel = cascadeLevel;
     property.styleScopeOrdinal = matchedProperties.styleScopeOrdinal;
     property.cascadeLayerPriority = matchedProperties.cascadeLayerPriority;
+    property.fromStyleAttribute = matchedProperties.fromStyleAttribute;
 
     if (matchedProperties.linkMatchType == SelectorChecker::MatchAll) {
         property.cssValue[0] = &cssValue;
@@ -177,7 +179,18 @@
 
 bool PropertyCascade::addMatch(const MatchedProperties& matchedProperties, CascadeLevel cascadeLevel, bool important)
 {
-    if (matchedProperties.cascadeLayerPriority > m_maximumCascadeLayerPriority && cascadeLevel == m_maximumCascadeLevel && matchedProperties.styleScopeOrdinal == ScopeOrdinal::Element)
+    auto skipForRollback = [&] {
+        if (!m_maximumCascadeLayerPriorityForRollback)
+            return false;
+        if (matchedProperties.styleScopeOrdinal != ScopeOrdinal::Element)
+            return false;
+        if (cascadeLevel < m_maximumCascadeLevel)
+            return false;
+        if (matchedProperties.fromStyleAttribute == FromStyleAttribute::Yes)
+            return true;
+        return matchedProperties.cascadeLayerPriority > *m_maximumCascadeLayerPriorityForRollback;
+    };
+    if (skipForRollback())
         return false;
 
     auto& styleProperties = *matchedProperties.properties;

Modified: trunk/Source/WebCore/style/PropertyCascade.h (287017 => 287018)


--- trunk/Source/WebCore/style/PropertyCascade.h	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/Source/WebCore/style/PropertyCascade.h	2021-12-14 10:13:54 UTC (rev 287018)
@@ -27,7 +27,6 @@
 
 #include "CascadeLevel.h"
 #include "MatchResult.h"
-#include "StyleBuilderState.h"
 #include <bitset>
 
 namespace WebCore {
@@ -47,15 +46,16 @@
     };
 
     PropertyCascade(const MatchResult&, CascadeLevel, IncludedProperties, Direction);
-    PropertyCascade(const PropertyCascade&, CascadeLevel, CascadeLayerPriority maximumCascadeLayerPriority = RuleSet::cascadeLayerPriorityForUnlayered);
+    PropertyCascade(const PropertyCascade&, CascadeLevel, std::optional<CascadeLayerPriority> maximumCascadeLayerPriorityForRollback = { });
 
     ~PropertyCascade();
 
     struct Property {
         CSSPropertyID id;
-        CascadeLevel level;
+        CascadeLevel cascadeLevel;
         ScopeOrdinal styleScopeOrdinal;
         CascadeLayerPriority cascadeLayerPriority;
+        FromStyleAttribute fromStyleAttribute;
         CSSValue* cssValue[3]; // Values for link match states MatchDefault, MatchLink and MatchVisited
     };
 
@@ -70,9 +70,6 @@
 
     Direction direction() const;
 
-    auto maximumCascadeLevel() const { return m_maximumCascadeLevel; }
-    auto maximumCascadeLayerPriority() const { return m_maximumCascadeLayerPriority; }
-
 private:
     void buildCascade();
     bool addNormalMatches(CascadeLevel);
@@ -88,7 +85,7 @@
     const MatchResult& m_matchResult;
     const IncludedProperties m_includedProperties;
     const CascadeLevel m_maximumCascadeLevel;
-    const CascadeLayerPriority m_maximumCascadeLayerPriority { RuleSet::cascadeLayerPriorityForUnlayered };
+    const std::optional<CascadeLayerPriority> m_maximumCascadeLayerPriorityForRollback;
     mutable Direction m_direction;
     mutable bool m_directionIsUnresolved { true };
 

Modified: trunk/Source/WebCore/style/RuleSet.h (287017 => 287018)


--- trunk/Source/WebCore/style/RuleSet.h	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/Source/WebCore/style/RuleSet.h	2021-12-14 10:13:54 UTC (rev 287018)
@@ -106,6 +106,7 @@
     bool hasHostPseudoClassRulesMatchingInShadowTree() const { return m_hasHostPseudoClassRulesMatchingInShadowTree; }
 
     static constexpr auto cascadeLayerPriorityForUnlayered = std::numeric_limits<CascadeLayerPriority>::max();
+
     CascadeLayerPriority cascadeLayerPriorityFor(const RuleData&) const;
 
 private:

Modified: trunk/Source/WebCore/style/StyleBuilder.cpp (287017 => 287018)


--- trunk/Source/WebCore/style/StyleBuilder.cpp	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/Source/WebCore/style/StyleBuilder.cpp	2021-12-14 10:13:54 UTC (rev 287018)
@@ -180,6 +180,8 @@
     auto property = m_cascade.customProperty(name);
     bool inCycle = m_state.m_inProgressPropertiesCustom.contains(name);
 
+    SetForScope levelScope(m_state.m_currentProperty, &property);
+
     for (auto index : { SelectorChecker::MatchDefault, SelectorChecker::MatchLink, SelectorChecker::MatchVisited }) {
         if (!property.cssValue[index])
             continue;
@@ -233,9 +235,7 @@
 
 inline void Builder::applyCascadeProperty(const PropertyCascade::Property& property)
 {
-    m_state.m_cascadeLevel = property.level;
-    m_state.m_styleScopeOrdinal = property.styleScopeOrdinal;
-    m_state.m_cascadeLayerPriority = property.cascadeLayerPriority;
+    SetForScope levelScope(m_state.m_currentProperty, &property);
 
     auto applyWithLinkMatch = [&](SelectorChecker::LinkMatchMask linkMatch) {
         if (property.cssValue[linkMatch]) {
@@ -261,9 +261,7 @@
     if (!value)
         return;
 
-    SetForScope levelScope(m_state.m_cascadeLevel, property.level);
-    SetForScope scopeScope(m_state.m_styleScopeOrdinal, property.styleScopeOrdinal);
-    SetForScope layerScope(m_state.m_cascadeLayerPriority, property.cascadeLayerPriority);
+    SetForScope levelScope(m_state.m_currentProperty, &property);
 
     applyProperty(property.id, *value, linkMatchMask);
 }
@@ -302,9 +300,7 @@
     bool isRevertLayer = valueToApply->isRevertLayerValue() || customPropertyValueID == CSSValueRevertLayer;
 
     if (isRevert || isRevertLayer) {
-        auto* rollbackCascade = isRevert
-            ? ensureRollbackCascadeForRevert(m_state.m_cascadeLevel)
-            : ensureRollbackCascadeForRevertLayer(m_state.m_cascadeLevel, m_state.m_cascadeLayerPriority);
+        auto* rollbackCascade = isRevert ? ensureRollbackCascadeForRevert() : ensureRollbackCascadeForRevertLayer();
 
         if (rollbackCascade) {
             // With the rollback cascade built, we need to obtain the property and apply it. If the property is
@@ -379,29 +375,36 @@
     return CSSParser(m_state.document()).parseValueWithVariableReferences(propertyID, value, m_state);
 }
 
-const PropertyCascade* Builder::ensureRollbackCascadeForRevert(CascadeLevel rollbackCascadeLevel)
+const PropertyCascade* Builder::ensureRollbackCascadeForRevert()
 {
+    auto rollbackCascadeLevel = m_state.m_currentProperty->cascadeLevel;
     if (rollbackCascadeLevel == CascadeLevel::UserAgent)
         return nullptr;
 
     --rollbackCascadeLevel;
 
-    auto key = makeRollbackCascadeKey(rollbackCascadeLevel, RuleSet::cascadeLayerPriorityForUnlayered);
+    auto key = makeRollbackCascadeKey(rollbackCascadeLevel, 0);
     return m_rollbackCascades.ensure(key, [&] {
-        return makeUnique<const PropertyCascade>(m_cascade, rollbackCascadeLevel, RuleSet::cascadeLayerPriorityForUnlayered);
+        return makeUnique<const PropertyCascade>(m_cascade, rollbackCascadeLevel);
     }).iterator->value.get();
 }
 
-const PropertyCascade* Builder::ensureRollbackCascadeForRevertLayer(CascadeLevel cascadeLevel, CascadeLayerPriority rollbackLayerPriority)
+const PropertyCascade* Builder::ensureRollbackCascadeForRevertLayer()
 {
+    auto& property = *m_state.m_currentProperty;
+    auto rollbackLayerPriority = property.cascadeLayerPriority;
     if (!rollbackLayerPriority)
         return nullptr;
 
-    --rollbackLayerPriority;
+    ASSERT(property.fromStyleAttribute == FromStyleAttribute::No || property.cascadeLayerPriority == RuleSet::cascadeLayerPriorityForUnlayered);
 
-    auto key = makeRollbackCascadeKey(cascadeLevel, rollbackLayerPriority);
+    // Style attribute reverts to the regular author style.
+    if (property.fromStyleAttribute == FromStyleAttribute::No)
+        --rollbackLayerPriority;
+
+    auto key = makeRollbackCascadeKey(property.cascadeLevel, rollbackLayerPriority);
     return m_rollbackCascades.ensure(key, [&] {
-        return makeUnique<const PropertyCascade>(m_cascade, cascadeLevel, rollbackLayerPriority);
+        return makeUnique<const PropertyCascade>(m_cascade, property.cascadeLevel, rollbackLayerPriority);
     }).iterator->value.get();
 }
 

Modified: trunk/Source/WebCore/style/StyleBuilder.h (287017 => 287018)


--- trunk/Source/WebCore/style/StyleBuilder.h	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/Source/WebCore/style/StyleBuilder.h	2021-12-14 10:13:54 UTC (rev 287018)
@@ -62,8 +62,8 @@
     Ref<CSSValue> resolveValue(CSSPropertyID, CSSValue&);
     RefPtr<CSSValue> resolvedVariableValue(CSSPropertyID, const CSSValue&);
 
-    const PropertyCascade* ensureRollbackCascadeForRevert(CascadeLevel);
-    const PropertyCascade* ensureRollbackCascadeForRevertLayer(CascadeLevel, CascadeLayerPriority);
+    const PropertyCascade* ensureRollbackCascadeForRevert();
+    const PropertyCascade* ensureRollbackCascadeForRevertLayer();
 
     using RollbackCascadeKey = std::pair<unsigned, unsigned>;
     RollbackCascadeKey makeRollbackCascadeKey(CascadeLevel, CascadeLayerPriority);

Modified: trunk/Source/WebCore/style/StyleBuilderState.h (287017 => 287018)


--- trunk/Source/WebCore/style/StyleBuilderState.h	2021-12-14 09:35:38 UTC (rev 287017)
+++ trunk/Source/WebCore/style/StyleBuilderState.h	2021-12-14 10:13:54 UTC (rev 287018)
@@ -28,6 +28,7 @@
 #include "CSSToLengthConversionData.h"
 #include "CSSToStyleMap.h"
 #include "CascadeLevel.h"
+#include "PropertyCascade.h"
 #include "RenderStyle.h"
 #include "RuleSet.h"
 #include "SelectorChecker.h"
@@ -89,7 +90,7 @@
 
     bool useSVGZoomRules() const;
     bool useSVGZoomRulesForLength() const;
-    ScopeOrdinal styleScopeOrdinal() const { return m_styleScopeOrdinal; }
+    ScopeOrdinal styleScopeOrdinal() const { return m_currentProperty->styleScopeOrdinal; }
 
     Ref<CSSValue> resolveImageStyles(CSSValue&);
     RefPtr<StyleImage> createStyleImage(CSSValue&);
@@ -135,9 +136,7 @@
     Bitmap<numCSSProperties> m_inProgressProperties;
     HashSet<String> m_inProgressPropertiesCustom;
 
-    CascadeLevel m_cascadeLevel { CascadeLevel::Author };
-    ScopeOrdinal m_styleScopeOrdinal { };
-    CascadeLayerPriority m_cascadeLayerPriority { };
+    const PropertyCascade::Property* m_currentProperty { nullptr };
     SelectorChecker::LinkMatchMask m_linkMatch { };
 
     bool m_fontDirty { false };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to