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 };