Title: [286845] trunk/Source
Revision
286845
Author
an...@apple.com
Date
2021-12-10 05:28:28 -0800 (Fri, 10 Dec 2021)

Log Message

[CSS Container Queries] Basic @container at-rule parsing support
https://bugs.webkit.org/show_bug.cgi?id=234135

Reviewed by Antoine Quint.

Source/WebCore:

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:

Source/WTF:

* Scripts/Preferences/WebPreferencesExperimental.yaml:

Add preference for container queries, disabled by default.

Modified Paths

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);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to