Changeset 290205 in webkit
- Timestamp:
- Feb 19, 2022 6:05:53 AM (5 months ago)
- Location:
- trunk
- Files:
-
- 15 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/backdrop-invalidation-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-none-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/pseudo-elements-001-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/pseudo-elements-003.tentative-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-dialog-container-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp (modified) (1 diff)
-
Source/WebCore/style/ContainerQueryEvaluator.cpp (modified) (12 diffs)
-
Source/WebCore/style/ContainerQueryEvaluator.h (modified) (4 diffs)
-
Source/WebCore/style/ElementRuleCollector.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r290201 r290205 1 2022-02-19 Antti Koivisto <antti@apple.com> 2 3 [CSS Container Queries] Match container queries correctly in non-rendered subtrees 4 https://bugs.webkit.org/show_bug.cgi?id=236840 5 6 Reviewed by Dean Jackson. 7 8 * web-platform-tests/css/css-contain/container-queries/backdrop-invalidation-expected.txt: 9 * web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt: 10 * web-platform-tests/css/css-contain/container-queries/display-none-expected.txt: 11 * web-platform-tests/css/css-contain/container-queries/pseudo-elements-001-expected.txt: 12 * web-platform-tests/css/css-contain/container-queries/pseudo-elements-003.tentative-expected.txt: 13 * web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt: 14 * web-platform-tests/css/css-contain/container-queries/top-layer-dialog-container-expected.txt: 15 * web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt: 16 * web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt: 17 1 18 2022-02-19 Antoine Quint <graouts@webkit.org> 2 19 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/backdrop-invalidation-expected.txt
r288786 r290205 1 1 2 FAIL Pseudo-element ::backdrop responds to container size changes assert_equals: expected "rgb(0, 0, 0)" but got "rgb(0, 128, 0)"2 FAIL Pseudo-element ::backdrop responds to container size changes assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)" 3 3 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt
r289222 r290205 1 1 2 FAIL getComputedStyle when container is display:contents assert_equals: expected "" but got "50" 3 FAIL getComputedStyle when container becomes display:contents assert_equals: expected "" but got "50" 4 FAIL getComputedStyle when intermediate container becomes display:contents assert_equals: expected "" but got "50" 2 PASS getComputedStyle when container is display:contents 3 PASS getComputedStyle when container becomes display:contents 4 PASS getComputedStyle when intermediate container becomes display:contents 5 5 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-none-expected.txt
r289222 r290205 1 1 2 FAIL getComputedStyle when element is display:none assert_equals: expected "30" but got "50" 3 FAIL getComputedStyle when parent is display:none assert_equals: expected "30" but got "50" 4 FAIL getComputedStyle when ancestor is display:none assert_equals: expected "30" but got "50" 5 FAIL getComputedStyle when container is display:none assert_equals: expected "" but got "50" 6 FAIL getComputedStyle when element in nested container is display:none assert_equals: expected "30" but got "50" 7 FAIL getComputedStyle when inner container is display:none assert_equals: expected "" but got "50" 8 FAIL getComputedStyle when intermediate ancestor is display:none assert_equals: expected "" but got "50" 9 FAIL getComputedStyle when outer container is display:none assert_equals: expected "" but got "50" 10 FAIL getComputedStyle when element becomes display:none assert_equals: expected "30" but got "50" 11 FAIL getComputedStyle when parent becomes display:none assert_equals: expected "30" but got "50" 12 FAIL getComputedStyle when ancestor becomes display:none assert_equals: expected "30" but got "50" 13 FAIL getComputedStyle when container becomes display:none assert_equals: expected "" but got "50" 14 FAIL getComputedStyle when intermediate container becomes display:none assert_equals: expected "" but got "50" 2 PASS getComputedStyle when element is display:none 3 PASS getComputedStyle when parent is display:none 4 PASS getComputedStyle when ancestor is display:none 5 PASS getComputedStyle when container is display:none 6 PASS getComputedStyle when element in nested container is display:none 7 PASS getComputedStyle when inner container is display:none 8 PASS getComputedStyle when intermediate ancestor is display:none 9 PASS getComputedStyle when outer container is display:none 10 PASS getComputedStyle when element becomes display:none 11 PASS getComputedStyle when parent becomes display:none 12 PASS getComputedStyle when ancestor becomes display:none 13 PASS getComputedStyle when container becomes display:none 14 PASS getComputedStyle when intermediate container becomes display:none 15 15 PASS getComputedStyle when ::before is display:none 16 FAIL getComputedStyle when originating element is display:none assert_equals: expected "30" but got "50" 17 FAIL getComputedStyle on ::before when ancestor element is display:none assert_equals: expected "30" but got "50" 18 FAIL getComputedStyle on ::before when container is display:none assert_equals: expected "" but got "50" 16 PASS getComputedStyle when originating element is display:none 17 PASS getComputedStyle on ::before when ancestor element is display:none 18 PASS getComputedStyle on ::before when container is display:none 19 19 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/pseudo-elements-001-expected.txt
r288786 r290205 2 2 One 3 3 4 FAIL Pseudo-elements ::before and ::after respond to container size changes assert_equals: expected " none" but got "\"before\""5 FAIL Pseudo-element ::marker responds to container size changes assert_equals: expected "rgb(0, 0, 0)" but got "rgb(0, 128, 0)" 4 FAIL Pseudo-elements ::before and ::after respond to container size changes assert_equals: expected "\"before\"" but got "none" 5 PASS Pseudo-element ::marker responds to container size changes 6 6 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/pseudo-elements-003.tentative-expected.txt
r288786 r290205 9 9 PASS Originating element container for outer ::first-line 10 10 PASS Originating element container for outer ::first-letter 11 FAIL Originating element container for ::backdrop assert_equals: ::backdrop not rendered expected "rgb(0, 255, 0)" but got "rgb(0, 128, 0)" 11 PASS Originating element container for ::backdrop 12 12 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt
r289222 r290205 1 1 2 2 PASS Check that container queries is supported 3 FAIL (min-width: 0) does not match a container without a principal box (display:none) assert_equals: expected "rgb(0, 0, 0)" but got "rgb(255, 0, 0)" 3 PASS (min-width: 0) does not match a container without a principal box (display:none) 4 4 PASS (min-width: 0) does not match a container without a principal box (display:contents) 5 5 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-dialog-container-expected.txt
r288786 r290205 1 1 2 FAIL #dialog initially sized by #containing-block assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)" 2 PASS #dialog initially sized by #containing-block 3 3 PASS #dialog sized by viewport 4 4 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt
r289222 r290205 1 1 2 FAIL #container initially wider than 200px assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 255, 0)" 3 FAIL #container changed to 200px assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 255, 0)" 2 PASS #container initially wider than 200px 3 PASS #container changed to 200px 4 4 PASS Modal dialog still has parent as query container while in top layer 5 5 PASS Container changes width while dialog is in top layer -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt
r289222 r290205 1 1 2 FAIL Dialogs initially not matching for container queries assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 255, 0)" 2 PASS Dialogs initially not matching for container queries 3 3 PASS Dialogs still not matching after showModal 4 4 PASS @container queries start matching -
trunk/Source/WebCore/ChangeLog
r290204 r290205 1 2022-02-19 Antti Koivisto <antti@apple.com> 2 3 [CSS Container Queries] Match container queries correctly in non-rendered subtrees 4 https://bugs.webkit.org/show_bug.cgi?id=236840 5 6 Reviewed by Dean Jackson. 7 8 "If the query container does not have a principal box ... then the result of evaluating the size feature is unknown." 9 10 https://drafts.csswg.org/css-contain-3/#size-container 11 12 * rendering/updating/RenderTreeBuilderFirstLetter.cpp: 13 (WebCore::styleForFirstLetter): 14 15 Remove the assert, this issue is tested by marked-as-failure 16 imported/w3c/web-platform-tests/css/css-contain/container-queries/pseudo-elements-002.tentative.html 17 18 * style/ContainerQueryEvaluator.cpp: 19 (WebCore::Style::ContainerQueryEvaluator::ContainerQueryEvaluator): 20 (WebCore::Style::ContainerQueryEvaluator::evaluate const): 21 (WebCore::Style::ContainerQueryEvaluator::resolveContainer const): 22 23 Factor into a function. 24 If we don't have selector matching state (like we do during style resolution) then look up containers from DOM. 25 An element without a renderer may still be a valid container (size queries againt it evaluate to unknown). 26 27 (WebCore::Style::ContainerQueryEvaluator::evaluateSizeFeature const): 28 * style/ContainerQueryEvaluator.h: 29 * style/ElementRuleCollector.cpp: 30 (WebCore::Style::ElementRuleCollector::containerQueryMatches): 31 32 Evaluate to unknown if we don't have a principal box. 33 1 34 2022-02-19 Alan Bujtas <zalan@apple.com> 2 35 -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderFirstLetter.cpp
r288942 r290205 42 42 { 43 43 auto* containerFirstLetterStyle = firstLetterBlock.getCachedPseudoStyle(PseudoId::FirstLetter, &firstLetterContainer.firstLineStyle()); 44 // FIXME: There appears to be some path where we have a first letter renderer without first letter style. 45 ASSERT(containerFirstLetterStyle); 44 // FIXME: first-letter style needs to be computed eagerly. 46 45 auto firstLetterStyle = RenderStyle::clone(containerFirstLetterStyle ? *containerFirstLetterStyle : firstLetterContainer.firstLineStyle()); 47 46 -
trunk/Source/WebCore/style/ContainerQueryEvaluator.cpp
r290037 r290205 29 29 #include "CSSToLengthConversionData.h" 30 30 #include "CSSValueList.h" 31 #include "ComposedTreeAncestorIterator.h" 31 32 #include "Document.h" 32 33 #include "MediaFeatureNames.h" … … 39 40 40 41 struct ContainerQueryEvaluator::ResolvedContainer { 41 const RenderBox & renderer;42 const RenderBox* renderer { nullptr }; 42 43 CSSToLengthConversionData conversionData; 43 44 }; 44 45 45 ContainerQueryEvaluator::ContainerQueryEvaluator(const Vector<Ref<const Element>>& containers) 46 : m_containers(containers) 46 ContainerQueryEvaluator::ContainerQueryEvaluator(const Element& element, PseudoId pseudoId, SelectorMatchingState* selectorMatchingState) 47 : m_element(element) 48 , m_pseudoId(pseudoId) 49 , m_selectorMatchingState(selectorMatchingState) 47 50 { 48 51 } … … 50 53 bool ContainerQueryEvaluator::evaluate(const FilteredContainerQuery& filteredContainerQuery) const 51 54 { 52 if (m_containers.isEmpty()) 53 return false; 54 55 auto makeResolvedContainer = [&](const RenderBox& renderer) -> ResolvedContainer { 56 auto& view = renderer.view(); 57 return { 58 renderer, 59 CSSToLengthConversionData { &renderer.style(), &view.style(), nullptr, &view, 1 } 60 }; 61 }; 62 63 auto resolveContainer = [&]() -> std::optional<ResolvedContainer> { 64 for (auto& container : makeReversedRange(m_containers)) { 65 auto* renderer = dynamicDowncast<RenderBox>(container->renderer()); 66 if (!renderer) 67 return { }; 68 if (filteredContainerQuery.nameFilter.isEmpty()) 69 return makeResolvedContainer(*renderer); 70 // FIXME: Support type filter. 71 if (renderer->style().containerNames().contains(filteredContainerQuery.nameFilter)) 72 return makeResolvedContainer(*renderer); 73 } 74 return { }; 75 }; 76 77 auto container = resolveContainer(); 55 auto container = resolveContainer(filteredContainerQuery); 78 56 if (!container) 79 57 return false; … … 81 59 return evaluateQuery(filteredContainerQuery.query, *container) == EvaluationResult::True; 82 60 } 61 62 auto ContainerQueryEvaluator::resolveContainer(const FilteredContainerQuery& filteredContainerQuery) const -> std::optional<ResolvedContainer> 63 { 64 auto makeResolvedContainer = [](const Element& element) -> ResolvedContainer { 65 auto* renderer = dynamicDowncast<RenderBox>(element.renderer()); 66 if (!renderer) 67 return { }; 68 auto& view = renderer->view(); 69 return ResolvedContainer { 70 renderer, 71 CSSToLengthConversionData { &renderer->style(), &view.style(), nullptr, &view, 1 } 72 }; 73 }; 74 75 auto isContainerForQuery = [&](const Element& element) { 76 auto* style = element.existingComputedStyle(); 77 if (!style) 78 return false; 79 if (style->containerType() == ContainerType::None) 80 return false; 81 if (filteredContainerQuery.nameFilter.isEmpty()) 82 return true; 83 return style->containerNames().contains(filteredContainerQuery.nameFilter); 84 }; 85 86 if (m_selectorMatchingState) { 87 for (auto& container : makeReversedRange(m_selectorMatchingState->queryContainers)) { 88 if (isContainerForQuery(container)) 89 return makeResolvedContainer(container); 90 } 91 return { }; 92 } 93 94 if (m_pseudoId != PseudoId::None) { 95 if (isContainerForQuery(m_element)) 96 return makeResolvedContainer(m_element); 97 } 98 99 for (auto& ancestor : composedTreeAncestors(const_cast<Element&>(m_element.get()))) { 100 if (isContainerForQuery(ancestor)) 101 return makeResolvedContainer(ancestor); 102 } 103 return { }; 104 } 105 83 106 84 107 auto ContainerQueryEvaluator::evaluateQuery(const CQ::ContainerQuery& containerQuery, const ResolvedContainer& container) const -> EvaluationResult … … 155 178 auto ContainerQueryEvaluator::evaluateSizeFeature(const CQ::SizeFeature& sizeFeature, const ResolvedContainer& container) const -> EvaluationResult 156 179 { 180 // "If the query container does not have a principal box ... then the result of evaluating the size feature is unknown." 181 // https://drafts.csswg.org/css-contain-3/#size-container 182 if (!container.renderer) 183 return EvaluationResult::Unknown; 184 185 auto& renderer = *container.renderer; 186 157 187 auto compare = [](CQ::ComparisonOperator op, auto left, auto right) { 158 188 switch (op) { … … 220 250 enum class Axis : uint8_t { Both, Block, Inline, Width, Height }; 221 251 auto containerSupportsRequiredAxis = [&](Axis axis) { 222 switch ( container.renderer.style().containerType()) {252 switch (renderer.style().containerType()) { 223 253 case ContainerType::Size: 224 254 return true; 225 255 case ContainerType::InlineSize: 226 256 if (axis == Axis::Width) 227 return container.renderer.isHorizontalWritingMode();257 return renderer.isHorizontalWritingMode(); 228 258 if (axis == Axis::Height) 229 return ! container.renderer.isHorizontalWritingMode();259 return !renderer.isHorizontalWritingMode(); 230 260 return axis == Axis::Inline; 231 261 case ContainerType::None: … … 239 269 return EvaluationResult::Unknown; 240 270 241 return evaluateSize( container.renderer.contentWidth());271 return evaluateSize(renderer.contentWidth()); 242 272 } 243 273 … … 246 276 return EvaluationResult::Unknown; 247 277 248 return evaluateSize( container.renderer.contentHeight());278 return evaluateSize(renderer.contentHeight()); 249 279 } 250 280 … … 253 283 return EvaluationResult::Unknown; 254 284 255 return evaluateSize( container.renderer.contentLogicalWidth());285 return evaluateSize(renderer.contentLogicalWidth()); 256 286 } 257 287 … … 260 290 return EvaluationResult::Unknown; 261 291 262 return evaluateSize( container.renderer.contentLogicalHeight());292 return evaluateSize(renderer.contentLogicalHeight()); 263 293 } 264 294 … … 267 297 return EvaluationResult::Unknown; 268 298 269 auto boxRatio = container.renderer.contentWidth().toDouble() / container.renderer.contentHeight().toDouble();299 auto boxRatio = renderer.contentWidth().toDouble() / renderer.contentHeight().toDouble(); 270 300 271 301 if (!sizeFeature.leftComparison && !sizeFeature.rightComparison) … … 292 322 auto& value = downcast<CSSPrimitiveValue>(*sizeFeature.rightComparison->value); 293 323 294 bool isPortrait = container.renderer.contentHeight() >= container.renderer.contentWidth();324 bool isPortrait = renderer.contentHeight() >= renderer.contentWidth(); 295 325 if (value.valueID() == CSSValuePortrait) 296 326 return toEvaluationResult(isPortrait); -
trunk/Source/WebCore/style/ContainerQueryEvaluator.h
r290037 r290205 26 26 27 27 #include "ContainerQuery.h" 28 #include "SelectorMatchingState.h" 28 29 #include <wtf/Ref.h> 29 30 … … 38 39 class ContainerQueryEvaluator { 39 40 public: 40 ContainerQueryEvaluator(const Vector<Ref<const Element>>& containers);41 ContainerQueryEvaluator(const Element&, PseudoId, SelectorMatchingState*); 41 42 42 43 bool evaluate(const FilteredContainerQuery&) const; … … 44 45 private: 45 46 struct ResolvedContainer; 47 std::optional<ResolvedContainer> resolveContainer(const FilteredContainerQuery&) const; 46 48 47 49 EvaluationResult evaluateQuery(const CQ::ContainerQuery&, const ResolvedContainer&) const; … … 50 52 EvaluationResult evaluateSizeFeature(const CQ::SizeFeature&, const ResolvedContainer&) const; 51 53 52 const Vector<Ref<const Element>>& m_containers; 54 const Ref<const Element> m_element; 55 const PseudoId m_pseudoId; 56 SelectorMatchingState* m_selectorMatchingState; 53 57 }; 54 58 -
trunk/Source/WebCore/style/ElementRuleCollector.cpp
r289706 r290205 508 508 bool ElementRuleCollector::containerQueryMatches(const FilteredContainerQuery& query) 509 509 { 510 if (!m_selectorMatchingState) 511 return true; 512 513 ContainerQueryEvaluator evaluator(m_selectorMatchingState->queryContainers); 510 ContainerQueryEvaluator evaluator(element(), m_pseudoElementRequest.pseudoId , m_selectorMatchingState); 514 511 return evaluator.evaluate(query); 515 512 }
Note: See TracChangeset
for help on using the changeset viewer.