Changeset 290257 in webkit


Ignore:
Timestamp:
Feb 21, 2022 11:48:07 AM (5 months ago)
Author:
Antti Koivisto
Message:

[CSS Container Queries] Support nested container queries
https://bugs.webkit.org/show_bug.cgi?id=236963

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

  • web-platform-tests/css/css-contain/container-queries/container-nested-expected.txt: Added.
  • web-platform-tests/css/css-contain/container-queries/container-nested.html: Added.

Source/WebCore:

"Style rules defined on an element inside multiple nested container queries apply when all of the wrapping container queries are true for that element."

https://drafts.csswg.org/css-contain-3/#container-rule

Test: imported/w3c/web-platform-tests/css/css-contain/container-queries/container-nested.html

  • style/ElementRuleCollector.cpp:

(WebCore::Style::ElementRuleCollector::collectMatchingRulesForList):
(WebCore::Style::ElementRuleCollector::containerQueriesMatch):

All nested queries need to match.

(WebCore::Style::ElementRuleCollector::containerQueryMatches): Deleted.

  • style/ElementRuleCollector.h:
  • style/RuleSet.h:

(WebCore::Style::RuleSet::hasContainerQueries const):
(WebCore::Style:: const):
(WebCore::Style::RuleSet::containerQueryFor const): Deleted.

Return all nested queries.
Don't unnecessarily copy FilteredContainerQuery, refer to the StyleRuleContainer instead.

  • style/RuleSetBuilder.cpp:

(WebCore::Style::RuleSetBuilder::addChildRules):

Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r290247 r290257  
     12022-02-21  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Container Queries] Support nested container queries
     4        https://bugs.webkit.org/show_bug.cgi?id=236963
     5
     6        Reviewed by Simon Fraser.
     7
     8        * web-platform-tests/css/css-contain/container-queries/container-nested-expected.txt: Added.
     9        * web-platform-tests/css/css-contain/container-queries/container-nested.html: Added.
     10
    1112022-02-21  Noam Rosenthal  <noam@webkit.org>
    212
  • trunk/Source/WebCore/ChangeLog

    r290254 r290257  
     12022-02-21  Antti Koivisto  <antti@apple.com>
     2
     3        [CSS Container Queries] Support nested container queries
     4        https://bugs.webkit.org/show_bug.cgi?id=236963
     5
     6        Reviewed by Simon Fraser.
     7
     8        "Style rules defined on an element inside multiple nested container queries apply when all of the wrapping container queries are true for that element."
     9
     10        https://drafts.csswg.org/css-contain-3/#container-rule
     11
     12        Test: imported/w3c/web-platform-tests/css/css-contain/container-queries/container-nested.html
     13
     14        * style/ElementRuleCollector.cpp:
     15        (WebCore::Style::ElementRuleCollector::collectMatchingRulesForList):
     16        (WebCore::Style::ElementRuleCollector::containerQueriesMatch):
     17
     18        All nested queries need to match.
     19
     20        (WebCore::Style::ElementRuleCollector::containerQueryMatches): Deleted.
     21        * style/ElementRuleCollector.h:
     22        * style/RuleSet.h:
     23        (WebCore::Style::RuleSet::hasContainerQueries const):
     24        (WebCore::Style:: const):
     25        (WebCore::Style::RuleSet::containerQueryFor const): Deleted.
     26
     27        Return all nested queries.
     28        Don't unnecessarily copy FilteredContainerQuery, refer to the StyleRuleContainer instead.
     29
     30        * style/RuleSetBuilder.cpp:
     31        (WebCore::Style::RuleSetBuilder::addChildRules):
     32
    1332022-02-21  Nikolas Zimmermann  <nzimmermann@igalia.com>
    234
  • trunk/Source/WebCore/style/ElementRuleCollector.cpp

    r290205 r290257  
    486486            continue;
    487487
    488         if (auto* containerQuery = matchRequest.ruleSet.containerQueryFor(ruleData)) {
    489             if (!containerQueryMatches(*containerQuery))
    490                 continue;
    491         }
     488        if (matchRequest.ruleSet.hasContainerQueries() && !containerQueriesMatch(matchRequest.ruleSet.containerQueriesFor(ruleData)))
     489            continue;
    492490
    493491        auto& rule = ruleData.styleRule();
     
    506504}
    507505
    508 bool ElementRuleCollector::containerQueryMatches(const FilteredContainerQuery& query)
    509 {
    510     ContainerQueryEvaluator evaluator(element(), m_pseudoElementRequest.pseudoId , m_selectorMatchingState);
    511     return evaluator.evaluate(query);
     506bool ElementRuleCollector::containerQueriesMatch(const Vector<const FilteredContainerQuery*>& queries)
     507{
     508    if (queries.isEmpty())
     509        return true;
     510
     511    // "Style rules defined on an element inside multiple nested container queries apply when all of the wrapping container queries are true for that element."
     512    ContainerQueryEvaluator evaluator(element(), m_pseudoElementRequest.pseudoId, m_selectorMatchingState);
     513    for (auto* query : queries) {
     514        if (!evaluator.evaluate(*query))
     515            return false;
     516    }
     517    return true;
    512518}
    513519
  • trunk/Source/WebCore/style/ElementRuleCollector.h

    r289706 r290257  
    113113    void collectMatchingRulesForList(const RuleSet::RuleDataVector*, const MatchRequest&);
    114114    bool ruleMatches(const RuleData&, unsigned& specificity, ScopeOrdinal);
    115     bool containerQueryMatches(const FilteredContainerQuery&);
     115    bool containerQueriesMatch(const Vector<const FilteredContainerQuery*>&);
    116116
    117117    void sortMatchedRules();
  • trunk/Source/WebCore/style/RuleSet.h

    r289706 r290257  
    109109
    110110    CascadeLayerPriority cascadeLayerPriorityFor(const RuleData&) const;
    111     const FilteredContainerQuery* containerQueryFor(const RuleData&) const;
     111
     112    bool hasContainerQueries() const { return !m_containerQueries.isEmpty(); }
     113    Vector<const FilteredContainerQuery*> containerQueriesFor(const RuleData&) const;
    112114
    113115private:
     
    145147
    146148    struct ContainerQueryAndParent {
    147         FilteredContainerQuery query;
     149        Ref<StyleRuleContainer> containerRule;
    148150        ContainerQueryIdentifier parent;
    149151    };
     
    222224}
    223225
    224 inline const FilteredContainerQuery* RuleSet::containerQueryFor(const RuleData& ruleData) const
     226inline Vector<const FilteredContainerQuery*> RuleSet::containerQueriesFor(const RuleData& ruleData) const
    225227{
    226228    if (m_containerQueryIdentifierForRulePosition.size() <= ruleData.position())
    227         return nullptr;
     229        return { };
     230
     231    Vector<const FilteredContainerQuery*> queries;
    228232
    229233    auto identifier = m_containerQueryIdentifierForRulePosition[ruleData.position()];
    230     if (!identifier)
    231         return nullptr;
    232 
    233     return &m_containerQueries[identifier - 1].query;
     234    while (identifier) {
     235        auto& query = m_containerQueries[identifier - 1];
     236        queries.append(&query.containerRule->filteredQuery());
     237        identifier = query.parent;
     238    };
     239
     240    return queries;
    234241}
    235242
  • trunk/Source/WebCore/style/RuleSetBuilder.cpp

    r289706 r290257  
    114114            auto previousContainerQueryIdentifier = m_currentContainerQueryIdentifier;
    115115            if (m_ruleSet) {
    116                 m_ruleSet->m_containerQueries.append({ containerRule.filteredQuery(), previousContainerQueryIdentifier });
     116                m_ruleSet->m_containerQueries.append({ containerRule, previousContainerQueryIdentifier });
    117117                m_currentContainerQueryIdentifier = m_ruleSet->m_containerQueries.size();
    118118            }
Note: See TracChangeset for help on using the changeset viewer.