Title: [289222] trunk
Revision
289222
Author
[email protected]
Date
2022-02-07 08:21:48 -0800 (Mon, 07 Feb 2022)

Log Message

[CSS Container Queries] Add ContainerQueryEvaluator
https://bugs.webkit.org/show_bug.cgi?id=236096

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-contain/container-queries/animation-container-type-dynamic-expected.txt:
* web-platform-tests/css/css-contain/container-queries/animation-nested-animation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/animation-nested-transition-expected.txt:
* web-platform-tests/css/css-contain/container-queries/aspect-ratio-feature-evaluation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt:
* web-platform-tests/css/css-contain/container-queries/auto-scrollbars-expected.txt:
* web-platform-tests/css/css-contain/container-queries/container-for-shadow-dom.tentative-expected.txt:
* web-platform-tests/css/css-contain/container-queries/container-name-invalidation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/container-selection-expected.txt:
* web-platform-tests/css/css-contain/container-queries/container-size-invalidation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/container-type-invalidation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt:
* web-platform-tests/css/css-contain/container-queries/display-none-expected.txt:
* web-platform-tests/css/css-contain/container-queries/font-relative-units-dynamic-expected.txt:
* web-platform-tests/css/css-contain/container-queries/font-relative-units-expected.txt:
* web-platform-tests/css/css-contain/container-queries/get-animations-expected.txt:
* web-platform-tests/css/css-contain/container-queries/iframe-invalidation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/inline-size-containment-expected.txt:
* web-platform-tests/css/css-contain/container-queries/inline-size-containment-vertical-rl-expected.txt:
* web-platform-tests/css/css-contain/container-queries/orthogonal-wm-container-query-expected.txt:
* web-platform-tests/css/css-contain/container-queries/percentage-padding-orthogonal-expected.txt:
* web-platform-tests/css/css-contain/container-queries/query-content-box-expected.txt:
* web-platform-tests/css/css-contain/container-queries/query-evaluation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/reattach-container-with-dirty-child-expected.txt:
* web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt:
* web-platform-tests/css/css-contain/container-queries/size-feature-evaluation-expected.txt:
* web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt:
* web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt:
* web-platform-tests/css/css-contain/container-queries/transition-scrollbars-expected.txt:
* web-platform-tests/css/css-contain/container-queries/unsupported-axis-expected.txt:
* web-platform-tests/css/css-contain/container-queries/viewport-units-expected.txt:

Source/WebCore:

Add ContainerQueryEvaluator. Initially it evaluates simple min/max-width/height queries.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* style/ContainerQueryEvaluator.h: Added.
* style/ContainerQueryEvaluator.cpp: Added.
(WebCore::Style::ContainerQueryEvaluator::ContainerQueryEvaluator):
(WebCore::Style::computeLength):
(WebCore::Style::ContainerQueryEvaluator::evaluate const):
* style/ElementRuleCollector.cpp:
(WebCore::Style::ElementRuleCollector::containerQueryMatches):

Start to actually evaluate container queries.

LayoutTests:

* TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (289221 => 289222)


--- trunk/LayoutTests/ChangeLog	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/ChangeLog	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,3 +1,12 @@
+2022-02-07  Antti Koivisto  <[email protected]>
+
+        [CSS Container Queries] Add ContainerQueryEvaluator
+        https://bugs.webkit.org/show_bug.cgi?id=236096
+
+        Reviewed by Darin Adler.
+
+        * TestExpectations:
+
 2022-02-07  Antoine Quint  <[email protected]>
 
         [Web Animations] Starting a transform animation with a 1ms delay doesn't run it accelerated

Modified: trunk/LayoutTests/TestExpectations (289221 => 289222)


--- trunk/LayoutTests/TestExpectations	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/TestExpectations	2022-02-07 16:21:48 UTC (rev 289222)
@@ -4703,8 +4703,7 @@
 # Container queries
 webkit.org/b/229659 imported/w3c/web-platform-tests/css/css-contain/container-queries/display-in-container.html [ ImageOnlyFailure ]
 webkit.org/b/229659 imported/w3c/web-platform-tests/css/css-contain/container-queries/pseudo-elements-002.tentative.html [ ImageOnlyFailure ]
-webkit.org/b/229659 imported/w3c/web-platform-tests/css/css-contain/container-queries/inline-size-bfc-floats.html [ ImageOnlyFailure ]
-webkit.org/b/229659 imported/w3c/web-platform-tests/css/css-contain/container-queries/whitespace-update-after-removal.html [ ImageOnlyFailure ]
+webkit.org/b/229659 imported/w3c/web-platform-tests/css/css-contain/container-queries/multicol-inside-container.html [ ImageOnlyFailure ]
 
 # Flaky css-contain test
 imported/w3c/web-platform-tests/css/css-contain/content-visibility/animation-display-lock.html [ Failure Pass ]

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,3 +1,42 @@
+2022-02-07  Antti Koivisto  <[email protected]>
+
+        [CSS Container Queries] Add ContainerQueryEvaluator
+        https://bugs.webkit.org/show_bug.cgi?id=236096
+
+        Reviewed by Darin Adler.
+
+        * web-platform-tests/css/css-contain/container-queries/animation-container-type-dynamic-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/animation-nested-animation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/animation-nested-transition-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/aspect-ratio-feature-evaluation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/auto-scrollbars-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/container-for-shadow-dom.tentative-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/container-name-invalidation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/container-selection-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/container-size-invalidation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/container-type-invalidation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/display-none-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/font-relative-units-dynamic-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/font-relative-units-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/get-animations-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/iframe-invalidation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/inline-size-containment-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/inline-size-containment-vertical-rl-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/orthogonal-wm-container-query-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/percentage-padding-orthogonal-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/query-content-box-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/query-evaluation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/reattach-container-with-dirty-child-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/size-feature-evaluation-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/transition-scrollbars-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/unsupported-axis-expected.txt:
+        * web-platform-tests/css/css-contain/container-queries/viewport-units-expected.txt:
+
 2022-02-07  Antoine Quint  <[email protected]>
 
         [css-logical] [web-animations] Add support for logical properties in JS-originated animations

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-container-type-dynamic-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-container-type-dynamic-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-container-type-dynamic-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 Test
 
-FAIL Animated container creating new container assert_equals: expected "rgb(0, 0, 255)" but got "rgb(0, 128, 0)"
+FAIL Animated container creating new container assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 255)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-nested-animation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-nested-animation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-nested-animation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 Test
 
-FAIL Animated container can create inner animation assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 255)"
+FAIL Animated container can create inner animation assert_equals: expected "rgb(0, 0, 255)" but got "rgb(0, 128, 0)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-nested-transition-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-nested-transition-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/animation-nested-transition-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 Test
 
-FAIL Animated container size triggers transition assert_equals: expected "rgb(100, 100, 100)" but got "rgb(200, 200, 200)"
+FAIL Animated container size triggers transition assert_equals: expected "rgb(150, 150, 150)" but got "rgb(100, 100, 100)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/aspect-ratio-feature-evaluation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/aspect-ratio-feature-evaluation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/aspect-ratio-feature-evaluation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 
-FAIL @container queries with aspect-ratio and size containment assert_equals: Should not match for inline-size containment expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
-PASS @container query with aspect-ratio change after resize
+FAIL @container queries with aspect-ratio and size containment assert_equals: Should match for block-size containment expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+FAIL @container query with aspect-ratio change after resize assert_equals: Should match 2/1 min-ratio expected "rgb(0, 255, 0)" but got "rgba(0, 0, 0, 0)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/at-container-parsing-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,38 +1,38 @@
 
-PASS size(width)
-PASS size(min-width: 0px)
-PASS size(max-width: 0px)
-PASS size(height)
-PASS size(min-height: 0px)
-PASS size(max-height: 0px)
-PASS size(aspect-ratio)
-PASS size(min-aspect-ratio: 1/2)
-PASS size(max-aspect-ratio: 1/2)
-PASS size(orientation: portrait)
-PASS size(inline-size)
-PASS size(min-inline-size: 0px)
-PASS size(max-inline-size: 0px)
-PASS size(block-size)
-PASS size(min-block-size: 0px)
-PASS size(max-block-size: 0px)
-PASS size(width: 100px)
-PASS size((width: 100px))
-PASS size(not (width: 100px))
-PASS size((width: 100px) and (height: 100px))
-PASS size((width: 50px) or (height: 100px))
-PASS size(width < 100px)
-PASS size(100px < width)
-PASS size(100px < width < 200px)
-FAIL foo(width) assert_equals: expected "" but got "true"
-FAIL size(asdf) assert_equals: expected "" but got "true"
-FAIL size(resolution > 100dpi) assert_equals: expected "" but got "true"
-FAIL size(resolution: 150dpi) assert_equals: expected "" but got "true"
-FAIL size(color) assert_equals: expected "" but got "true"
-FAIL size(min-color: 1) assert_equals: expected "" but got "true"
-FAIL size(color-index >= 1) assert_equals: expected "" but got "true"
-FAIL (color-index >= 1) assert_equals: expected "" but got "true"
-FAIL size(grid) assert_equals: expected "" but got "true"
-FAIL (grid) assert_equals: expected "" but got "true"
+FAIL size(width) assert_equals: expected "true" but got ""
+FAIL size(min-width: 0px) assert_equals: expected "true" but got ""
+FAIL size(max-width: 0px) assert_equals: expected "true" but got ""
+FAIL size(height) assert_equals: expected "true" but got ""
+FAIL size(min-height: 0px) assert_equals: expected "true" but got ""
+FAIL size(max-height: 0px) assert_equals: expected "true" but got ""
+FAIL size(aspect-ratio) assert_equals: expected "true" but got ""
+FAIL size(min-aspect-ratio: 1/2) assert_equals: expected "true" but got ""
+FAIL size(max-aspect-ratio: 1/2) assert_equals: expected "true" but got ""
+FAIL size(orientation: portrait) assert_equals: expected "true" but got ""
+FAIL size(inline-size) assert_equals: expected "true" but got ""
+FAIL size(min-inline-size: 0px) assert_equals: expected "true" but got ""
+FAIL size(max-inline-size: 0px) assert_equals: expected "true" but got ""
+FAIL size(block-size) assert_equals: expected "true" but got ""
+FAIL size(min-block-size: 0px) assert_equals: expected "true" but got ""
+FAIL size(max-block-size: 0px) assert_equals: expected "true" but got ""
+FAIL size(width: 100px) assert_equals: expected "true" but got ""
+FAIL size((width: 100px)) assert_equals: expected "true" but got ""
+FAIL size(not (width: 100px)) assert_equals: expected "true" but got ""
+FAIL size((width: 100px) and (height: 100px)) assert_equals: expected "true" but got ""
+FAIL size((width: 50px) or (height: 100px)) assert_equals: expected "true" but got ""
+FAIL size(width < 100px) assert_equals: expected "true" but got ""
+FAIL size(100px < width) assert_equals: expected "true" but got ""
+FAIL size(100px < width < 200px) assert_equals: expected "true" but got ""
+PASS foo(width)
+PASS size(asdf)
+PASS size(resolution > 100dpi)
+PASS size(resolution: 150dpi)
+PASS size(color)
+PASS size(min-color: 1)
+PASS size(color-index >= 1)
+PASS (color-index >= 1)
+PASS size(grid)
+PASS (grid)
 PASS screen
 PASS print
 PASS not print

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/auto-scrollbars-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/auto-scrollbars-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/auto-scrollbars-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 
-FAIL Initial layout - expecting a scrollbar without overflowing content instead of overflowing content without a scrollbar assert_less_than: Expects a vertical scrollbar expected a number less than 100 but got 100
+FAIL Initial layout - expecting a scrollbar without overflowing content instead of overflowing content without a scrollbar assert_equals: Layout with a scrollbar means the container query applies expected "50px" but got "100px"
 FAIL Same result after a reflow assert_less_than: Expects a vertical scrollbar expected a number less than 100 but got 100
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-for-shadow-dom.tentative-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-for-shadow-dom.tentative-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-for-shadow-dom.tentative-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,6 +1,6 @@
 
 FAIL Match container in outer tree null is not an object (evaluating 'document.querySelector("#inclusive-ancestor-across-root > div").shadowRoot.querySelector')
-PASS Match container in same tree, not walking flat tree ancestors
+FAIL Match container in same tree, not walking flat tree ancestors assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
 FAIL Match container in ::slotted selector's originating element tree assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
 FAIL Match container in outer tree for :host assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
 FAIL Match container in ::part selector's originating element tree null is not an object (evaluating 'document.querySelector("#inclusive-ancestor-part > div").shadowRoot.querySelector')

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-name-invalidation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-name-invalidation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-name-invalidation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,5 +1,5 @@
 Test
 
-FAIL Changing a named container invalidates relevant descendants assert_equals: expected "rgb(0, 0, 0)" but got "rgb(0, 128, 0)"
-FAIL Changing container-name invalidates relevant descendants assert_equals: expected "rgb(0, 0, 0)" but got "rgb(0, 128, 0)"
+FAIL Changing a named container invalidates relevant descendants assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
+FAIL Changing container-name invalidates relevant descendants assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-selection-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-selection-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-selection-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -3,25 +3,25 @@
 PASS size(height: 16px) for .inline > .size > span
 PASS size(width: 16px) for .inline > .size > span
 FAIL size(height) for .size > .inline > span assert_equals: expected "" but got "true"
-PASS type(inline-size) size(width: 16px) for .inline > .size > span
-PASS type(inline-size) size(width: 16px) for .size > .inline > span
-PASS type(size) size(height: 16px) for .inline > .size > span
-PASS type(size) size(height: 32px) for .size > .inline > span
-FAIL type(size) size(height) for .inline > .inline > span assert_equals: expected "" but got "true"
-PASS name(a) size(width: 32px) for .a-size > .b-size > span
-PASS name(b) size(width: 16px) for .a-size > .b-size > span
-FAIL name(c) size(width) for .a-size > .b-size > span assert_equals: expected "" but got "true"
-PASS name(a) size(width: 16px) for .a-size > .a-size > span
-PASS a size(width: 32px) for .a-size > .b-size > span
+FAIL type(inline-size) size(width: 16px) for .inline > .size > span assert_equals: expected "true" but got ""
+FAIL type(inline-size) size(width: 16px) for .size > .inline > span assert_equals: expected "true" but got ""
+FAIL type(size) size(height: 16px) for .inline > .size > span assert_equals: expected "true" but got ""
+FAIL type(size) size(height: 32px) for .size > .inline > span assert_equals: expected "true" but got ""
+PASS type(size) size(height) for .inline > .inline > span
+FAIL name(a) size(width: 32px) for .a-size > .b-size > span assert_equals: expected "true" but got ""
+FAIL name(b) size(width: 16px) for .a-size > .b-size > span assert_equals: expected "true" but got ""
+PASS name(c) size(width) for .a-size > .b-size > span
+FAIL name(a) size(width: 16px) for .a-size > .a-size > span assert_equals: expected "true" but got ""
+FAIL a size(width: 32px) for .a-size > .b-size > span assert_equals: expected "true" but got ""
 PASS b size(width: 16px) for .a-size > .b-size > span
 FAIL c size(width) for .a-size > .b-size > span assert_equals: expected "" but got "true"
 PASS a size(width: 16px) for .a-size > .a-size > span
 PASS a size(width: 32px) for .a-size > .a > span
-PASS name(a) type(inline-size) size(width: 8px) for .a-size > .b-size > .a-inline > span
-PASS name(b) type(inline-size) size(width: 16px) for .a-size > .b-size > .a-inline > span
-PASS name(a) type(size) size(width: 32px) for .a-size > .b-size > .a-inline > span
-PASS name(b) type(size) size(width: 16px) for .a-size > .b-size > .a-inline > span
+FAIL name(a) type(inline-size) size(width: 8px) for .a-size > .b-size > .a-inline > span assert_equals: expected "true" but got ""
+FAIL name(b) type(inline-size) size(width: 16px) for .a-size > .b-size > .a-inline > span assert_equals: expected "true" but got ""
+FAIL name(a) type(size) size(width: 32px) for .a-size > .b-size > .a-inline > span assert_equals: expected "true" but got ""
+FAIL name(b) type(size) size(width: 16px) for .a-size > .b-size > .a-inline > span assert_equals: expected "true" but got ""
 PASS name(a) type(size) size(width) for .a-inline > .b-size
-PASS type(inline-size) name(a) size(width: 8px) for .a-size > .b-size > .a-inline > span
-PASS type(size) name(a) size(height: 32px) for .a-size > .b-size > .a-inline > span
+FAIL type(inline-size) name(a) size(width: 8px) for .a-size > .b-size > .a-inline > span assert_equals: expected "true" but got ""
+FAIL type(size) name(a) size(height: 32px) for .a-size > .b-size > .a-inline > span assert_equals: expected "true" but got ""
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-size-invalidation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-size-invalidation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-size-invalidation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -2,6 +2,6 @@
 Deep
 
 
-FAIL Children respond to changes in container size assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
-FAIL Descendants respond to changes in container size assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
+PASS Children respond to changes in container size
+PASS Descendants respond to changes in container size
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-type-invalidation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-type-invalidation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/container-type-invalidation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 Test
 
-FAIL Changing the container type invalidates relevant descendants assert_equals: expected "rgb(0, 0, 0)" but got "rgb(0, 128, 0)"
+FAIL Changing the container type invalidates relevant descendants assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-contents-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,5 +1,5 @@
 
 FAIL getComputedStyle when container is display:contents assert_equals: expected "" but got "50"
-FAIL getComputedStyle when container becomes display:contents assert_equals: expected "30" but got "50"
-FAIL getComputedStyle when intermediate container becomes display:contents assert_equals: expected "30" but got "50"
+FAIL getComputedStyle when container becomes display:contents assert_equals: expected "" but got "50"
+FAIL getComputedStyle when intermediate container becomes display:contents assert_equals: expected "" but got "50"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-none-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-none-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/display-none-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -10,9 +10,9 @@
 FAIL getComputedStyle when element becomes display:none assert_equals: expected "30" but got "50"
 FAIL getComputedStyle when parent becomes display:none assert_equals: expected "30" but got "50"
 FAIL getComputedStyle when ancestor becomes display:none assert_equals: expected "30" but got "50"
-FAIL getComputedStyle when container becomes display:none assert_equals: expected "30" but got "50"
-FAIL getComputedStyle when intermediate container becomes display:none assert_equals: expected "30" but got "50"
-FAIL getComputedStyle when ::before is display:none assert_equals: expected "30" but got "50"
+FAIL getComputedStyle when container becomes display:none assert_equals: expected "" but got "50"
+FAIL getComputedStyle when intermediate container becomes display:none assert_equals: expected "" but got "50"
+PASS getComputedStyle when ::before is display:none
 FAIL getComputedStyle when originating element is display:none assert_equals: expected "30" but got "50"
 FAIL getComputedStyle on ::before when ancestor element is display:none assert_equals: expected "30" but got "50"
 FAIL getComputedStyle on ::before when container is display:none assert_equals: expected "" but got "50"

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/font-relative-units-dynamic-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/font-relative-units-dynamic-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/font-relative-units-dynamic-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,10 +1,10 @@
 
-FAIL em relative before change assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
-FAIL rem relative before change assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
-FAIL ex relative before change assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
-FAIL ch relative before change assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
+PASS em relative before change
+PASS rem relative before change
+PASS ex relative before change
+PASS ch relative before change
 PASS em relative after change
-PASS rem relative after change
+FAIL rem relative after change assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
 PASS ex relative after change
 PASS ch relative after change
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/font-relative-units-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/font-relative-units-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/font-relative-units-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,6 +1,6 @@
 
 PASS em relative inline-size
-PASS rem relative inline-size
+FAIL rem relative inline-size assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)"
 PASS ex relative inline-size
 PASS ch relative inline-size
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/get-animations-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/get-animations-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/get-animations-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 Green
 
-FAIL Calling getAnimations updates layout of parent frame if needed assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
+PASS Calling getAnimations updates layout of parent frame if needed
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/iframe-invalidation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/iframe-invalidation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/iframe-invalidation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 
 
-FAIL @container-dependent elements respond to iframe size changes assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 128, 0)"
+FAIL @container-dependent elements respond to iframe size changes assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/inline-size-containment-vertical-rl-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/inline-size-containment-vertical-rl-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/inline-size-containment-vertical-rl-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,3 +1,3 @@
 
-FAIL inline-size containment only assert_equals: expected 400 but got 20
+FAIL inline-size containment only assert_equals: expected 50 but got 400
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/orthogonal-wm-container-query-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/orthogonal-wm-container-query-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/orthogonal-wm-container-query-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,5 +1,5 @@
 XX
 
-FAIL Initial non-orthogonal width assert_equals: expected 400 but got 50
+PASS Initial non-orthogonal width
 PASS Orthogonal width
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/percentage-padding-orthogonal-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/percentage-padding-orthogonal-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/percentage-padding-orthogonal-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,8 +1,8 @@
 
 FAIL #container height measured with 500px width. Both container children visible assert_equals: expected 100 but got 0
 FAIL #container width 400px after padding is applied. assert_equals: expected 400 but got 500
-PASS #container width 400px after padding is applied. #second is removed from the rendering
+FAIL #container width 400px after padding is applied. #second is removed from the rendering assert_equals: expected 50 but got 100
 FAIL #container height measured with 499px width. Both container children visible assert_equals: expected 100 but got 0
 FAIL #container width 399px after padding is applied. #second is removed from the rendering assert_equals: expected 399 but got 500
-PASS #container width 399x after padding is applied. #second is removed from the rendering
+FAIL #container width 399x after padding is applied. #second is removed from the rendering assert_equals: expected 50 but got 100
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/query-content-box-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/query-content-box-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/query-content-box-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,6 +1,6 @@
 
-PASS Size queries with content-box sizing
-PASS Size queries with border-box sizing
-PASS Size queries with content-box sizing and overflow:scroll
-PASS Size queries with border-box sizing and overflow:scroll
+FAIL Size queries with content-box sizing assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
+FAIL Size queries with border-box sizing assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
+FAIL Size queries with content-box sizing and overflow:scroll assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
+FAIL Size queries with border-box sizing and overflow:scroll assert_equals: expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/query-evaluation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/query-evaluation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/query-evaluation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,71 +1,71 @@
 
 PASS size(width)
-FAIL size(height) assert_equals: expected "false" but got "true"
-FAIL size(unknown) assert_equals: expected "false" but got "true"
-FAIL unknown(width) assert_equals: expected "false" but got "true"
-PASS (size(width))
-FAIL (size(height)) assert_equals: expected "false" but got "true"
-FAIL (size(unknown)) assert_equals: expected "false" but got "true"
-PASS (((size(width))))
-FAIL (((size(height)))) assert_equals: expected "false" but got "true"
-FAIL (((size(unknown)))) assert_equals: expected "false" but got "true"
-FAIL (not size(width)) assert_equals: expected "false" but got "true"
-PASS (not size(height))
-FAIL (not size(unknown)) assert_equals: expected "false" but got "true"
-FAIL (not unknown(width)) assert_equals: expected "false" but got "true"
-PASS (size(width) and size(width))
-PASS (size(width) and size(width) and size(width))
-FAIL (size(height) and size(height)) assert_equals: expected "false" but got "true"
-FAIL (size(height) and size(width) and size(width)) assert_equals: expected "false" but got "true"
-FAIL (size(width) and size(height) and size(width)) assert_equals: expected "false" but got "true"
-FAIL (size(width) and size(width) and size(height)) assert_equals: expected "false" but got "true"
-FAIL (size(unknown) and size(width) and size(width)) assert_equals: expected "false" but got "true"
-FAIL (size(width) and size(unknown) and size(width)) assert_equals: expected "false" but got "true"
-FAIL (size(width) and size(width) and size(unknown)) assert_equals: expected "false" but got "true"
-PASS (size(width) or size(width))
-PASS (size(width) or size(width) or size(width))
-FAIL (size(height) or size(height)) assert_equals: expected "false" but got "true"
-PASS (size(height) or size(width) or size(width))
-PASS (size(width) or size(height) or size(width))
-PASS (size(width) or size(width) or size(height))
-PASS (size(unknown) or size(width) or size(width))
-PASS (size(width) or size(unknown) or size(width))
-PASS (size(width) or size(width) or size(unknown))
-PASS (size(unknown) or size(height) or size(width))
-FAIL (not (size(width) and size(width))) assert_equals: expected "false" but got "true"
-PASS (not (size(width) and size(height)))
-FAIL (size(width) and (not (size(height) or size(width)))) assert_equals: expected "false" but got "true"
-PASS (size(height) or (not (size(height) and size(width))))
-FAIL (size(height) or (size(height) and size(width))) assert_equals: expected "false" but got "true"
-PASS size((width))
-FAIL size((height)) assert_equals: expected "false" but got "true"
-FAIL size((unknown)) assert_equals: expected "false" but got "true"
-FAIL unknown((width)) assert_equals: expected "false" but got "true"
-FAIL size(not (width)) assert_equals: expected "false" but got "true"
-PASS size(not (height))
-FAIL size(not (unknown)) assert_equals: expected "false" but got "true"
-PASS size((width) and (width))
-PASS size((width) and (width) and (width))
-FAIL size((height) and (height)) assert_equals: expected "false" but got "true"
-FAIL size((height) and (width) and (width)) assert_equals: expected "false" but got "true"
-FAIL size((width) and (height) and (width)) assert_equals: expected "false" but got "true"
-FAIL size((width) and (width) and (height)) assert_equals: expected "false" but got "true"
-FAIL size((unknown) and (width) and (width)) assert_equals: expected "false" but got "true"
-FAIL size((width) and (unknown) and (width)) assert_equals: expected "false" but got "true"
-FAIL size((width) and (width) and (unknown)) assert_equals: expected "false" but got "true"
-PASS size((width) or (width))
-PASS size((width) or (width) or (width))
-FAIL size((height) or (height)) assert_equals: expected "false" but got "true"
-PASS size((height) or (width) or (width))
-PASS size((width) or (height) or (width))
-PASS size((width) or (width) or (height))
-PASS size((unknown) or (width) or (width))
-PASS size((width) or (unknown) or (width))
-PASS size((width) or (width) or (unknown))
-PASS size((unknown) or (height) or (width))
-FAIL size(not ((width) and (width))) assert_equals: expected "false" but got "true"
-PASS size(not ((width) and (height)))
-FAIL size((width) and (not ((height) or (width)))) assert_equals: expected "false" but got "true"
-PASS size((height) or (not ((height) and (width))))
-FAIL size((height) or ((height) and (width))) assert_equals: expected "false" but got "true"
+PASS size(height)
+PASS size(unknown)
+PASS unknown(width)
+FAIL (size(width)) assert_equals: expected "true" but got "false"
+PASS (size(height))
+PASS (size(unknown))
+FAIL (((size(width)))) assert_equals: expected "true" but got "false"
+PASS (((size(height))))
+PASS (((size(unknown))))
+PASS (not size(width))
+FAIL (not size(height)) assert_equals: expected "true" but got "false"
+PASS (not size(unknown))
+PASS (not unknown(width))
+FAIL (size(width) and size(width)) assert_equals: expected "true" but got "false"
+FAIL (size(width) and size(width) and size(width)) assert_equals: expected "true" but got "false"
+PASS (size(height) and size(height))
+PASS (size(height) and size(width) and size(width))
+PASS (size(width) and size(height) and size(width))
+PASS (size(width) and size(width) and size(height))
+PASS (size(unknown) and size(width) and size(width))
+PASS (size(width) and size(unknown) and size(width))
+PASS (size(width) and size(width) and size(unknown))
+FAIL (size(width) or size(width)) assert_equals: expected "true" but got "false"
+FAIL (size(width) or size(width) or size(width)) assert_equals: expected "true" but got "false"
+PASS (size(height) or size(height))
+FAIL (size(height) or size(width) or size(width)) assert_equals: expected "true" but got "false"
+FAIL (size(width) or size(height) or size(width)) assert_equals: expected "true" but got "false"
+FAIL (size(width) or size(width) or size(height)) assert_equals: expected "true" but got "false"
+FAIL (size(unknown) or size(width) or size(width)) assert_equals: expected "true" but got "false"
+FAIL (size(width) or size(unknown) or size(width)) assert_equals: expected "true" but got "false"
+FAIL (size(width) or size(width) or size(unknown)) assert_equals: expected "true" but got "false"
+FAIL (size(unknown) or size(height) or size(width)) assert_equals: expected "true" but got "false"
+PASS (not (size(width) and size(width)))
+FAIL (not (size(width) and size(height))) assert_equals: expected "true" but got "false"
+PASS (size(width) and (not (size(height) or size(width))))
+FAIL (size(height) or (not (size(height) and size(width)))) assert_equals: expected "true" but got "false"
+PASS (size(height) or (size(height) and size(width)))
+FAIL size((width)) assert_equals: expected "true" but got "false"
+PASS size((height))
+PASS size((unknown))
+PASS unknown((width))
+PASS size(not (width))
+FAIL size(not (height)) assert_equals: expected "true" but got "false"
+PASS size(not (unknown))
+FAIL size((width) and (width)) assert_equals: expected "true" but got "false"
+FAIL size((width) and (width) and (width)) assert_equals: expected "true" but got "false"
+PASS size((height) and (height))
+PASS size((height) and (width) and (width))
+PASS size((width) and (height) and (width))
+PASS size((width) and (width) and (height))
+PASS size((unknown) and (width) and (width))
+PASS size((width) and (unknown) and (width))
+PASS size((width) and (width) and (unknown))
+FAIL size((width) or (width)) assert_equals: expected "true" but got "false"
+FAIL size((width) or (width) or (width)) assert_equals: expected "true" but got "false"
+PASS size((height) or (height))
+FAIL size((height) or (width) or (width)) assert_equals: expected "true" but got "false"
+FAIL size((width) or (height) or (width)) assert_equals: expected "true" but got "false"
+FAIL size((width) or (width) or (height)) assert_equals: expected "true" but got "false"
+FAIL size((unknown) or (width) or (width)) assert_equals: expected "true" but got "false"
+FAIL size((width) or (unknown) or (width)) assert_equals: expected "true" but got "false"
+FAIL size((width) or (width) or (unknown)) assert_equals: expected "true" but got "false"
+FAIL size((unknown) or (height) or (width)) assert_equals: expected "true" but got "false"
+PASS size(not ((width) and (width)))
+FAIL size(not ((width) and (height))) assert_equals: expected "true" but got "false"
+PASS size((width) and (not ((height) or (width))))
+FAIL size((height) or (not ((height) and (width)))) assert_equals: expected "true" but got "false"
+PASS size((height) or ((height) and (width)))
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/reattach-container-with-dirty-child-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/reattach-container-with-dirty-child-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/reattach-container-with-dirty-child-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,5 +1,5 @@
 XXX
 
-FAIL Initially wider than 200px assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 255, 0)"
+PASS Initially wider than 200px
 PASS Container query changed and inner.style applied
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-container-no-principal-box-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,5 +1,5 @@
 
 PASS Check that container queries is supported
 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)"
-FAIL (min-width: 0) does not match a container without a principal box (display:contents) assert_equals: expected "rgb(0, 0, 0)" but got "rgb(255, 0, 0)"
+PASS (min-width: 0) does not match a container without a principal box (display:contents)
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-feature-evaluation-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-feature-evaluation-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/size-feature-evaluation-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,59 +1,59 @@
 Test
 
-FAIL size(width < 100px) (.horizontal) assert_equals: expected "" but got "true"
-PASS size(width >= 100px) (.horizontal)
+PASS size(width < 100px) (.horizontal)
+FAIL size(width >= 100px) (.horizontal) assert_equals: expected "true" but got ""
 PASS size(min-width: 100px) (.horizontal)
-FAIL size(min-width: 101px) (.horizontal) assert_equals: expected "" but got "true"
+PASS size(min-width: 101px) (.horizontal)
 PASS size(max-width: 100px) (.horizontal)
-FAIL size(max-width: 99px) (.horizontal) assert_equals: expected "" but got "true"
-FAIL size(height < 200px) (.horizontal) assert_equals: expected "" but got "true"
-PASS size(height >= 200px) (.horizontal)
+PASS size(max-width: 99px) (.horizontal)
+PASS size(height < 200px) (.horizontal)
+FAIL size(height >= 200px) (.horizontal) assert_equals: expected "true" but got ""
 PASS size(min-height: 200px) (.horizontal)
-FAIL size(min-height: 201px) (.horizontal) assert_equals: expected "" but got "true"
+PASS size(min-height: 201px) (.horizontal)
 PASS size(max-height: 200px) (.horizontal)
-FAIL size(max-height: 199px) (.horizontal) assert_equals: expected "" but got "true"
-FAIL size(inline-size < 100px) (.horizontal) assert_equals: expected "" but got "true"
-PASS size(inline-size >= 100px) (.horizontal)
-PASS size(min-inline-size: 100px) (.horizontal)
-FAIL size(min-inline-size: 101px) (.horizontal) assert_equals: expected "" but got "true"
-PASS size(max-inline-size: 100px) (.horizontal)
-FAIL size(max-inline-size: 99px) (.horizontal) assert_equals: expected "" but got "true"
-FAIL size(block-size < 200px) (.horizontal) assert_equals: expected "" but got "true"
-PASS size(block-size >= 200px) (.horizontal)
-PASS size(min-block-size: 200px) (.horizontal)
-FAIL size(min-block-size: 201px) (.horizontal) assert_equals: expected "" but got "true"
-PASS size(max-block-size: 200px) (.horizontal)
-FAIL size(max-block-size: 199px) (.horizontal) assert_equals: expected "" but got "true"
-FAIL size(orientation: landscape) (.horizontal) assert_equals: expected "" but got "true"
-PASS size(orientation: portrait) (.horizontal)
-PASS size(aspect-ratio: 1/2) (.horizontal)
-FAIL size(aspect-ratio: 2/1) (.horizontal) assert_equals: expected "" but got "true"
-FAIL size(width < 100px) (.vertical) assert_equals: expected "" but got "true"
-PASS size(width >= 100px) (.vertical)
+PASS size(max-height: 199px) (.horizontal)
+PASS size(inline-size < 100px) (.horizontal)
+FAIL size(inline-size >= 100px) (.horizontal) assert_equals: expected "true" but got ""
+FAIL size(min-inline-size: 100px) (.horizontal) assert_equals: expected "true" but got ""
+PASS size(min-inline-size: 101px) (.horizontal)
+FAIL size(max-inline-size: 100px) (.horizontal) assert_equals: expected "true" but got ""
+PASS size(max-inline-size: 99px) (.horizontal)
+PASS size(block-size < 200px) (.horizontal)
+FAIL size(block-size >= 200px) (.horizontal) assert_equals: expected "true" but got ""
+FAIL size(min-block-size: 200px) (.horizontal) assert_equals: expected "true" but got ""
+PASS size(min-block-size: 201px) (.horizontal)
+FAIL size(max-block-size: 200px) (.horizontal) assert_equals: expected "true" but got ""
+PASS size(max-block-size: 199px) (.horizontal)
+PASS size(orientation: landscape) (.horizontal)
+FAIL size(orientation: portrait) (.horizontal) assert_equals: expected "true" but got ""
+FAIL size(aspect-ratio: 1/2) (.horizontal) assert_equals: expected "true" but got ""
+PASS size(aspect-ratio: 2/1) (.horizontal)
+PASS size(width < 100px) (.vertical)
+FAIL size(width >= 100px) (.vertical) assert_equals: expected "true" but got ""
 PASS size(min-width: 100px) (.vertical)
-FAIL size(min-width: 101px) (.vertical) assert_equals: expected "" but got "true"
+PASS size(min-width: 101px) (.vertical)
 PASS size(max-width: 100px) (.vertical)
-FAIL size(max-width: 99px) (.vertical) assert_equals: expected "" but got "true"
-FAIL size(height < 200px) (.vertical) assert_equals: expected "" but got "true"
-PASS size(height >= 200px) (.vertical)
+PASS size(max-width: 99px) (.vertical)
+PASS size(height < 200px) (.vertical)
+FAIL size(height >= 200px) (.vertical) assert_equals: expected "true" but got ""
 PASS size(min-height: 200px) (.vertical)
-FAIL size(min-height: 201px) (.vertical) assert_equals: expected "" but got "true"
+PASS size(min-height: 201px) (.vertical)
 PASS size(max-height: 200px) (.vertical)
-FAIL size(max-height: 199px) (.vertical) assert_equals: expected "" but got "true"
-FAIL size(block-size < 100px) (.vertical) assert_equals: expected "" but got "true"
-PASS size(block-size >= 100px) (.vertical)
-PASS size(min-block-size: 100px) (.vertical)
-FAIL size(min-block-size: 101px) (.vertical) assert_equals: expected "" but got "true"
-PASS size(max-block-size: 100px) (.vertical)
-FAIL size(max-block-size: 99px) (.vertical) assert_equals: expected "" but got "true"
-FAIL size(inline-size < 200px) (.vertical) assert_equals: expected "" but got "true"
-PASS size(inline-size >= 200px) (.vertical)
-PASS size(min-inline-size: 200px) (.vertical)
-FAIL size(min-inline-size: 201px) (.vertical) assert_equals: expected "" but got "true"
-PASS size(max-inline-size: 200px) (.vertical)
-FAIL size(max-inline-size: 199px) (.vertical) assert_equals: expected "" but got "true"
-FAIL size(orientation: landscape) (.vertical) assert_equals: expected "" but got "true"
-PASS size(orientation: portrait) (.vertical)
-PASS size(aspect-ratio: 1/2) (.vertical)
-FAIL size(aspect-ratio: 2/1) (.vertical) assert_equals: expected "" but got "true"
+PASS size(max-height: 199px) (.vertical)
+PASS size(block-size < 100px) (.vertical)
+FAIL size(block-size >= 100px) (.vertical) assert_equals: expected "true" but got ""
+FAIL size(min-block-size: 100px) (.vertical) assert_equals: expected "true" but got ""
+PASS size(min-block-size: 101px) (.vertical)
+FAIL size(max-block-size: 100px) (.vertical) assert_equals: expected "true" but got ""
+PASS size(max-block-size: 99px) (.vertical)
+PASS size(inline-size < 200px) (.vertical)
+FAIL size(inline-size >= 200px) (.vertical) assert_equals: expected "true" but got ""
+FAIL size(min-inline-size: 200px) (.vertical) assert_equals: expected "true" but got ""
+PASS size(min-inline-size: 201px) (.vertical)
+FAIL size(max-inline-size: 200px) (.vertical) assert_equals: expected "true" but got ""
+PASS size(max-inline-size: 199px) (.vertical)
+PASS size(orientation: landscape) (.vertical)
+FAIL size(orientation: portrait) (.vertical) assert_equals: expected "true" but got ""
+FAIL size(aspect-ratio: 1/2) (.vertical) assert_equals: expected "true" but got ""
+PASS size(aspect-ratio: 2/1) (.vertical)
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-dialog-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,6 +1,6 @@
 
 FAIL #container initially wider than 200px assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 255, 0)"
 FAIL #container changed to 200px assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 255, 0)"
-FAIL Modal dialog still has parent as query container while in top layer assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 255, 0)"
+PASS Modal dialog still has parent as query container while in top layer
 PASS Container changes width while dialog is in top layer
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/top-layer-nested-dialog-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,5 +1,5 @@
 
 FAIL Dialogs initially not matching for container queries assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 255, 0)"
-FAIL Dialogs still not matching after showModal assert_equals: expected "rgb(255, 0, 0)" but got "rgb(0, 255, 0)"
+PASS Dialogs still not matching after showModal
 PASS @container queries start matching
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/transition-scrollbars-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/transition-scrollbars-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/transition-scrollbars-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,4 +1,4 @@
 Foo bar foo bar foo Foo bar foo bar foo Foo bar foo bar foo Foo bar foo bar foo Foo bar foo bar foo
 
-FAIL Scrollbars do not cause a transition of background-color assert_equals: expected "rgb(0, 0, 255)" but got "rgb(0, 128, 0)"
+FAIL Scrollbars do not cause a transition of background-color assert_equals: expected "rgb(0, 128, 0)" but got "rgb(0, 0, 255)"
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/unsupported-axis-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/unsupported-axis-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/unsupported-axis-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,14 +1,14 @@
 Test
 
-PASS size(width > 0px)
-FAIL size(height > 0px) assert_equals: expected "" but got "true"
-PASS size((height > 0px) or (width > 0px))
-PASS size((width > 0px) or (height > 0px))
-PASS size((orientation: landscape) or (width > 0px))
-PASS size((width > 0px) or (orientation: landscape))
-FAIL size((height > 0px) or (orientation: landscape)) assert_equals: expected "" but got "true"
-FAIL size((height > 0px) or (orientation: landscape)), with contain:size assert_equals: expected "" but got "true"
-PASS size(inline-size > 0px)
-FAIL size(block-size > 0px) assert_equals: expected "" but got "true"
-FAIL size(block-size > 0px), with writing-mode:vertical-rl assert_equals: expected "" but got "true"
+FAIL size(width > 0px) assert_equals: expected "true" but got ""
+PASS size(height > 0px)
+FAIL size((height > 0px) or (width > 0px)) assert_equals: expected "true" but got ""
+FAIL size((width > 0px) or (height > 0px)) assert_equals: expected "true" but got ""
+FAIL size((orientation: landscape) or (width > 0px)) assert_equals: expected "true" but got ""
+FAIL size((width > 0px) or (orientation: landscape)) assert_equals: expected "true" but got ""
+PASS size((height > 0px) or (orientation: landscape))
+PASS size((height > 0px) or (orientation: landscape)), with contain:size
+FAIL size(inline-size > 0px) assert_equals: expected "true" but got ""
+PASS size(block-size > 0px)
+PASS size(block-size > 0px), with writing-mode:vertical-rl
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/viewport-units-expected.txt (289221 => 289222)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/viewport-units-expected.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-contain/container-queries/viewport-units-expected.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,6 +1,6 @@
 Green
 Green
 
-FAIL Match width with vw assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL Match width with vh assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS Match width with vw
+PASS Match width with vh
 

Modified: trunk/Source/WebCore/ChangeLog (289221 => 289222)


--- trunk/Source/WebCore/ChangeLog	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/Source/WebCore/ChangeLog	2022-02-07 16:21:48 UTC (rev 289222)
@@ -1,3 +1,24 @@
+2022-02-07  Antti Koivisto  <[email protected]>
+
+        [CSS Container Queries] Add ContainerQueryEvaluator
+        https://bugs.webkit.org/show_bug.cgi?id=236096
+
+        Reviewed by Darin Adler.
+
+        Add ContainerQueryEvaluator. Initially it evaluates simple min/max-width/height queries.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * style/ContainerQueryEvaluator.h: Added.
+        * style/ContainerQueryEvaluator.cpp: Added.
+        (WebCore::Style::ContainerQueryEvaluator::ContainerQueryEvaluator):
+        (WebCore::Style::computeLength):
+        (WebCore::Style::ContainerQueryEvaluator::evaluate const):
+        * style/ElementRuleCollector.cpp:
+        (WebCore::Style::ElementRuleCollector::containerQueryMatches):
+
+        Start to actually evaluate container queries.
+
 2022-02-07  Antoine Quint  <[email protected]>
 
         Improve DocumentTimeline::animationCanBeRemoved()

Modified: trunk/Source/WebCore/Sources.txt (289221 => 289222)


--- trunk/Source/WebCore/Sources.txt	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/Source/WebCore/Sources.txt	2022-02-07 16:21:48 UTC (rev 289222)
@@ -2555,6 +2555,7 @@
 style/AttributeChangeInvalidation.cpp
 style/ChildChangeInvalidation.cpp
 style/ClassChangeInvalidation.cpp
+style/ContainerQueryEvaluator.cpp
 style/ElementRuleCollector.cpp
 style/HasSelectorFilter.cpp
 style/IdChangeInvalidation.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (289221 => 289222)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-02-07 16:21:48 UTC (rev 289222)
@@ -5380,6 +5380,7 @@
 		E4A814DA1C70E10D00BF85AC /* AttributeChangeInvalidation.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A814D91C70E10D00BF85AC /* AttributeChangeInvalidation.h */; };
 		E4A814E01C7338EB00BF85AC /* IdChangeInvalidation.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A814DF1C7338EB00BF85AC /* IdChangeInvalidation.h */; };
 		E4A8D21622578DB700A8463C /* EventRegion.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A8D21422578DA000A8463C /* EventRegion.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		E4AAB38727AA95D7009F5899 /* ContainerQueryEvaluator.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AAB38527AA95D7009F5899 /* ContainerQueryEvaluator.h */; };
 		E4ABABDD236088FE00FA4345 /* LayoutIntegrationLineLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = E4ABABDB236088FD00FA4345 /* LayoutIntegrationLineLayout.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E4ABABE42361A32900FA4345 /* PropertyCascade.h in Headers */ = {isa = PBXBuildFile; fileRef = E4ABABE22361A32900FA4345 /* PropertyCascade.h */; };
 		E4ABABF32368B95900FA4345 /* StyleBuilderState.h in Headers */ = {isa = PBXBuildFile; fileRef = E4ABABF22368B95800FA4345 /* StyleBuilderState.h */; };
@@ -17506,6 +17507,8 @@
 		E4A814DF1C7338EB00BF85AC /* IdChangeInvalidation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IdChangeInvalidation.h; sourceTree = "<group>"; };
 		E4A8D21422578DA000A8463C /* EventRegion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventRegion.h; sourceTree = "<group>"; };
 		E4A8D21522578DA000A8463C /* EventRegion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventRegion.cpp; sourceTree = "<group>"; };
+		E4AAB38527AA95D7009F5899 /* ContainerQueryEvaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerQueryEvaluator.h; sourceTree = "<group>"; };
+		E4AAB38827AA95E0009F5899 /* ContainerQueryEvaluator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContainerQueryEvaluator.cpp; sourceTree = "<group>"; };
 		E4ABABDB236088FD00FA4345 /* LayoutIntegrationLineLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LayoutIntegrationLineLayout.h; sourceTree = "<group>"; };
 		E4ABABDE2360893D00FA4345 /* LayoutIntegrationLineLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutIntegrationLineLayout.cpp; sourceTree = "<group>"; };
 		E4ABABE22361A32900FA4345 /* PropertyCascade.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PropertyCascade.h; sourceTree = "<group>"; };
@@ -31286,6 +31289,8 @@
 				E4C4C61827452A7900A040E7 /* ChildChangeInvalidation.h */,
 				E4A814D51C6DEE8D00BF85AC /* ClassChangeInvalidation.cpp */,
 				E4A814D31C6DEC4000BF85AC /* ClassChangeInvalidation.h */,
+				E4AAB38827AA95E0009F5899 /* ContainerQueryEvaluator.cpp */,
+				E4AAB38527AA95D7009F5899 /* ContainerQueryEvaluator.h */,
 				FBDB619A16D6032A00BB3394 /* ElementRuleCollector.cpp */,
 				FBDB619E16D6036500BB3394 /* ElementRuleCollector.h */,
 				E4ED3ECD2768A68800F17AC8 /* HasSelectorFilter.cpp */,
@@ -33839,6 +33844,7 @@
 				E596DD352519041400C275A7 /* ContactsSelectOptions.h in Headers */,
 				A818721C0977D3C0005826D9 /* ContainerNode.h in Headers */,
 				E1A1470811102B1500EEC0F3 /* ContainerNodeAlgorithms.h in Headers */,
+				E4AAB38727AA95D7009F5899 /* ContainerQueryEvaluator.h in Headers */,
 				6FB5E214221F2453003989CF /* ContentChangeObserver.h in Headers */,
 				BC5EB9810E82072500B25965 /* ContentData.h in Headers */,
 				51B45D211AB8D1E200117CD2 /* ContentExtension.h in Headers */,

Added: trunk/Source/WebCore/style/ContainerQueryEvaluator.cpp (0 => 289222)


--- trunk/Source/WebCore/style/ContainerQueryEvaluator.cpp	                        (rev 0)
+++ trunk/Source/WebCore/style/ContainerQueryEvaluator.cpp	2022-02-07 16:21:48 UTC (rev 289222)
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ContainerQueryEvaluator.h"
+
+#include "CSSToLengthConversionData.h"
+#include "Document.h"
+#include "MediaFeatureNames.h"
+#include "MediaQuery.h"
+#include "RenderView.h"
+
+namespace WebCore::Style {
+
+ContainerQueryEvaluator::ContainerQueryEvaluator(const Vector<Ref<const Element>>& containers)
+    : m_containers(containers)
+{
+}
+
+static std::optional<LayoutUnit> computeSize(CSSValue* value, const CSSToLengthConversionData& conversionData)
+{
+    if (!is<CSSPrimitiveValue>(value))
+        return { };
+
+    auto& primitiveValue = downcast<CSSPrimitiveValue>(*value);
+    if (primitiveValue.isNumberOrInteger()) {
+        if (primitiveValue.doubleValue())
+            return { };
+        return 0_lu;
+    }
+
+    if (!primitiveValue.isLength())
+        return { };
+    return primitiveValue.computeLength<LayoutUnit>(conversionData);
+}
+
+enum class Comparator { Lesser, Greater, LesserOrEqual, GreaterOrEqual, Equal, True };
+
+bool ContainerQueryEvaluator::evaluate(const ContainerQuery& containerQuery) const
+{
+    if (m_containers.isEmpty())
+        return false;
+
+    // FIXME: Match the container selector.
+    auto* renderer = m_containers.last()->renderer();
+    if (!renderer)
+        return false;
+
+    auto& view = renderer->view();
+    CSSToLengthConversionData conversionData { &renderer->style(), &view.style(), nullptr, &view, 1 };
+
+    auto evaluateSize = [&](const MediaQueryExpression& _expression_, Comparator comparator, auto&& sizeGetter)
+    {
+        if (!is<RenderBox>(renderer))
+            return false;
+
+        std::optional<LayoutUnit> expressionSize;
+
+        if (comparator != Comparator::True) {
+            expressionSize = computeSize(_expression_.value(), conversionData);
+            if (!expressionSize)
+                return false;
+        }
+
+        auto size = sizeGetter(downcast<RenderBox>(*renderer));
+
+        switch (comparator) {
+        case Comparator::Lesser:
+            return size < *expressionSize;
+        case Comparator::Greater:
+            return size > *expressionSize;
+        case Comparator::LesserOrEqual:
+            return size <= *expressionSize;
+        case Comparator::GreaterOrEqual:
+            return size >= *expressionSize;
+        case Comparator::Equal:
+            return size == *expressionSize;
+        case Comparator::True:
+            return !!size;
+        }
+    };
+
+    auto evaluateWidth = [&](const MediaQueryExpression& _expression_, Comparator comparator)
+    {
+        return evaluateSize(_expression_, comparator, [&](const RenderBox& renderer) {
+            return renderer.width();
+        });
+    };
+
+    auto evaluateHeight = [&](const MediaQueryExpression& _expression_, Comparator comparator)
+    {
+        return evaluateSize(_expression_, comparator, [&](const RenderBox& renderer) {
+            return renderer.height();
+        });
+    };
+
+    bool result = false;
+
+    // FIXME: This is very rudimentary.
+    auto& queries = containerQuery.query->queryVector();
+    for (auto& query : queries) {
+        for (auto& _expression_ : query.expressions()) {
+            if (_expression_.mediaFeature() == MediaFeatureNames::minWidth) {
+                if (evaluateWidth(_expression_, Comparator::GreaterOrEqual))
+                    result = true;
+                continue;
+            }
+            if (_expression_.mediaFeature() == MediaFeatureNames::maxWidth) {
+                if (evaluateWidth(_expression_, Comparator::LesserOrEqual))
+                    result = true;
+                continue;
+            }
+            if (_expression_.mediaFeature() == MediaFeatureNames::width) {
+                if (evaluateWidth(_expression_, _expression_.value() ? Comparator::Equal : Comparator::True))
+                    result = true;
+                continue;
+            }
+            if (_expression_.mediaFeature() == MediaFeatureNames::minHeight) {
+                if (evaluateHeight(_expression_, Comparator::GreaterOrEqual))
+                    result = true;
+                continue;
+            }
+            if (_expression_.mediaFeature() == MediaFeatureNames::maxHeight) {
+                if (evaluateHeight(_expression_, Comparator::LesserOrEqual))
+                    result = true;
+                continue;
+            }
+            if (_expression_.mediaFeature() == MediaFeatureNames::height) {
+                if (evaluateHeight(_expression_, _expression_.value() ? Comparator::Equal : Comparator::True))
+                    result = true;
+                continue;
+            }
+        }
+    }
+
+    return result;
+}
+
+}

Added: trunk/Source/WebCore/style/ContainerQueryEvaluator.h (0 => 289222)


--- trunk/Source/WebCore/style/ContainerQueryEvaluator.h	                        (rev 0)
+++ trunk/Source/WebCore/style/ContainerQueryEvaluator.h	2022-02-07 16:21:48 UTC (rev 289222)
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace WebCore {
+
+class Element;
+
+namespace Style {
+
+class ContainerQueryEvaluator {
+public:
+    ContainerQueryEvaluator(const Vector<Ref<const Element>>& containers);
+
+    bool evaluate(const ContainerQuery&) const;
+
+private:
+    const Vector<Ref<const Element>>& m_containers;
+};
+
+}
+}

Modified: trunk/Source/WebCore/style/ElementRuleCollector.cpp (289221 => 289222)


--- trunk/Source/WebCore/style/ElementRuleCollector.cpp	2022-02-07 16:01:55 UTC (rev 289221)
+++ trunk/Source/WebCore/style/ElementRuleCollector.cpp	2022-02-07 16:21:48 UTC (rev 289222)
@@ -32,6 +32,7 @@
 #include "CSSRuleList.h"
 #include "CSSSelector.h"
 #include "CSSValueKeywords.h"
+#include "ContainerQueryEvaluator.h"
 #include "ElementInlines.h"
 #include "HTMLElement.h"
 #include "HTMLSlotElement.h"
@@ -504,12 +505,13 @@
     }
 }
 
-bool ElementRuleCollector::containerQueryMatches(const ContainerQuery&)
+bool ElementRuleCollector::containerQueryMatches(const ContainerQuery& query)
 {
     if (!m_selectorMatchingState)
         return true;
-    // FIXME: The actual matching.
-    return !m_selectorMatchingState->queryContainers.isEmpty();
+
+    ContainerQueryEvaluator evaluator(m_selectorMatchingState->queryContainers);
+    return evaluator.evaluate(query);
 }
 
 static inline bool compareRules(MatchedRule r1, MatchedRule r2)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to