Diff
Modified: trunk/Source/WTF/ChangeLog (286844 => 286845)
--- trunk/Source/WTF/ChangeLog 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WTF/ChangeLog 2021-12-10 13:28:28 UTC (rev 286845)
@@ -1,3 +1,14 @@
+2021-12-10 Antti Koivisto <an...@apple.com>
+
+ [CSS Container Queries] Basic @container at-rule parsing support
+ https://bugs.webkit.org/show_bug.cgi?id=234135
+
+ Reviewed by Antoine Quint.
+
+ * Scripts/Preferences/WebPreferencesExperimental.yaml:
+
+ Add preference for container queries, disabled by default.
+
2021-12-09 Alan Bujtas <za...@apple.com>
Enable the CSS Contain property by default
Modified: trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml (286844 => 286845)
--- trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml 2021-12-10 13:28:28 UTC (rev 286845)
@@ -224,6 +224,18 @@
WebCore:
default: false
+CSSContainerQueriesEnabled:
+ type: bool
+ humanReadableName: "CSS Container Queries"
+ humanReadableDescription: "Enable CSS Container Queries"
+ defaultValue:
+ WebKitLegacy:
+ default: false
+ WebKit:
+ default: false
+ WebCore:
+ default: false
+
CSSContainmentEnabled:
type: bool
humanReadableName: "CSS Containment"
Modified: trunk/Source/WebCore/ChangeLog (286844 => 286845)
--- trunk/Source/WebCore/ChangeLog 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/ChangeLog 2021-12-10 13:28:28 UTC (rev 286845)
@@ -1,3 +1,40 @@
+2021-12-10 Antti Koivisto <an...@apple.com>
+
+ [CSS Container Queries] Basic @container at-rule parsing support
+ https://bugs.webkit.org/show_bug.cgi?id=234135
+
+ Reviewed by Antoine Quint.
+
+ Implement basic support for parsing @container at-rules.
+ This patch doesn't yet parse the queries themselves.
+
+ Disabled by default.
+
+ * css/StyleRule.cpp:
+ (WebCore::StyleRuleBase::destroy):
+ (WebCore::StyleRuleBase::copy const):
+ (WebCore::StyleRuleBase::createCSSOMWrapper const):
+ (WebCore::StyleRuleContainer::StyleRuleContainer):
+ (WebCore::StyleRuleContainer::create):
+ * css/StyleRule.h:
+ (WebCore::StyleRuleBase::isContainerRule const):
+ (isType):
+ * css/StyleRuleType.h:
+ * css/StyleSheetContents.cpp:
+ (WebCore::traverseRulesInVector):
+ (WebCore::StyleSheetContents::traverseSubresources const):
+ * css/parser/CSSAtRuleID.cpp:
+ (WebCore::cssAtRuleID):
+ * css/parser/CSSAtRuleID.h:
+ * css/parser/CSSParserContext.cpp:
+ (WebCore::operator==):
+ (WebCore::add):
+ * css/parser/CSSParserContext.h:
+ * css/parser/CSSParserImpl.cpp:
+ (WebCore::CSSParserImpl::consumeAtRule):
+ (WebCore::CSSParserImpl::consumeContainerRule):
+ * css/parser/CSSParserImpl.h:
+
2021-12-10 Nikolas Zimmermann <nzimmerm...@igalia.com>
[LBSE] Handle RenderSVGRoot in all places that handle LegacyRenderSVGRoot
Modified: trunk/Source/WebCore/css/StyleRule.cpp (286844 => 286845)
--- trunk/Source/WebCore/css/StyleRule.cpp 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/StyleRule.cpp 2021-12-10 13:28:28 UTC (rev 286845)
@@ -104,6 +104,9 @@
case StyleRuleType::LayerStatement:
delete downcast<StyleRuleLayer>(this);
return;
+ case StyleRuleType::Container:
+ delete downcast<StyleRuleContainer>(this);
+ return;
case StyleRuleType::Unknown:
ASSERT_NOT_REACHED();
return;
@@ -133,6 +136,8 @@
case StyleRuleType::LayerBlock:
case StyleRuleType::LayerStatement:
return downcast<StyleRuleLayer>(*this).copy();
+ case StyleRuleType::Container:
+ return downcast<StyleRuleContainer>(*this).copy();
case StyleRuleType::Import:
case StyleRuleType::Namespace:
// FIXME: Copy import and namespace rules.
@@ -186,6 +191,9 @@
case StyleRuleType::LayerStatement:
rule = CSSLayerStatementRule::create(downcast<StyleRuleLayer>(self), parentSheet);
break;
+ case StyleRuleType::Container:
+ // FIXME: Implement CSSOM.
+ break;
case StyleRuleType::Unknown:
case StyleRuleType::Charset:
case StyleRuleType::Keyframe:
@@ -362,6 +370,8 @@
m_tokens.append(range.begin(), length);
}
+DeferredStyleGroupRuleList::~DeferredStyleGroupRuleList() = default;
+
void DeferredStyleGroupRuleList::parseDeferredRules(Vector<RefPtr<StyleRuleBase>>& childRules)
{
m_parser->parseRuleList(m_tokens, childRules);
@@ -523,6 +533,34 @@
return adoptRef(*new StyleRuleLayer(WTFMove(name), WTFMove(rules)));
}
+StyleRuleContainer::StyleRuleContainer(ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
+ : StyleRuleGroup(StyleRuleType::Container, WTFMove(rules))
+ , m_query(WTFMove(query))
+{
+}
+
+StyleRuleContainer::StyleRuleContainer(ContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
+ : StyleRuleGroup(StyleRuleType::Container, WTFMove(rules))
+ , m_query(WTFMove(query))
+{
+}
+
+StyleRuleContainer::StyleRuleContainer(const StyleRuleContainer& other)
+ : StyleRuleGroup(other)
+ , m_query(other.m_query)
+{
+}
+
+Ref<StyleRuleContainer> StyleRuleContainer::create(ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
+{
+ return adoptRef(*new StyleRuleContainer(WTFMove(query), WTFMove(rules)));
+}
+
+Ref<StyleRuleContainer> StyleRuleContainer::create(ContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
+{
+ return adoptRef(*new StyleRuleContainer(WTFMove(query), WTFMove(rules)));
+}
+
StyleRuleCharset::StyleRuleCharset()
: StyleRuleBase(StyleRuleType::Charset)
{
Modified: trunk/Source/WebCore/css/StyleRule.h (286844 => 286845)
--- trunk/Source/WebCore/css/StyleRule.h 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/StyleRule.h 2021-12-10 13:28:28 UTC (rev 286845)
@@ -60,10 +60,11 @@
bool isMediaRule() const { return type() == StyleRuleType::Media; }
bool isPageRule() const { return type() == StyleRuleType::Page; }
bool isStyleRule() const { return type() == StyleRuleType::Style; }
- bool isGroupRule() const { return type() == StyleRuleType::Media || type() == StyleRuleType::Supports || type() == StyleRuleType::LayerBlock; }
+ bool isGroupRule() const { return type() == StyleRuleType::Media || type() == StyleRuleType::Supports || type() == StyleRuleType::LayerBlock || type() == StyleRuleType::Container; }
bool isSupportsRule() const { return type() == StyleRuleType::Supports; }
bool isImportRule() const { return type() == StyleRuleType::Import; }
bool isLayerRule() const { return type() == StyleRuleType::LayerBlock || type() == StyleRuleType::LayerStatement; }
+ bool isContainerRule() const { return type() == StyleRuleType::Container; }
Ref<StyleRuleBase> copy() const;
@@ -228,6 +229,7 @@
WTF_MAKE_FAST_ALLOCATED;
public:
DeferredStyleGroupRuleList(const CSSParserTokenRange&, CSSDeferredParser&);
+ ~DeferredStyleGroupRuleList();
void parseDeferredRules(Vector<RefPtr<StyleRuleBase>>&);
void parseDeferredKeyframes(StyleRuleKeyframes&);
@@ -312,6 +314,24 @@
std::variant<CascadeLayerName, Vector<CascadeLayerName>> m_nameVariant;
};
+struct ContainerQuery { };
+
+class StyleRuleContainer final : public StyleRuleGroup {
+public:
+ static Ref<StyleRuleContainer> create(ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
+ static Ref<StyleRuleContainer> create(ContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
+ Ref<StyleRuleContainer> copy() const { return adoptRef(*new StyleRuleContainer(*this)); }
+
+ const ContainerQuery& query() const { return m_query; }
+
+private:
+ StyleRuleContainer(ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
+ StyleRuleContainer(ContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
+ StyleRuleContainer(const StyleRuleContainer&);
+
+ ContainerQuery m_query;
+};
+
// This is only used by the CSS parser.
class StyleRuleCharset final : public StyleRuleBase {
public:
@@ -435,3 +455,7 @@
SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::StyleRuleLayer)
static bool isType(const WebCore::StyleRuleBase& rule) { return rule.isLayerRule(); }
SPECIALIZE_TYPE_TRAITS_END()
+
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::StyleRuleContainer)
+ static bool isType(const WebCore::StyleRuleBase& rule) { return rule.isContainerRule(); }
+SPECIALIZE_TYPE_TRAITS_END()
Modified: trunk/Source/WebCore/css/StyleRuleType.h (286844 => 286845)
--- trunk/Source/WebCore/css/StyleRuleType.h 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/StyleRuleType.h 2021-12-10 13:28:28 UTC (rev 286845)
@@ -42,6 +42,7 @@
Supports = 12,
LayerBlock = 16,
LayerStatement = 17,
+ Container = 18,
FontPaletteValues = 19,
};
Modified: trunk/Source/WebCore/css/StyleSheetContents.cpp (286844 => 286845)
--- trunk/Source/WebCore/css/StyleSheetContents.cpp 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/StyleSheetContents.cpp 2021-12-10 13:28:28 UTC (rev 286845)
@@ -458,7 +458,8 @@
switch (rule->type()) {
case StyleRuleType::Media:
case StyleRuleType::Supports:
- case StyleRuleType::LayerBlock: {
+ case StyleRuleType::LayerBlock:
+ case StyleRuleType::Container: {
auto* childRules = downcast<StyleRuleGroup>(*rule).childRulesWithoutDeferredParsing();
if (childRules && traverseRulesInVector(*childRules, handler))
return true;
@@ -522,6 +523,7 @@
case StyleRuleType::Supports:
case StyleRuleType::LayerBlock:
case StyleRuleType::LayerStatement:
+ case StyleRuleType::Container:
case StyleRuleType::FontPaletteValues:
return false;
};
Modified: trunk/Source/WebCore/css/parser/CSSAtRuleID.cpp (286844 => 286845)
--- trunk/Source/WebCore/css/parser/CSSAtRuleID.cpp 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/parser/CSSAtRuleID.cpp 2021-12-10 13:28:28 UTC (rev 286845)
@@ -56,12 +56,12 @@
return CSSAtRuleViewport;
if (equalIgnoringASCIICase(name, "-webkit-keyframes"))
return CSSAtRuleWebkitKeyframes;
- if (equalIgnoringASCIICase(name, "apply"))
- return CSSAtRuleApply;
if (equalIgnoringASCIICase(name, "counter-style"))
return CSSAtRuleCounterStyle;
if (equalIgnoringASCIICase(name, "layer"))
return CSSAtRuleLayer;
+ if (equalIgnoringASCIICase(name, "container"))
+ return CSSAtRuleContainer;
return CSSAtRuleInvalid;
}
Modified: trunk/Source/WebCore/css/parser/CSSAtRuleID.h (286844 => 286845)
--- trunk/Source/WebCore/css/parser/CSSAtRuleID.h 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/parser/CSSAtRuleID.h 2021-12-10 13:28:28 UTC (rev 286845)
@@ -35,22 +35,22 @@
enum CSSAtRuleID {
CSSAtRuleInvalid = 0,
- CSSAtRuleCharset = 1,
- CSSAtRuleFontFace = 2,
- CSSAtRuleImport = 3,
- CSSAtRuleKeyframes = 4,
- CSSAtRuleMedia = 5,
- CSSAtRuleNamespace = 6,
- CSSAtRulePage = 7,
- CSSAtRuleSupports = 8,
- CSSAtRuleViewport = 9,
+ CSSAtRuleCharset,
+ CSSAtRuleFontFace,
+ CSSAtRuleImport,
+ CSSAtRuleKeyframes,
+ CSSAtRuleMedia,
+ CSSAtRuleNamespace,
+ CSSAtRulePage,
+ CSSAtRuleSupports,
+ CSSAtRuleViewport,
- CSSAtRuleWebkitKeyframes = 10,
- CSSAtRuleApply = 11,
- CSSAtRuleCounterStyle = 12,
- CSSAtRuleLayer = 13,
+ CSSAtRuleWebkitKeyframes,
+ CSSAtRuleCounterStyle,
+ CSSAtRuleLayer,
+ CSSAtRuleContainer,
- CSSAtRuleFontPaletteValues = 14,
+ CSSAtRuleFontPaletteValues,
};
CSSAtRuleID cssAtRuleID(StringView name);
Modified: trunk/Source/WebCore/css/parser/CSSParserContext.cpp (286844 => 286845)
--- trunk/Source/WebCore/css/parser/CSSParserContext.cpp 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/parser/CSSParserContext.cpp 2021-12-10 13:28:28 UTC (rev 286845)
@@ -105,6 +105,7 @@
, focusVisibleEnabled { document.settings().focusVisibleEnabled() }
, hasPseudoClassEnabled { document.settings().hasPseudoClassEnabled() }
, cascadeLayersEnabled { document.settings().cssCascadeLayersEnabled() }
+ , containerQueriesEnabled { document.settings().cssContainerQueriesEnabled() }
#if ENABLE(ATTACHMENT_ELEMENT)
, attachmentEnabled { RuntimeEnabledFeatures::sharedFeatures().attachmentElementEnabled() }
#endif
@@ -151,6 +152,7 @@
&& a.focusVisibleEnabled == b.focusVisibleEnabled
&& a.hasPseudoClassEnabled == b.hasPseudoClassEnabled
&& a.cascadeLayersEnabled == b.cascadeLayersEnabled
+ && a.containerQueriesEnabled == b.containerQueriesEnabled
#if ENABLE(ATTACHMENT_ELEMENT)
&& a.attachmentEnabled == b.attachmentEnabled
#endif
@@ -190,12 +192,13 @@
| context.focusVisibleEnabled << 21
| context.hasPseudoClassEnabled << 22
| context.cascadeLayersEnabled << 23
+ | context.containerQueriesEnabled << 24
#if ENABLE(ATTACHMENT_ELEMENT)
- | context.attachmentEnabled << 24
+ | context.attachmentEnabled << 25
#endif
- | context.overflowClipEnabled << 25
- | context.accentColorEnabled << 26
- | context.mode << 27; // This is multiple bits, so keep it last.
+ | context.overflowClipEnabled << 26
+ | context.accentColorEnabled << 27
+ | context.mode << 28; // This is multiple bits, so keep it last.
add(hasher, context.baseURL, context.charset, bits);
}
Modified: trunk/Source/WebCore/css/parser/CSSParserContext.h (286844 => 286845)
--- trunk/Source/WebCore/css/parser/CSSParserContext.h 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/parser/CSSParserContext.h 2021-12-10 13:28:28 UTC (rev 286845)
@@ -84,6 +84,7 @@
bool focusVisibleEnabled { false };
bool hasPseudoClassEnabled { false };
bool cascadeLayersEnabled { false };
+ bool containerQueriesEnabled { false };
// RuntimeEnabledFeatures.
#if ENABLE(ATTACHMENT_ELEMENT)
Modified: trunk/Source/WebCore/css/parser/CSSParserImpl.cpp (286844 => 286845)
--- trunk/Source/WebCore/css/parser/CSSParserImpl.cpp 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/parser/CSSParserImpl.cpp 2021-12-10 13:28:28 UTC (rev 286845)
@@ -465,6 +465,8 @@
return consumeCounterStyleRule(prelude, block);
case CSSAtRuleLayer:
return consumeLayerRule(prelude, block);
+ case CSSAtRuleContainer:
+ return consumeContainerRule(prelude, block);
default:
return nullptr; // Parse error, unrecognised at-rule with block
}
@@ -855,17 +857,32 @@
return StyleRuleLayer::createBlock(WTFMove(*name), WTFMove(rules));
}
-// FIXME-NEWPARSER: Support "apply"
-/*void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude)
+RefPtr<StyleRuleContainer> CSSParserImpl::consumeContainerRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
{
- const CSSParserToken& ident = prelude.consumeIncludingWhitespace();
- if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident))
- return; // Parse error, expected a single custom property name
- m_parsedProperties.append(CSSProperty(
- CSSPropertyApplyAtRule,
- *CSSCustomIdentValue::create(ident.value().toString())));
+ if (!m_context.containerQueriesEnabled)
+ return nullptr;
+
+ if (m_deferredParser)
+ return StyleRuleContainer::create({ }, makeUnique<DeferredStyleGroupRuleList>(block, *m_deferredParser));
+
+ Vector<RefPtr<StyleRuleBase>> rules;
+
+ if (m_observerWrapper) {
+ m_observerWrapper->observer().startRuleHeader(StyleRuleType::Container, m_observerWrapper->startOffset(prelude));
+ m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset(prelude));
+ m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(block));
+ }
+
+ consumeRuleList(block, RegularRuleList, [&rules](RefPtr<StyleRuleBase> rule) {
+ rules.append(rule);
+ });
+ rules.shrinkToFit();
+
+ if (m_observerWrapper)
+ m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(block));
+
+ return StyleRuleContainer::create({ }, WTFMove(rules));
}
-*/
RefPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
{
Modified: trunk/Source/WebCore/css/parser/CSSParserImpl.h (286844 => 286845)
--- trunk/Source/WebCore/css/parser/CSSParserImpl.h 2021-12-10 12:23:49 UTC (rev 286844)
+++ trunk/Source/WebCore/css/parser/CSSParserImpl.h 2021-12-10 13:28:28 UTC (rev 286845)
@@ -140,10 +140,8 @@
RefPtr<StyleRulePage> consumePageRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
RefPtr<StyleRuleCounterStyle> consumeCounterStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
RefPtr<StyleRuleLayer> consumeLayerRule(CSSParserTokenRange prelude, std::optional<CSSParserTokenRange> block);
+ RefPtr<StyleRuleContainer> consumeContainerRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
- // FIXME-NEWPARSER: Support "apply"
- // void consumeApplyRule(CSSParserTokenRange prelude);
-
RefPtr<StyleRuleKeyframe> consumeKeyframeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
RefPtr<StyleRule> consumeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);