Title: [292893] trunk
Revision
292893
Author
nmouchta...@apple.com
Date
2022-04-14 16:32:40 -0700 (Thu, 14 Apr 2022)

Log Message

calc(): Serialize top level min/max/hypot as calc()
https://bugs.webkit.org/show_bug.cgi?id=239019

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt:
* web-platform-tests/css/css-values/hypot-pow-sqrt-serialize-expected.txt:
* web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt:
* web-platform-tests/css/css-values/minmax-length-percent-serialize-expected.txt:
* web-platform-tests/css/css-values/minmax-length-serialize-expected.txt:
* web-platform-tests/css/css-values/minmax-number-serialize-expected.txt:
* web-platform-tests/css/css-values/minmax-percentage-serialize-expected.txt:
* web-platform-tests/css/css-values/minmax-time-serialize-expected.txt:

Source/WebCore:

For functions that would have no effect on the top level value, serialize as calc() rather
than the function.

* css/calc/CSSCalcOperationNode.cpp:
(WebCore::CSSCalcOperationNode::simplifyNode):
* css/calc/CSSCalcOperationNode.h:

LayoutTests:

* fast/css/calc-parsing-expected.txt:
* fast/css/calc-parsing.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (292892 => 292893)


--- trunk/LayoutTests/ChangeLog	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/ChangeLog	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,3 +1,13 @@
+2022-04-14  Nikolaos Mouchtaris  <nmouchta...@apple.com>
+
+        calc(): Serialize top level min/max/hypot as calc()
+        https://bugs.webkit.org/show_bug.cgi?id=239019
+
+        Reviewed by Darin Adler.
+
+        * fast/css/calc-parsing-expected.txt:
+        * fast/css/calc-parsing.html:
+
 2022-04-14  Karl Rackler  <rack...@apple.com>
 
         [ Mac ] editing/execCommand/insert-ordered-list-and-delete.html is a flaky failure

Modified: trunk/LayoutTests/fast/css/calc-parsing-expected.txt (292892 => 292893)


--- trunk/LayoutTests/fast/css/calc-parsing-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/fast/css/calc-parsing-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -9,15 +9,15 @@
 PASS getComputedStyle(element).getPropertyValue('width') is "100px"
 
 element.style["width"] = "max(100px + 200px)"
-PASS element.style['width'] is "max(300px)"
+PASS element.style['width'] is "calc(300px)"
 PASS getComputedStyle(element).getPropertyValue('width') is "300px"
 
 element.style["width"] = "max(100px , 200px)"
-PASS element.style['width'] is "max(200px)"
+PASS element.style['width'] is "calc(200px)"
 PASS getComputedStyle(element).getPropertyValue('width') is "200px"
 
 element.style["width"] = "max(100px,200px)"
-PASS element.style['width'] is "max(200px)"
+PASS element.style['width'] is "calc(200px)"
 PASS getComputedStyle(element).getPropertyValue('width') is "200px"
 
 element.style["width"] = "clamp(100px,123px,200px)"
@@ -73,11 +73,11 @@
 PASS getComputedStyle(element).getPropertyValue('width') is "1024px"
 
 element.style["width"] = "hypot(4px, 5px, 7px, 9px)"
-PASS element.style['width'] is "hypot(13.076697px)"
+PASS element.style['width'] is "calc(13.076697px)"
 PASS getComputedStyle(element).getPropertyValue('width') is "13.0625px"
 
 element.style["width"] = "hypot(3px, 4px)"
-PASS element.style['width'] is "hypot(5px)"
+PASS element.style['width'] is "calc(5px)"
 PASS getComputedStyle(element).getPropertyValue('width') is "5px"
 
 element.style["width"] = "calc(100px * hypot(3, 4))"
@@ -85,7 +85,7 @@
 PASS getComputedStyle(element).getPropertyValue('width') is "500px"
 
 element.style["width"] = "hypot(-5px)"
-PASS element.style['width'] is "hypot(5px)"
+PASS element.style['width'] is "calc(5px)"
 PASS getComputedStyle(element).getPropertyValue('width') is "5px"
 
 element.style["width"] = "calc(1px * hypot(-5))"
@@ -269,15 +269,15 @@
 PASS getComputedStyle(element).getPropertyValue('min-width') is "100px"
 
 element.style["min-width"] = "max(100px + 200px)"
-PASS element.style['min-width'] is "max(300px)"
+PASS element.style['min-width'] is "calc(300px)"
 PASS getComputedStyle(element).getPropertyValue('min-width') is "300px"
 
 element.style["min-width"] = "max(100px , 200px)"
-PASS element.style['min-width'] is "max(200px)"
+PASS element.style['min-width'] is "calc(200px)"
 PASS getComputedStyle(element).getPropertyValue('min-width') is "200px"
 
 element.style["min-width"] = "max(100px,200px)"
-PASS element.style['min-width'] is "max(200px)"
+PASS element.style['min-width'] is "calc(200px)"
 PASS getComputedStyle(element).getPropertyValue('min-width') is "200px"
 
 element.style["min-width"] = "clamp(100px,123px,200px)"
@@ -333,11 +333,11 @@
 PASS getComputedStyle(element).getPropertyValue('min-width') is "1024px"
 
 element.style["min-width"] = "hypot(4px, 5px, 7px, 9px)"
-PASS element.style['min-width'] is "hypot(13.076697px)"
+PASS element.style['min-width'] is "calc(13.076697px)"
 PASS getComputedStyle(element).getPropertyValue('min-width') is "13.076696px"
 
 element.style["min-width"] = "hypot(3px, 4px)"
-PASS element.style['min-width'] is "hypot(5px)"
+PASS element.style['min-width'] is "calc(5px)"
 PASS getComputedStyle(element).getPropertyValue('min-width') is "5px"
 
 element.style["min-width"] = "calc(100px * hypot(3, 4))"
@@ -345,7 +345,7 @@
 PASS getComputedStyle(element).getPropertyValue('min-width') is "500px"
 
 element.style["min-width"] = "hypot(-5px)"
-PASS element.style['min-width'] is "hypot(5px)"
+PASS element.style['min-width'] is "calc(5px)"
 PASS getComputedStyle(element).getPropertyValue('min-width') is "5px"
 
 element.style["min-width"] = "calc(1px * hypot(-5))"

Modified: trunk/LayoutTests/fast/css/calc-parsing.html (292892 => 292893)


--- trunk/LayoutTests/fast/css/calc-parsing.html	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/fast/css/calc-parsing.html	2022-04-14 23:32:40 UTC (rev 292893)
@@ -31,9 +31,9 @@
 
                 // Valid expressions.
                 testExpression('calc(100px)', 'calc(100px)', '100px');
-                testExpression('max(100px + 200px)', 'max(300px)', '300px');
-                testExpression('max(100px , 200px)', 'max(200px)', '200px');
-                testExpression('max(100px,200px)', 'max(200px)', '200px');
+                testExpression('max(100px + 200px)', 'calc(300px)', '300px');
+                testExpression('max(100px , 200px)', 'calc(200px)', '200px');
+                testExpression('max(100px,200px)', 'calc(200px)', '200px');
                 testExpression('clamp(100px,123px,200px)', 'clamp(100px, 123px, 200px)', '123px');
                 testExpression('clamp(100px,300px,200px)', 'clamp(100px, 300px, 200px)', '200px');
                 testExpression('clamp(200px,300px,100px)', 'clamp(200px, 300px, 100px)', '200px');
@@ -47,10 +47,10 @@
                 testExpression('calc(100px * sqrt(100))', 'calc(1000px)', '1000px');
                 testExpression('calc(1px * sqrt(999))', 'calc(31.606961px)', propertyName == 'width' ? '31.59375px' : '31.606962px');
                 testExpression('calc(1px * pow(2, sqrt(100))', 'calc(1024px)', '1024px');
-                testExpression('hypot(4px, 5px, 7px, 9px)', 'hypot(13.076697px)', propertyName == 'width' ? '13.0625px' : '13.076696px');
-                testExpression('hypot(3px, 4px)', 'hypot(5px)', '5px');
+                testExpression('hypot(4px, 5px, 7px, 9px)', 'calc(13.076697px)', propertyName == 'width' ? '13.0625px' : '13.076696px');
+                testExpression('hypot(3px, 4px)', 'calc(5px)', '5px');
                 testExpression('calc(100px * hypot(3, 4))', 'calc(500px)', '500px');
-                testExpression('hypot(-5px)', 'hypot(5px)', '5px');
+                testExpression('hypot(-5px)', 'calc(5px)', '5px');
                 testExpression('calc(1px * hypot(-5))', 'calc(5px)', '5px');
                 testExpression('calc(1px * hypot(10000))', 'calc(10000px)', '10000px');
                 testExpression('calc(2px * sqrt(100000000))', 'calc(20000px)', '20000px');

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,3 +1,19 @@
+2022-04-14  Nikolaos Mouchtaris  <nmouchta...@apple.com>
+
+        calc(): Serialize top level min/max/hypot as calc()
+        https://bugs.webkit.org/show_bug.cgi?id=239019
+
+        Reviewed by Darin Adler.
+
+        * web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt:
+        * web-platform-tests/css/css-values/hypot-pow-sqrt-serialize-expected.txt:
+        * web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt:
+        * web-platform-tests/css/css-values/minmax-length-percent-serialize-expected.txt:
+        * web-platform-tests/css/css-values/minmax-length-serialize-expected.txt:
+        * web-platform-tests/css/css-values/minmax-number-serialize-expected.txt:
+        * web-platform-tests/css/css-values/minmax-percentage-serialize-expected.txt:
+        * web-platform-tests/css/css-values/minmax-time-serialize-expected.txt:
+
 2022-04-14  Youenn Fablet  <you...@apple.com>
 
         Expose workers as service worker clients and implement registration matching for dedicated workers

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -10,7 +10,7 @@
 PASS e.style['opacity'] = "hypot(1 / )" should not set the property value
 PASS e.style['opacity'] = "hypot(1 2)" should not set the property value
 PASS e.style['opacity'] = "hypot(1, , 2)" should not set the property value
-FAIL e.style['opacity'] = "hypot(1, 2)" should not set the property value assert_equals: expected "" but got "hypot(2.236068)"
+FAIL e.style['opacity'] = "hypot(1, 2)" should not set the property value assert_equals: expected "" but got "calc(2.236068)"
 PASS e.style['opacity'] = "sqrt()" should not set the property value
 PASS e.style['opacity'] = "sqrt( )" should not set the property value
 PASS e.style['opacity'] = "sqrt(,)" should not set the property value

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-serialize-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-serialize-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-serialize-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -3,8 +3,8 @@
 FAIL 'scale(pow(1,1))' as a specified value should serialize as 'scale(calc(1))'. assert_equals: 'scale(pow(1,1))' and 'scale(calc(1))' should serialize the same in specified values. expected "scale(calc(1))" but got "scale(pow(1, 1))"
 PASS 'pow(1,1)' as a computed value should serialize as '1'.
 PASS 'scale(pow(1,1))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
-FAIL 'hypot(1)' as a specified value should serialize as 'calc(1)'. assert_equals: 'hypot(1)' and 'calc(1)' should serialize the same in specified values. expected "calc(1)" but got "hypot(1)"
-FAIL 'scale(hypot(1))' as a specified value should serialize as 'scale(calc(1))'. assert_equals: 'scale(hypot(1))' and 'scale(calc(1))' should serialize the same in specified values. expected "scale(calc(1))" but got "scale(hypot(1))"
+PASS 'hypot(1)' as a specified value should serialize as 'calc(1)'.
+PASS 'scale(hypot(1))' as a specified value should serialize as 'scale(calc(1))'.
 PASS 'hypot(1)' as a computed value should serialize as '1'.
 PASS 'scale(hypot(1))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
 FAIL 'sqrt(1)' as a specified value should serialize as 'calc(1)'. assert_equals: 'sqrt(1)' and 'calc(1)' should serialize the same in specified values. expected "calc(1)" but got "sqrt(1)"

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,31 +1,31 @@
 
-FAIL 'rotate(min(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
+PASS 'rotate(min(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(min(90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(min(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
+PASS 'rotate(min(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(min(.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(min(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(100grad))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
+PASS 'rotate(min(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(min(100grad))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(max(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
+PASS 'rotate(max(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(max(90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(max(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
+PASS 'rotate(max(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(max(.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(max(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(100grad))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
+PASS 'rotate(max(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(max(100grad))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(min(90deg, 92deg, 93deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(90deg, 92deg, 93deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
+PASS 'rotate(min(90deg, 92deg, 93deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(min(90deg, 92deg, 93deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(min(93deg, 92deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(93deg, 92deg, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
+PASS 'rotate(min(93deg, 92deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(min(93deg, 92deg, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(min(90deg, 1.58rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(90deg, 1.58rad, 0.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
+PASS 'rotate(min(90deg, 1.58rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(min(90deg, 1.58rad, 0.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(min(0.25turn, 1.58rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(0.25turn, 1.58rad, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
+PASS 'rotate(min(0.25turn, 1.58rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(min(0.25turn, 1.58rad, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(max(81deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(81deg, 82deg, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
+PASS 'rotate(max(81deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(max(81deg, 82deg, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(max(83deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(83deg, 82deg, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
+PASS 'rotate(max(83deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(max(83deg, 82deg, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(max(90deg, 1.57rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(90deg, 1.57rad, 0.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
+PASS 'rotate(max(90deg, 1.57rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(max(90deg, 1.57rad, 0.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
-FAIL 'rotate(max(0.25turn, 1.57rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(0.25turn, 1.57rad, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
+PASS 'rotate(max(0.25turn, 1.57rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(max(0.25turn, 1.57rad, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
 PASS 'rotate(calc(min(30deg) + max(60deg)))' as a specified value should serialize as 'rotate(calc(90deg))'.
 PASS 'rotate(calc(min(30deg) + max(60deg)))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-percent-serialize-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-percent-serialize-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-percent-serialize-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,8 +1,8 @@
 
-FAIL 'min(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'min(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "min(1px)"
+PASS 'min(1px)' as a specified value should serialize as 'calc(1px)'.
 PASS 'min(1px)' as a computed value should serialize as '1px'.
 PASS 'min(1px)' as a used value should serialize as '1px'.
-FAIL 'max(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'max(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "max(1px)"
+PASS 'max(1px)' as a specified value should serialize as 'calc(1px)'.
 PASS 'max(1px)' as a computed value should serialize as '1px'.
 PASS 'max(1px)' as a used value should serialize as '1px'.
 PASS 'min(1% + 1px)' as a specified value should serialize as 'min(1% + 1px)'.

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-serialize-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-serialize-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-serialize-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,17 +1,17 @@
 
-FAIL 'min(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'min(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "min(1px)"
+PASS 'min(1px)' as a specified value should serialize as 'calc(1px)'.
 PASS 'min(1px)' as a computed value should serialize as '1px'.
-FAIL 'min(1in)' as a specified value should serialize as 'calc(96px)'. assert_equals: 'min(1in)' and 'calc(96px)' should serialize the same in specified values. expected "calc(96px)" but got "min(96px)"
+PASS 'min(1in)' as a specified value should serialize as 'calc(96px)'.
 PASS 'min(1in)' as a computed value should serialize as '96px'.
-FAIL 'max(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'max(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "max(1px)"
+PASS 'max(1px)' as a specified value should serialize as 'calc(1px)'.
 PASS 'max(1px)' as a computed value should serialize as '1px'.
-FAIL 'max(1in)' as a specified value should serialize as 'calc(96px)'. assert_equals: 'max(1in)' and 'calc(96px)' should serialize the same in specified values. expected "calc(96px)" but got "max(96px)"
+PASS 'max(1in)' as a specified value should serialize as 'calc(96px)'.
 PASS 'max(1in)' as a computed value should serialize as '96px'.
-FAIL 'min(1PX)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'min(1PX)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "min(1px)"
+PASS 'min(1PX)' as a specified value should serialize as 'calc(1px)'.
 PASS 'min(1PX)' as a computed value should serialize as '1px'.
-FAIL 'min(50px, 1in + 1px)' as a specified value should serialize as 'calc(50px)'. assert_equals: 'min(50px, 1in + 1px)' and 'calc(50px)' should serialize the same in specified values. expected "calc(50px)" but got "min(50px)"
+PASS 'min(50px, 1in + 1px)' as a specified value should serialize as 'calc(50px)'.
 PASS 'min(50px, 1in + 1px)' as a computed value should serialize as '50px'.
-FAIL 'max(50px, 1in + 1px)' as a specified value should serialize as 'calc(97px)'. assert_equals: 'max(50px, 1in + 1px)' and 'calc(97px)' should serialize the same in specified values. expected "calc(97px)" but got "max(97px)"
+PASS 'max(50px, 1in + 1px)' as a specified value should serialize as 'calc(97px)'.
 PASS 'max(50px, 1in + 1px)' as a computed value should serialize as '97px'.
 PASS 'calc(1px + min(1in, 100px))' as a specified value should serialize as 'calc(97px)'.
 PASS 'calc(1px + min(1in, 100px))' as a computed value should serialize as '97px'.

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-number-serialize-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-number-serialize-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-number-serialize-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,26 +1,26 @@
 
-FAIL 'min(.1)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'min(.1)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "min(0.1)"
-FAIL 'scale(min(.1))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(min(.1))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(min(0.1))"
+PASS 'min(.1)' as a specified value should serialize as 'calc(0.1)'.
+PASS 'scale(min(.1))' as a specified value should serialize as 'scale(calc(0.1))'.
 PASS 'min(.1)' as a computed value should serialize as '0.1'.
 PASS 'scale(min(.1))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
-FAIL 'max(.1)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'max(.1)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "max(0.1)"
-FAIL 'scale(max(.1))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(max(.1))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(max(0.1))"
+PASS 'max(.1)' as a specified value should serialize as 'calc(0.1)'.
+PASS 'scale(max(.1))' as a specified value should serialize as 'scale(calc(0.1))'.
 PASS 'max(.1)' as a computed value should serialize as '0.1'.
 PASS 'scale(max(.1))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
-FAIL 'min(.1, .2, .3)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'min(.1, .2, .3)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "min(0.1)"
-FAIL 'scale(min(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(min(.1, .2, .3))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(min(0.1))"
+PASS 'min(.1, .2, .3)' as a specified value should serialize as 'calc(0.1)'.
+PASS 'scale(min(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.1))'.
 PASS 'min(.1, .2, .3)' as a computed value should serialize as '0.1'.
 PASS 'scale(min(.1, .2, .3))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
-FAIL 'max(.1, .2, .3)' as a specified value should serialize as 'calc(0.3)'. assert_equals: 'max(.1, .2, .3)' and 'calc(0.3)' should serialize the same in specified values. expected "calc(0.3)" but got "max(0.3)"
-FAIL 'scale(max(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.3))'. assert_equals: 'scale(max(.1, .2, .3))' and 'scale(calc(0.3))' should serialize the same in specified values. expected "scale(calc(0.3))" but got "scale(max(0.3))"
+PASS 'max(.1, .2, .3)' as a specified value should serialize as 'calc(0.3)'.
+PASS 'scale(max(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.3))'.
 PASS 'max(.1, .2, .3)' as a computed value should serialize as '0.3'.
 PASS 'scale(max(.1, .2, .3))' as a computed value should serialize as 'matrix(0.3, 0, 0, 0.3, 0, 0)'.
-FAIL 'min(.3, .2, .1)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'min(.3, .2, .1)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "min(0.1)"
-FAIL 'scale(min(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(min(.3, .2, .1))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(min(0.1))"
+PASS 'min(.3, .2, .1)' as a specified value should serialize as 'calc(0.1)'.
+PASS 'scale(min(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.1))'.
 PASS 'min(.3, .2, .1)' as a computed value should serialize as '0.1'.
 PASS 'scale(min(.3, .2, .1))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
-FAIL 'max(.3, .2, .1)' as a specified value should serialize as 'calc(0.3)'. assert_equals: 'max(.3, .2, .1)' and 'calc(0.3)' should serialize the same in specified values. expected "calc(0.3)" but got "max(0.3)"
-FAIL 'scale(max(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.3))'. assert_equals: 'scale(max(.3, .2, .1))' and 'scale(calc(0.3))' should serialize the same in specified values. expected "scale(calc(0.3))" but got "scale(max(0.3))"
+PASS 'max(.3, .2, .1)' as a specified value should serialize as 'calc(0.3)'.
+PASS 'scale(max(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.3))'.
 PASS 'max(.3, .2, .1)' as a computed value should serialize as '0.3'.
 PASS 'scale(max(.3, .2, .1))' as a computed value should serialize as 'matrix(0.3, 0, 0, 0.3, 0, 0)'.
 PASS 'calc(min(.1) + min(.2))' as a specified value should serialize as 'calc(0.3)'.

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-percentage-serialize-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-percentage-serialize-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-percentage-serialize-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,24 +1,24 @@
 
-FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)"
-FAIL 'min(1%)' as a computed value should serialize as '1%'. assert_equals: 'min(1%)' and '1%' should serialize the same in computed values. expected "1%" but got "min(1%)"
+PASS 'min(1%)' as a specified value should serialize as 'calc(1%)'.
+PASS 'min(1%)' as a computed value should serialize as '1%'.
 PASS 'min(1%)' as a used value should serialize as '1px'.
-FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)"
-FAIL 'max(1%)' as a computed value should serialize as '1%'. assert_equals: 'max(1%)' and '1%' should serialize the same in computed values. expected "1%" but got "max(1%)"
+PASS 'max(1%)' as a specified value should serialize as 'calc(1%)'.
+PASS 'max(1%)' as a computed value should serialize as '1%'.
 PASS 'max(1%)' as a used value should serialize as '1px'.
-FAIL 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in specified values. expected "min(1%, 2%, 3%)" but got "min(1%)"
-FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "min(1%)"
+FAIL 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in specified values. expected "min(1%, 2%, 3%)" but got "calc(1%)"
+FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%"
 PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'.
-FAIL 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in specified values. expected "min(3%, 2%, 1%)" but got "min(1%)"
-FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "min(1%)"
+FAIL 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in specified values. expected "min(3%, 2%, 1%)" but got "calc(1%)"
+FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%"
 PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'.
-FAIL 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in specified values. expected "max(1%, 2%, 3%)" but got "max(3%)"
-FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "max(3%)"
+FAIL 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in specified values. expected "max(1%, 2%, 3%)" but got "calc(3%)"
+FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%"
 PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'.
-FAIL 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in specified values. expected "max(3%, 2%, 1%)" but got "max(3%)"
-FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "max(3%)"
+FAIL 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in specified values. expected "max(3%, 2%, 1%)" but got "calc(3%)"
+FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%"
 PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'.
 PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'.
-FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1%) 0px"
+FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "calc(1%) 0px"
 PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(15%)'.
 PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as '15%'.
 PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'.

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-time-serialize-expected.txt (292892 => 292893)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-time-serialize-expected.txt	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-time-serialize-expected.txt	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,23 +1,23 @@
 
-FAIL 'min(1ms)' as a specified value should serialize as 'calc(0.001s)'. assert_equals: 'min(1ms)' and 'calc(0.001s)' should serialize the same in specified values. expected "calc(0.001s)" but got "min(0.001s)"
+PASS 'min(1ms)' as a specified value should serialize as 'calc(0.001s)'.
 PASS 'min(1ms)' as a computed value should serialize as '0.001s'.
-FAIL 'min(1s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'min(1s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "min(1s)"
+PASS 'min(1s)' as a specified value should serialize as 'calc(1s)'.
 PASS 'min(1s)' as a computed value should serialize as '1s'.
-FAIL 'max(1ms)' as a specified value should serialize as 'calc(0.001s)'. assert_equals: 'max(1ms)' and 'calc(0.001s)' should serialize the same in specified values. expected "calc(0.001s)" but got "max(0.001s)"
+PASS 'max(1ms)' as a specified value should serialize as 'calc(0.001s)'.
 PASS 'max(1ms)' as a computed value should serialize as '0.001s'.
-FAIL 'max(1s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'max(1s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "max(1s)"
+PASS 'max(1s)' as a specified value should serialize as 'calc(1s)'.
 PASS 'max(1s)' as a computed value should serialize as '1s'.
-FAIL 'min(1s, 2s, 3s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'min(1s, 2s, 3s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "min(1s)"
+PASS 'min(1s, 2s, 3s)' as a specified value should serialize as 'calc(1s)'.
 PASS 'min(1s, 2s, 3s)' as a computed value should serialize as '1s'.
-FAIL 'min(3s, 2s, 1s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'min(3s, 2s, 1s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "min(1s)"
+PASS 'min(3s, 2s, 1s)' as a specified value should serialize as 'calc(1s)'.
 PASS 'min(3s, 2s, 1s)' as a computed value should serialize as '1s'.
-FAIL 'max(1s, 2s, 3s)' as a specified value should serialize as 'calc(3s)'. assert_equals: 'max(1s, 2s, 3s)' and 'calc(3s)' should serialize the same in specified values. expected "calc(3s)" but got "max(3s)"
+PASS 'max(1s, 2s, 3s)' as a specified value should serialize as 'calc(3s)'.
 PASS 'max(1s, 2s, 3s)' as a computed value should serialize as '3s'.
-FAIL 'max(3s, 2s, 1s)' as a specified value should serialize as 'calc(3s)'. assert_equals: 'max(3s, 2s, 1s)' and 'calc(3s)' should serialize the same in specified values. expected "calc(3s)" but got "max(3s)"
+PASS 'max(3s, 2s, 1s)' as a specified value should serialize as 'calc(3s)'.
 PASS 'max(3s, 2s, 1s)' as a computed value should serialize as '3s'.
-FAIL 'min(900ms, 1s)' as a specified value should serialize as 'calc(0.9s)'. assert_equals: 'min(900ms, 1s)' and 'calc(0.9s)' should serialize the same in specified values. expected "calc(0.9s)" but got "min(0.9s)"
+PASS 'min(900ms, 1s)' as a specified value should serialize as 'calc(0.9s)'.
 PASS 'min(900ms, 1s)' as a computed value should serialize as '0.9s'.
-FAIL 'max(1100ms, 1s)' as a specified value should serialize as 'calc(1.1s)'. assert_equals: 'max(1100ms, 1s)' and 'calc(1.1s)' should serialize the same in specified values. expected "calc(1.1s)" but got "max(1.1s)"
+PASS 'max(1100ms, 1s)' as a specified value should serialize as 'calc(1.1s)'.
 PASS 'max(1100ms, 1s)' as a computed value should serialize as '1.1s'.
 PASS 'calc(min(1s, 2s) + max(3s, 4s) + 10s)' as a specified value should serialize as 'calc(15s)'.
 PASS 'calc(min(1s, 2s) + max(3s, 4s) + 10s)' as a computed value should serialize as '15s'.

Modified: trunk/Source/WebCore/ChangeLog (292892 => 292893)


--- trunk/Source/WebCore/ChangeLog	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/Source/WebCore/ChangeLog	2022-04-14 23:32:40 UTC (rev 292893)
@@ -1,3 +1,17 @@
+2022-04-14  Nikolaos Mouchtaris  <nmouchta...@apple.com>
+
+        calc(): Serialize top level min/max/hypot as calc()
+        https://bugs.webkit.org/show_bug.cgi?id=239019
+
+        Reviewed by Darin Adler.
+
+        For functions that would have no effect on the top level value, serialize as calc() rather
+        than the function.
+
+        * css/calc/CSSCalcOperationNode.cpp:
+        (WebCore::CSSCalcOperationNode::simplifyNode):
+        * css/calc/CSSCalcOperationNode.h:
+
 2022-04-14  Gabriel Nava Marino  <gnavamar...@apple.com>
 
         WebCore::WorkerStorageConnection::fileSystemGetDirectory could have invalid storageConnection()

Modified: trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp (292892 => 292893)


--- trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp	2022-04-14 23:32:40 UTC (rev 292893)
@@ -866,6 +866,13 @@
     return simplifyNode(WTFMove(rootNode), depth);
 }
 
+inline void CSSCalcOperationNode::makeTopLevelCalc()
+{
+    // Top level calc nodes where we need not preserve the function are changed into add nodes because
+    // that’s the best way to make them serialize as "calc(xxx)".
+    m_operator = CalcOperator::Add;
+}
+
 Ref<CSSCalcExpressionNode> CSSCalcOperationNode::simplifyNode(Ref<CSSCalcExpressionNode>&& rootNode, int depth)
 {
     if (is<CSSCalcPrimitiveValueNode>(rootNode)) {
@@ -901,7 +908,7 @@
             calcOperationNode.combineChildren();
 
         // If only one child remains, return the child (except at the root).
-        auto shouldCombineParentWithOnlyChild = [](const CSSCalcOperationNode& parent, int depth)
+        auto shouldCombineParentWithOnlyChild = [](CSSCalcOperationNode& parent, int depth)
         {
             if (parent.children().size() != 1)
                 return false;
@@ -909,6 +916,11 @@
             // Always simplify below the root.
             if (depth)
                 return true;
+            
+            if (parent.shouldNotPreserveFunction() && is<CSSCalcPrimitiveValueNode>(parent.children()[0])) {
+                parent.makeTopLevelCalc();
+                return false;
+            }
 
             // At the root, preserve the root function by only merging nodes with the same function.
             auto& child = parent.children().first();

Modified: trunk/Source/WebCore/css/calc/CSSCalcOperationNode.h (292892 => 292893)


--- trunk/Source/WebCore/css/calc/CSSCalcOperationNode.h	2022-04-14 23:26:34 UTC (rev 292892)
+++ trunk/Source/WebCore/css/calc/CSSCalcOperationNode.h	2022-04-14 23:32:40 UTC (rev 292893)
@@ -142,6 +142,8 @@
         return m_isRoot == IsRoot::No ? result : convertToTopLevelValue(result);
     }
 
+    void makeTopLevelCalc();
+    bool shouldNotPreserveFunction() const { return isMinOrMaxNode() || isHypotNode(); }
     static double evaluateOperator(CalcOperator, const Vector<double>&);
     static Ref<CSSCalcExpressionNode> simplifyNode(Ref<CSSCalcExpressionNode>&&, int depth);
     static Ref<CSSCalcExpressionNode> simplifyRecursive(Ref<CSSCalcExpressionNode>&&, int depth);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to