Changeset 290257 in webkit
- Timestamp:
- Feb 21, 2022 11:48:07 AM (5 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 6 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-nested-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-nested.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/style/ElementRuleCollector.cpp (modified) (2 diffs)
-
Source/WebCore/style/ElementRuleCollector.h (modified) (1 diff)
-
Source/WebCore/style/RuleSet.h (modified) (3 diffs)
-
Source/WebCore/style/RuleSetBuilder.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r290247 r290257 1 2022-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 1 11 2022-02-21 Noam Rosenthal <noam@webkit.org> 2 12 -
trunk/Source/WebCore/ChangeLog
r290254 r290257 1 2022-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 1 33 2022-02-21 Nikolas Zimmermann <nzimmermann@igalia.com> 2 34 -
trunk/Source/WebCore/style/ElementRuleCollector.cpp
r290205 r290257 486 486 continue; 487 487 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; 492 490 493 491 auto& rule = ruleData.styleRule(); … … 506 504 } 507 505 508 bool ElementRuleCollector::containerQueryMatches(const FilteredContainerQuery& query) 509 { 510 ContainerQueryEvaluator evaluator(element(), m_pseudoElementRequest.pseudoId , m_selectorMatchingState); 511 return evaluator.evaluate(query); 506 bool 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; 512 518 } 513 519 -
trunk/Source/WebCore/style/ElementRuleCollector.h
r289706 r290257 113 113 void collectMatchingRulesForList(const RuleSet::RuleDataVector*, const MatchRequest&); 114 114 bool ruleMatches(const RuleData&, unsigned& specificity, ScopeOrdinal); 115 bool containerQuer yMatches(const FilteredContainerQuery&);115 bool containerQueriesMatch(const Vector<const FilteredContainerQuery*>&); 116 116 117 117 void sortMatchedRules(); -
trunk/Source/WebCore/style/RuleSet.h
r289706 r290257 109 109 110 110 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; 112 114 113 115 private: … … 145 147 146 148 struct ContainerQueryAndParent { 147 FilteredContainerQuery query;149 Ref<StyleRuleContainer> containerRule; 148 150 ContainerQueryIdentifier parent; 149 151 }; … … 222 224 } 223 225 224 inline const FilteredContainerQuery* RuleSet::containerQueryFor(const RuleData& ruleData) const226 inline Vector<const FilteredContainerQuery*> RuleSet::containerQueriesFor(const RuleData& ruleData) const 225 227 { 226 228 if (m_containerQueryIdentifierForRulePosition.size() <= ruleData.position()) 227 return nullptr; 229 return { }; 230 231 Vector<const FilteredContainerQuery*> queries; 228 232 229 233 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; 234 241 } 235 242 -
trunk/Source/WebCore/style/RuleSetBuilder.cpp
r289706 r290257 114 114 auto previousContainerQueryIdentifier = m_currentContainerQueryIdentifier; 115 115 if (m_ruleSet) { 116 m_ruleSet->m_containerQueries.append({ containerRule .filteredQuery(), previousContainerQueryIdentifier });116 m_ruleSet->m_containerQueries.append({ containerRule, previousContainerQueryIdentifier }); 117 117 m_currentContainerQueryIdentifier = m_ruleSet->m_containerQueries.size(); 118 118 }
Note: See TracChangeset
for help on using the changeset viewer.