⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286845 in webkit


Ignore:
Timestamp:
Dec 10, 2021, 5:28:28 AM (5 years ago)
Author:
Antti Koivisto
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.

Location:
trunk/Source
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r286828 r286845  
     12021-12-10  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Container Queries] Basic @container at-rule parsing support
     4        https://bugs.webkit.org/show_bug.cgi?id=234135
     5
     6        Reviewed by Antoine Quint.
     7
     8        * Scripts/Preferences/WebPreferencesExperimental.yaml:
     9
     10        Add preference for container queries, disabled by default.
     11
    1122021-12-09  Alan Bujtas  <zalan@apple.com>
    213
  • trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml

    r286828 r286845  
    225225      default: false
    226226
     227CSSContainerQueriesEnabled:
     228  type: bool
     229  humanReadableName: "CSS Container Queries"
     230  humanReadableDescription: "Enable CSS Container Queries"
     231  defaultValue:
     232    WebKitLegacy:
     233      default: false
     234    WebKit:
     235      default: false
     236    WebCore:
     237      default: false
     238
    227239CSSContainmentEnabled:
    228240  type: bool
  • trunk/Source/WebCore/ChangeLog

    r286843 r286845  
     12021-12-10  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Container Queries] Basic @container at-rule parsing support
     4        https://bugs.webkit.org/show_bug.cgi?id=234135
     5
     6        Reviewed by Antoine Quint.
     7
     8        Implement basic support for parsing @container at-rules.
     9        This patch doesn't yet parse the queries themselves.
     10
     11        Disabled by default.
     12
     13        * css/StyleRule.cpp:
     14        (WebCore::StyleRuleBase::destroy):
     15        (WebCore::StyleRuleBase::copy const):
     16        (WebCore::StyleRuleBase::createCSSOMWrapper const):
     17        (WebCore::StyleRuleContainer::StyleRuleContainer):
     18        (WebCore::StyleRuleContainer::create):
     19        * css/StyleRule.h:
     20        (WebCore::StyleRuleBase::isContainerRule const):
     21        (isType):
     22        * css/StyleRuleType.h:
     23        * css/StyleSheetContents.cpp:
     24        (WebCore::traverseRulesInVector):
     25        (WebCore::StyleSheetContents::traverseSubresources const):
     26        * css/parser/CSSAtRuleID.cpp:
     27        (WebCore::cssAtRuleID):
     28        * css/parser/CSSAtRuleID.h:
     29        * css/parser/CSSParserContext.cpp:
     30        (WebCore::operator==):
     31        (WebCore::add):
     32        * css/parser/CSSParserContext.h:
     33        * css/parser/CSSParserImpl.cpp:
     34        (WebCore::CSSParserImpl::consumeAtRule):
     35        (WebCore::CSSParserImpl::consumeContainerRule):
     36        * css/parser/CSSParserImpl.h:
     37
    1382021-12-10  Nikolas Zimmermann  <nzimmermann@igalia.com>
    239
  • trunk/Source/WebCore/css/StyleRule.cpp

    r286657 r286845  
    105105        delete downcast<StyleRuleLayer>(this);
    106106        return;
     107    case StyleRuleType::Container:
     108        delete downcast<StyleRuleContainer>(this);
     109        return;
    107110    case StyleRuleType::Unknown:
    108111        ASSERT_NOT_REACHED();
     
    134137    case StyleRuleType::LayerStatement:
    135138        return downcast<StyleRuleLayer>(*this).copy();
     139    case StyleRuleType::Container:
     140        return downcast<StyleRuleContainer>(*this).copy();
    136141    case StyleRuleType::Import:
    137142    case StyleRuleType::Namespace:
     
    186191    case StyleRuleType::LayerStatement:
    187192        rule = CSSLayerStatementRule::create(downcast<StyleRuleLayer>(self), parentSheet);
     193        break;
     194    case StyleRuleType::Container:
     195        // FIXME: Implement CSSOM.
    188196        break;
    189197    case StyleRuleType::Unknown:
     
    363371}
    364372
     373DeferredStyleGroupRuleList::~DeferredStyleGroupRuleList() = default;
     374
    365375void DeferredStyleGroupRuleList::parseDeferredRules(Vector<RefPtr<StyleRuleBase>>& childRules)
    366376{
     
    524534}
    525535
     536StyleRuleContainer::StyleRuleContainer(ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
     537    : StyleRuleGroup(StyleRuleType::Container, WTFMove(rules))
     538    , m_query(WTFMove(query))
     539{
     540}
     541
     542StyleRuleContainer::StyleRuleContainer(ContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
     543    : StyleRuleGroup(StyleRuleType::Container, WTFMove(rules))
     544    , m_query(WTFMove(query))
     545{
     546}
     547
     548StyleRuleContainer::StyleRuleContainer(const StyleRuleContainer& other)
     549    : StyleRuleGroup(other)
     550    , m_query(other.m_query)
     551{
     552}
     553
     554Ref<StyleRuleContainer> StyleRuleContainer::create(ContainerQuery&& query, Vector<RefPtr<StyleRuleBase>>&& rules)
     555{
     556    return adoptRef(*new StyleRuleContainer(WTFMove(query), WTFMove(rules)));
     557}
     558
     559Ref<StyleRuleContainer> StyleRuleContainer::create(ContainerQuery&& query, std::unique_ptr<DeferredStyleGroupRuleList>&& rules)
     560{
     561    return adoptRef(*new StyleRuleContainer(WTFMove(query), WTFMove(rules)));
     562}
     563
    526564StyleRuleCharset::StyleRuleCharset()
    527565    : StyleRuleBase(StyleRuleType::Charset)
  • trunk/Source/WebCore/css/StyleRule.h

    r286657 r286845  
    6161    bool isPageRule() const { return type() == StyleRuleType::Page; }
    6262    bool isStyleRule() const { return type() == StyleRuleType::Style; }
    63     bool isGroupRule() const { return type() == StyleRuleType::Media || type() == StyleRuleType::Supports || type() == StyleRuleType::LayerBlock; }
     63    bool isGroupRule() const { return type() == StyleRuleType::Media || type() == StyleRuleType::Supports || type() == StyleRuleType::LayerBlock || type() == StyleRuleType::Container; }
    6464    bool isSupportsRule() const { return type() == StyleRuleType::Supports; }
    6565    bool isImportRule() const { return type() == StyleRuleType::Import; }
    6666    bool isLayerRule() const { return type() == StyleRuleType::LayerBlock || type() == StyleRuleType::LayerStatement; }
     67    bool isContainerRule() const { return type() == StyleRuleType::Container; }
    6768
    6869    Ref<StyleRuleBase> copy() const;
     
    229230public:
    230231    DeferredStyleGroupRuleList(const CSSParserTokenRange&, CSSDeferredParser&);
     232    ~DeferredStyleGroupRuleList();
    231233   
    232234    void parseDeferredRules(Vector<RefPtr<StyleRuleBase>>&);
     
    313315};
    314316
     317struct ContainerQuery { };
     318
     319class StyleRuleContainer final : public StyleRuleGroup {
     320public:
     321    static Ref<StyleRuleContainer> create(ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
     322    static Ref<StyleRuleContainer> create(ContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
     323    Ref<StyleRuleContainer> copy() const { return adoptRef(*new StyleRuleContainer(*this)); }
     324
     325    const ContainerQuery& query() const { return m_query; }
     326
     327private:
     328    StyleRuleContainer(ContainerQuery&&, Vector<RefPtr<StyleRuleBase>>&&);
     329    StyleRuleContainer(ContainerQuery&&, std::unique_ptr<DeferredStyleGroupRuleList>&&);
     330    StyleRuleContainer(const StyleRuleContainer&);
     331
     332    ContainerQuery m_query;
     333};
     334
    315335// This is only used by the CSS parser.
    316336class StyleRuleCharset final : public StyleRuleBase {
     
    436456    static bool isType(const WebCore::StyleRuleBase& rule) { return rule.isLayerRule(); }
    437457SPECIALIZE_TYPE_TRAITS_END()
     458
     459SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::StyleRuleContainer)
     460    static bool isType(const WebCore::StyleRuleBase& rule) { return rule.isContainerRule(); }
     461SPECIALIZE_TYPE_TRAITS_END()
  • trunk/Source/WebCore/css/StyleRuleType.h

    r286657 r286845  
    4343    LayerBlock = 16,
    4444    LayerStatement = 17,
     45    Container = 18,
    4546    FontPaletteValues = 19,
    4647};
  • trunk/Source/WebCore/css/StyleSheetContents.cpp

    r286657 r286845  
    459459        case StyleRuleType::Media:
    460460        case StyleRuleType::Supports:
    461         case StyleRuleType::LayerBlock: {
     461        case StyleRuleType::LayerBlock:
     462        case StyleRuleType::Container: {
    462463            auto* childRules = downcast<StyleRuleGroup>(*rule).childRulesWithoutDeferredParsing();
    463464            if (childRules && traverseRulesInVector(*childRules, handler))
     
    523524        case StyleRuleType::LayerBlock:
    524525        case StyleRuleType::LayerStatement:
     526        case StyleRuleType::Container:
    525527        case StyleRuleType::FontPaletteValues:
    526528            return false;
  • trunk/Source/WebCore/css/parser/CSSAtRuleID.cpp

    r282806 r286845  
    5757    if (equalIgnoringASCIICase(name, "-webkit-keyframes"))
    5858        return CSSAtRuleWebkitKeyframes;
    59     if (equalIgnoringASCIICase(name, "apply"))
    60         return CSSAtRuleApply;
    6159    if (equalIgnoringASCIICase(name, "counter-style"))
    6260        return CSSAtRuleCounterStyle;
    6361    if (equalIgnoringASCIICase(name, "layer"))
    6462        return CSSAtRuleLayer;
     63    if (equalIgnoringASCIICase(name, "container"))
     64        return CSSAtRuleContainer;
    6565    return CSSAtRuleInvalid;
    6666}
  • trunk/Source/WebCore/css/parser/CSSAtRuleID.h

    r282806 r286845  
    3636    CSSAtRuleInvalid = 0,
    3737
    38     CSSAtRuleCharset = 1,
    39     CSSAtRuleFontFace = 2,
    40     CSSAtRuleImport = 3,
    41     CSSAtRuleKeyframes = 4,
    42     CSSAtRuleMedia = 5,
    43     CSSAtRuleNamespace = 6,
    44     CSSAtRulePage = 7,
    45     CSSAtRuleSupports = 8,
    46     CSSAtRuleViewport = 9,
     38    CSSAtRuleCharset,
     39    CSSAtRuleFontFace,
     40    CSSAtRuleImport,
     41    CSSAtRuleKeyframes,
     42    CSSAtRuleMedia,
     43    CSSAtRuleNamespace,
     44    CSSAtRulePage,
     45    CSSAtRuleSupports,
     46    CSSAtRuleViewport,
    4747
    48     CSSAtRuleWebkitKeyframes = 10,
    49     CSSAtRuleApply = 11,
    50     CSSAtRuleCounterStyle = 12,
    51     CSSAtRuleLayer = 13,
     48    CSSAtRuleWebkitKeyframes,
     49    CSSAtRuleCounterStyle,
     50    CSSAtRuleLayer,
     51    CSSAtRuleContainer,
    5252
    53     CSSAtRuleFontPaletteValues = 14,
     53    CSSAtRuleFontPaletteValues,
    5454};
    5555
  • trunk/Source/WebCore/css/parser/CSSParserContext.cpp

    r286775 r286845  
    106106    , hasPseudoClassEnabled { document.settings().hasPseudoClassEnabled() }
    107107    , cascadeLayersEnabled { document.settings().cssCascadeLayersEnabled() }
     108    , containerQueriesEnabled { document.settings().cssContainerQueriesEnabled() }
    108109#if ENABLE(ATTACHMENT_ELEMENT)
    109110    , attachmentEnabled { RuntimeEnabledFeatures::sharedFeatures().attachmentElementEnabled() }
     
    152153        && a.hasPseudoClassEnabled == b.hasPseudoClassEnabled
    153154        && a.cascadeLayersEnabled == b.cascadeLayersEnabled
     155        && a.containerQueriesEnabled == b.containerQueriesEnabled
    154156#if ENABLE(ATTACHMENT_ELEMENT)
    155157        && a.attachmentEnabled == b.attachmentEnabled
     
    191193        | context.hasPseudoClassEnabled                     << 22
    192194        | context.cascadeLayersEnabled                      << 23
     195        | context.containerQueriesEnabled                   << 24
    193196#if ENABLE(ATTACHMENT_ELEMENT)
    194         | context.attachmentEnabled                         << 24
    195 #endif
    196         | context.overflowClipEnabled                       << 25
    197         | context.accentColorEnabled                        << 26
    198         | context.mode                                      << 27; // This is multiple bits, so keep it last.
     197        | context.attachmentEnabled                         << 25
     198#endif
     199        | context.overflowClipEnabled                       << 26
     200        | context.accentColorEnabled                        << 27
     201        | context.mode                                      << 28; // This is multiple bits, so keep it last.
    199202    add(hasher, context.baseURL, context.charset, bits);
    200203}
  • trunk/Source/WebCore/css/parser/CSSParserContext.h

    r286772 r286845  
    8585    bool hasPseudoClassEnabled { false };
    8686    bool cascadeLayersEnabled { false };
     87    bool containerQueriesEnabled { false };
    8788
    8889    // RuntimeEnabledFeatures.
  • trunk/Source/WebCore/css/parser/CSSParserImpl.cpp

    r286668 r286845  
    466466    case CSSAtRuleLayer:
    467467        return consumeLayerRule(prelude, block);
     468    case CSSAtRuleContainer:
     469        return consumeContainerRule(prelude, block);
    468470    default:
    469471        return nullptr; // Parse error, unrecognised at-rule with block
     
    856858}
    857859
    858 // FIXME-NEWPARSER: Support "apply"
    859 /*void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude)
    860 {
    861     const CSSParserToken& ident = prelude.consumeIncludingWhitespace();
    862     if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident))
    863         return; // Parse error, expected a single custom property name
    864     m_parsedProperties.append(CSSProperty(
    865         CSSPropertyApplyAtRule,
    866         *CSSCustomIdentValue::create(ident.value().toString())));
    867 }
    868 */
     860RefPtr<StyleRuleContainer> CSSParserImpl::consumeContainerRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
     861{
     862    if (!m_context.containerQueriesEnabled)
     863        return nullptr;
     864
     865    if (m_deferredParser)
     866        return StyleRuleContainer::create({ }, makeUnique<DeferredStyleGroupRuleList>(block, *m_deferredParser));
     867
     868    Vector<RefPtr<StyleRuleBase>> rules;
     869
     870    if (m_observerWrapper) {
     871        m_observerWrapper->observer().startRuleHeader(StyleRuleType::Container, m_observerWrapper->startOffset(prelude));
     872        m_observerWrapper->observer().endRuleHeader(m_observerWrapper->endOffset(prelude));
     873        m_observerWrapper->observer().startRuleBody(m_observerWrapper->previousTokenStartOffset(block));
     874    }
     875
     876    consumeRuleList(block, RegularRuleList, [&rules](RefPtr<StyleRuleBase> rule) {
     877        rules.append(rule);
     878    });
     879    rules.shrinkToFit();
     880
     881    if (m_observerWrapper)
     882        m_observerWrapper->observer().endRuleBody(m_observerWrapper->endOffset(block));
     883
     884    return StyleRuleContainer::create({ }, WTFMove(rules));
     885}
    869886   
    870887RefPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
  • trunk/Source/WebCore/css/parser/CSSParserImpl.h

    r283120 r286845  
    141141    RefPtr<StyleRuleCounterStyle> consumeCounterStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
    142142    RefPtr<StyleRuleLayer> consumeLayerRule(CSSParserTokenRange prelude, std::optional<CSSParserTokenRange> block);
    143 
    144     // FIXME-NEWPARSER: Support "apply"
    145     // void consumeApplyRule(CSSParserTokenRange prelude);
     143    RefPtr<StyleRuleContainer> consumeContainerRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
    146144
    147145    RefPtr<StyleRuleKeyframe> consumeKeyframeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block);
Note: See TracChangeset for help on using the changeset viewer.