Title: [283063] trunk
Revision
283063
Author
[email protected]
Date
2021-09-24 15:35:01 -0700 (Fri, 24 Sep 2021)

Log Message

Implement abs,sign calc functions
https://bugs.webkit.org/show_bug.cgi?id=229786

Patch by Nikos Mouchtaris <[email protected]> on 2021-09-24
Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-values/signs-abs-computed-expected.txt: Added.
* web-platform-tests/css/css-values/signs-abs-computed.html: Added.
* web-platform-tests/css/css-values/signs-abs-invalid-expected.txt: Added.
* web-platform-tests/css/css-values/signs-abs-invalid.html: Added.
* web-platform-tests/css/css-values/signs-abs-serialize-expected.txt: Added.
* web-platform-tests/css/css-values/signs-abs-serialize.html: Added.

Source/WebCore:

Added support for calc functions sign and abs. Involved adding new css keywords and handling
for parsing calc _expression_ and computing the resulting value. Spec for these functions:
https://drafts.csswg.org/css-values-4/#sign-funcs.

Tests: imported/w3c/web-platform-tests/css/css-values/signs-abs-computed.html
       imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid.html
       imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize.html

* css/CSSValueKeywords.in:
* css/calc/CSSCalcExpressionNodeParser.cpp:
(WebCore::CSSCalcExpressionNodeParser::parseCalcFunction):
* css/calc/CSSCalcOperationNode.cpp:
(WebCore::determineCategory):
(WebCore::functionFromOperator):
(WebCore::CSSCalcOperationNode::createSign):
(WebCore::CSSCalcOperationNode::combineChildren):
(WebCore::CSSCalcOperationNode::simplifyNode):
(WebCore::CSSCalcOperationNode::doubleValue const):
(WebCore::functionPrefixForOperator):
(WebCore::CSSCalcOperationNode::evaluateOperator):
* css/calc/CSSCalcOperationNode.h:
* css/calc/CSSCalcValue.cpp:
(WebCore::createCSS):
(WebCore::CSSCalcValue::isCalcFunction):
* platform/calc/CalcExpressionOperation.cpp:
(WebCore::CalcExpressionOperation::evaluate const):
* platform/calc/CalcOperator.cpp:
(WebCore::operator<<):
* platform/calc/CalcOperator.h:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (283062 => 283063)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-09-24 22:35:01 UTC (rev 283063)
@@ -1,3 +1,17 @@
+2021-09-24  Nikos Mouchtaris  <[email protected]>
+
+        Implement abs,sign calc functions
+        https://bugs.webkit.org/show_bug.cgi?id=229786
+
+        Reviewed by Simon Fraser.
+
+        * web-platform-tests/css/css-values/signs-abs-computed-expected.txt: Added.
+        * web-platform-tests/css/css-values/signs-abs-computed.html: Added.
+        * web-platform-tests/css/css-values/signs-abs-invalid-expected.txt: Added.
+        * web-platform-tests/css/css-values/signs-abs-invalid.html: Added.
+        * web-platform-tests/css/css-values/signs-abs-serialize-expected.txt: Added.
+        * web-platform-tests/css/css-values/signs-abs-serialize.html: Added.
+
 2021-09-24  Myles C. Maxfield  <[email protected]>
 
         Color keywords in override-color cause a crash

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-computed-expected.txt (0 => 283063)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-computed-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-computed-expected.txt	2021-09-24 22:35:01 UTC (rev 283063)
@@ -0,0 +1,144 @@
+
+PASS abs(1) should be used-value-equivalent to 1
+PASS sign(1) should be used-value-equivalent to 1
+PASS abs(-1) should be used-value-equivalent to 1
+PASS sign(-1) should be used-value-equivalent to -1
+PASS abs(sign(1)) should be used-value-equivalent to 1
+PASS abs(sign(sign(1))) should be used-value-equivalent to 1
+PASS sign(sign(sign(1) + sign(1))) should be used-value-equivalent to 1
+PASS calc(abs(0.1 + 0.2) + 0.05) should be used-value-equivalent to 0.35
+PASS calc(sign(0.1 + 0.2) - 0.05) should be used-value-equivalent to 0.95
+PASS calc(abs(0.1 + 0.2) * 2) should be used-value-equivalent to 0.6
+PASS calc(abs(sign(0.1) + 0.2) / 2) should be used-value-equivalent to 0.6
+PASS calc(abs(0.1 + 0.2) * -2) should be used-value-equivalent to -0.6
+PASS calc(sign(0.1 - 0.2) - 0.05) should be used-value-equivalent to -1.05
+PASS calc(sign(1) + sign(1) - 0.05) should be used-value-equivalent to 1.95
+PASS calc(sign(-0)) should be used-value-equivalent to -0
+PASS calc(sign(0)) should be used-value-equivalent to 0
+PASS sign(1px) should be used-value-equivalent to 1
+PASS sign(1cm) should be used-value-equivalent to 1
+PASS sign(1mm) should be used-value-equivalent to 1
+PASS sign(1Q) should be used-value-equivalent to 1
+PASS sign(1in) should be used-value-equivalent to 1
+PASS sign(1pc) should be used-value-equivalent to 1
+PASS sign(1pt) should be used-value-equivalent to 1
+PASS sign(1em) should be used-value-equivalent to 1
+PASS sign(1ex) should be used-value-equivalent to 1
+PASS sign(1ch) should be used-value-equivalent to 1
+PASS sign(1rem) should be used-value-equivalent to 1
+PASS sign(1vh) should be used-value-equivalent to 1
+PASS sign(1vw) should be used-value-equivalent to 1
+PASS sign(1vmin) should be used-value-equivalent to 1
+PASS sign(1vmax) should be used-value-equivalent to 1
+PASS sign(-1px) should be used-value-equivalent to -1
+PASS sign(-1cm) should be used-value-equivalent to -1
+PASS sign(-1mm) should be used-value-equivalent to -1
+PASS sign(-1Q) should be used-value-equivalent to -1
+PASS sign(-1in) should be used-value-equivalent to -1
+PASS sign(-1pc) should be used-value-equivalent to -1
+PASS sign(-1pt) should be used-value-equivalent to -1
+PASS sign(-1em) should be used-value-equivalent to -1
+PASS sign(-1ex) should be used-value-equivalent to -1
+PASS sign(-1ch) should be used-value-equivalent to -1
+PASS sign(-1rem) should be used-value-equivalent to -1
+PASS sign(-1vh) should be used-value-equivalent to -1
+PASS sign(-1vw) should be used-value-equivalent to -1
+PASS sign(-1vmin) should be used-value-equivalent to -1
+PASS sign(-1vmax) should be used-value-equivalent to -1
+PASS sign(1s) should be used-value-equivalent to 1
+PASS sign(1ms) should be used-value-equivalent to 1
+PASS sign(-1s) should be used-value-equivalent to -1
+PASS sign(-1ms) should be used-value-equivalent to -1
+PASS sign(1deg) should be used-value-equivalent to 1
+PASS sign(1grad) should be used-value-equivalent to 1
+PASS sign(1rad) should be used-value-equivalent to 1
+PASS sign(1turn) should be used-value-equivalent to 1
+PASS sign(-1deg) should be used-value-equivalent to -1
+PASS sign(-1grad) should be used-value-equivalent to -1
+PASS sign(-1rad) should be used-value-equivalent to -1
+PASS sign(-1turn) should be used-value-equivalent to -1
+PASS sign(0px) should be used-value-equivalent to 0
+PASS sign(0cm) should be used-value-equivalent to 0
+PASS sign(0mm) should be used-value-equivalent to 0
+PASS sign(0Q) should be used-value-equivalent to 0
+PASS sign(0in) should be used-value-equivalent to 0
+PASS sign(0pc) should be used-value-equivalent to 0
+PASS sign(0pt) should be used-value-equivalent to 0
+PASS sign(0em) should be used-value-equivalent to 0
+PASS sign(0ex) should be used-value-equivalent to 0
+PASS sign(0ch) should be used-value-equivalent to 0
+PASS sign(0rem) should be used-value-equivalent to 0
+PASS sign(0vh) should be used-value-equivalent to 0
+PASS sign(0vw) should be used-value-equivalent to 0
+PASS sign(0vmin) should be used-value-equivalent to 0
+PASS sign(0vmax) should be used-value-equivalent to 0
+PASS sign(-0px) should be used-value-equivalent to -0
+PASS sign(-0cm) should be used-value-equivalent to -0
+PASS sign(-0mm) should be used-value-equivalent to -0
+PASS sign(-0Q) should be used-value-equivalent to -0
+PASS sign(-0in) should be used-value-equivalent to -0
+PASS sign(-0pc) should be used-value-equivalent to -0
+PASS sign(-0pt) should be used-value-equivalent to -0
+PASS sign(-0em) should be used-value-equivalent to -0
+PASS sign(-0ex) should be used-value-equivalent to -0
+PASS sign(-0ch) should be used-value-equivalent to -0
+PASS sign(-0rem) should be used-value-equivalent to -0
+PASS sign(-0vh) should be used-value-equivalent to -0
+PASS sign(-0vw) should be used-value-equivalent to -0
+PASS sign(-0vmin) should be used-value-equivalent to -0
+PASS sign(-0vmax) should be used-value-equivalent to -0
+PASS sign(0s) should be used-value-equivalent to 0
+PASS sign(0ms) should be used-value-equivalent to 0
+PASS sign(-0s) should be used-value-equivalent to 0
+PASS sign(-0ms) should be used-value-equivalent to 0
+PASS sign(0deg) should be used-value-equivalent to 0
+PASS sign(0grad) should be used-value-equivalent to 0
+PASS sign(0rad) should be used-value-equivalent to 0
+PASS sign(0turn) should be used-value-equivalent to 0
+PASS sign(-0deg) should be used-value-equivalent to -0
+PASS sign(-0grad) should be used-value-equivalent to -0
+PASS sign(-0rad) should be used-value-equivalent to -0
+PASS sign(-0turn) should be used-value-equivalent to -0
+PASS abs(1px) should be used-value-equivalent to 1px
+PASS abs(1cm) should be used-value-equivalent to 1cm
+PASS abs(1mm) should be used-value-equivalent to 1mm
+PASS abs(1Q) should be used-value-equivalent to 1Q
+PASS abs(1in) should be used-value-equivalent to 1in
+PASS abs(1pc) should be used-value-equivalent to 1pc
+PASS abs(1pt) should be used-value-equivalent to 1pt
+PASS abs(1em) should be used-value-equivalent to 1em
+PASS abs(1ex) should be used-value-equivalent to 1ex
+PASS abs(1ch) should be used-value-equivalent to 1ch
+PASS abs(1rem) should be used-value-equivalent to 1rem
+PASS abs(1vh) should be used-value-equivalent to 1vh
+PASS abs(1vw) should be used-value-equivalent to 1vw
+PASS abs(1vmin) should be used-value-equivalent to 1vmin
+PASS abs(1vmax) should be used-value-equivalent to 1vmax
+PASS abs(-1px) should be used-value-equivalent to 1px
+PASS abs(-1cm) should be used-value-equivalent to 1cm
+PASS abs(-1mm) should be used-value-equivalent to 1mm
+PASS abs(-1Q) should be used-value-equivalent to 1Q
+PASS abs(-1in) should be used-value-equivalent to 1in
+PASS abs(-1pc) should be used-value-equivalent to 1pc
+PASS abs(-1pt) should be used-value-equivalent to 1pt
+PASS abs(-1em) should be used-value-equivalent to 1em
+PASS abs(-1ex) should be used-value-equivalent to 1ex
+PASS abs(-1ch) should be used-value-equivalent to 1ch
+PASS abs(-1rem) should be used-value-equivalent to 1rem
+PASS abs(-1vh) should be used-value-equivalent to 1vh
+PASS abs(-1vw) should be used-value-equivalent to 1vw
+PASS abs(-1vmin) should be used-value-equivalent to 1vmin
+PASS abs(-1vmax) should be used-value-equivalent to 1vmax
+PASS abs(1s) should be used-value-equivalent to 1s
+PASS abs(1ms) should be used-value-equivalent to 1ms
+PASS abs(-1s) should be used-value-equivalent to 1s
+PASS abs(-1ms) should be used-value-equivalent to 1ms
+PASS abs(1deg) should be used-value-equivalent to 1deg
+PASS abs(1grad) should be used-value-equivalent to 1grad
+PASS abs(1rad) should be used-value-equivalent to 1rad
+PASS abs(1turn) should be used-value-equivalent to 1turn
+PASS abs(-1deg) should be used-value-equivalent to 1deg
+PASS abs(-1grad) should be used-value-equivalent to 1grad
+PASS abs(-1rad) should be used-value-equivalent to 1rad
+PASS abs(-1turn) should be used-value-equivalent to 1turn
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-computed.html (0 => 283063)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-computed.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-computed.html	2021-09-24 22:35:01 UTC (rev 283063)
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="author" title="Apple Inc">
+<script src=""
+<script src=""
+<script src=""
+<div id="target"></div>
+<script>
+// Identity tests
+test_math_used('abs(1)', '1', {type:'number'});
+test_math_used('sign(1)', '1', {type:'number'});
+test_math_used('abs(-1)', '1', {type:'number'});
+test_math_used('sign(-1)', '-1', {type:'number'});
+
+// Nestings
+test_math_used('abs(sign(1))', '1');
+test_math_used('abs(sign(sign(1)))', '1');
+test_math_used('sign(sign(sign(1) + sign(1)))', '1');
+
+// General calculations
+test_math_used('calc(abs(0.1 + 0.2) + 0.05)', '0.35', {type:'number', approx:0.1});
+test_math_used('calc(sign(0.1 + 0.2) - 0.05)', '0.95', {type:'number', approx:0.1});
+test_math_used('calc(abs(0.1 + 0.2) * 2)', '0.6', {type:'number', approx:0.1});
+test_math_used('calc(abs(sign(0.1) + 0.2) / 2)', '0.6', {type:'number', approx:0.1});
+test_math_used('calc(abs(0.1 + 0.2) * -2)', '-0.6', {type:'number', approx:0.1});
+test_math_used('calc(sign(0.1 - 0.2) - 0.05)', '-1.05', {type:'number', approx:0.1});
+test_math_used('calc(sign(1) + sign(1) - 0.05)', '1.95', {type:'number', approx:0.1});
+
+// Test sign for zero
+test_math_used('calc(sign(-0))', '-0', {type:'number'});
+test_math_used('calc(sign(0))', '0', {type:'number'});
+
+//Type checking sign
+test_math_used('sign(1px)', '1');
+test_math_used('sign(1cm)', '1');
+test_math_used('sign(1mm)', '1');
+test_math_used('sign(1Q)', '1');
+test_math_used('sign(1in)', '1');
+test_math_used('sign(1pc)', '1');
+test_math_used('sign(1pt)', '1');
+test_math_used('sign(1em)', '1');
+test_math_used('sign(1ex)', '1');
+test_math_used('sign(1ch)', '1');
+test_math_used('sign(1rem)', '1');
+test_math_used('sign(1vh)', '1');
+test_math_used('sign(1vw)', '1');
+test_math_used('sign(1vmin)', '1');
+test_math_used('sign(1vmax)', '1');
+test_math_used('sign(-1px)', '-1');
+test_math_used('sign(-1cm)', '-1');
+test_math_used('sign(-1mm)', '-1');
+test_math_used('sign(-1Q)', '-1');
+test_math_used('sign(-1in)', '-1');
+test_math_used('sign(-1pc)', '-1');
+test_math_used('sign(-1pt)', '-1');
+test_math_used('sign(-1em)', '-1');
+test_math_used('sign(-1ex)', '-1');
+test_math_used('sign(-1ch)', '-1');
+test_math_used('sign(-1rem)', '-1');
+test_math_used('sign(-1vh)', '-1');
+test_math_used('sign(-1vw)', '-1');
+test_math_used('sign(-1vmin)', '-1');
+test_math_used('sign(-1vmax)', '-1');
+test_math_used('sign(1s)', '1');
+test_math_used('sign(1ms)', '1');
+test_math_used('sign(-1s)', '-1');
+test_math_used('sign(-1ms)', '-1');
+test_math_used('sign(1deg)', '1');
+test_math_used('sign(1grad)', '1');
+test_math_used('sign(1rad)', '1');
+test_math_used('sign(1turn)', '1');
+test_math_used('sign(-1deg)', '-1');
+test_math_used('sign(-1grad)', '-1');
+test_math_used('sign(-1rad)', '-1');
+test_math_used('sign(-1turn)', '-1');
+test_math_used('sign(0px)', '0');
+test_math_used('sign(0cm)', '0');
+test_math_used('sign(0mm)', '0');
+test_math_used('sign(0Q)', '0');
+test_math_used('sign(0in)', '0');
+test_math_used('sign(0pc)', '0');
+test_math_used('sign(0pt)', '0');
+test_math_used('sign(0em)', '0');
+test_math_used('sign(0ex)', '0');
+test_math_used('sign(0ch)', '0');
+test_math_used('sign(0rem)', '0');
+test_math_used('sign(0vh)', '0');
+test_math_used('sign(0vw)', '0');
+test_math_used('sign(0vmin)', '0');
+test_math_used('sign(0vmax)', '0');
+test_math_used('sign(-0px)', '-0');
+test_math_used('sign(-0cm)', '-0');
+test_math_used('sign(-0mm)', '-0');
+test_math_used('sign(-0Q)', '-0');
+test_math_used('sign(-0in)', '-0');
+test_math_used('sign(-0pc)', '-0');
+test_math_used('sign(-0pt)', '-0');
+test_math_used('sign(-0em)', '-0');
+test_math_used('sign(-0ex)', '-0');
+test_math_used('sign(-0ch)', '-0');
+test_math_used('sign(-0rem)', '-0');
+test_math_used('sign(-0vh)', '-0');
+test_math_used('sign(-0vw)', '-0');
+test_math_used('sign(-0vmin)', '-0');
+test_math_used('sign(-0vmax)', '-0');
+test_math_used('sign(0s)', '0');
+test_math_used('sign(0ms)', '0');
+test_math_used('sign(-0s)', '0');
+test_math_used('sign(-0ms)', '0');
+test_math_used('sign(0deg)', '0');
+test_math_used('sign(0grad)', '0');
+test_math_used('sign(0rad)', '0');
+test_math_used('sign(0turn)', '0');
+test_math_used('sign(-0deg)', '-0');
+test_math_used('sign(-0grad)', '-0');
+test_math_used('sign(-0rad)', '-0');
+test_math_used('sign(-0turn)', '-0');
+
+//Type checking abs
+test_math_used('abs(1px)', '1px');
+test_math_used('abs(1cm)', '1cm');
+test_math_used('abs(1mm)', '1mm');
+test_math_used('abs(1Q)', '1Q');
+test_math_used('abs(1in)', '1in');
+test_math_used('abs(1pc)', '1pc');
+test_math_used('abs(1pt)', '1pt');
+test_math_used('abs(1em)', '1em');
+test_math_used('abs(1ex)', '1ex');
+test_math_used('abs(1ch)', '1ch');
+test_math_used('abs(1rem)', '1rem');
+test_math_used('abs(1vh)', '1vh');
+test_math_used('abs(1vw)', '1vw');
+test_math_used('abs(1vmin)', '1vmin');
+test_math_used('abs(1vmax)', '1vmax');
+test_math_used('abs(-1px)', '1px');
+test_math_used('abs(-1cm)', '1cm');
+test_math_used('abs(-1mm)', '1mm');
+test_math_used('abs(-1Q)', '1Q');
+test_math_used('abs(-1in)', '1in');
+test_math_used('abs(-1pc)', '1pc');
+test_math_used('abs(-1pt)', '1pt');
+test_math_used('abs(-1em)', '1em');
+test_math_used('abs(-1ex)', '1ex');
+test_math_used('abs(-1ch)', '1ch');
+test_math_used('abs(-1rem)', '1rem');
+test_math_used('abs(-1vh)', '1vh');
+test_math_used('abs(-1vw)', '1vw');
+test_math_used('abs(-1vmin)', '1vmin');
+test_math_used('abs(-1vmax)', '1vmax');
+test_math_used('abs(1s)', '1s', {type:'time'});
+test_math_used('abs(1ms)', '1ms', {type:'time'});
+test_math_used('abs(-1s)', '1s', {type:'time'});
+test_math_used('abs(-1ms)', '1ms', {type:'time'});
+test_math_used('abs(1deg)', '1deg', {type:'angle', approx:0.001});
+test_math_used('abs(1grad)', '1grad', {type:'angle', approx:0.001});
+test_math_used('abs(1rad)', '1rad', {type:'angle', approx:0.001});
+test_math_used('abs(1turn)', '1turn', {type:'angle', approx:0.001});
+test_math_used('abs(-1deg)', '1deg', {type:'angle', approx:0.001});
+test_math_used('abs(-1grad)', '1grad', {type:'angle', approx:0.001});
+test_math_used('abs(-1rad)', '1rad', {type:'angle', approx:0.001});
+test_math_used('abs(-1turn)', '1turn', {type:'angle', approx:0.001});
+</script>
\ No newline at end of file

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid-expected.txt (0 => 283063)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid-expected.txt	2021-09-24 22:35:01 UTC (rev 283063)
@@ -0,0 +1,46 @@
+
+PASS e.style['opacity'] = "abs()" should not set the property value
+PASS e.style['opacity'] = "abs( )" should not set the property value
+PASS e.style['opacity'] = "abs(,)" should not set the property value
+PASS e.style['opacity'] = "abs(1, )" should not set the property value
+PASS e.style['opacity'] = "abs(, 1)" should not set the property value
+PASS e.style['opacity'] = "abs(1 + )" should not set the property value
+PASS e.style['opacity'] = "abs(1 - )" should not set the property value
+PASS e.style['opacity'] = "abs(1 * )" should not set the property value
+PASS e.style['opacity'] = "abs(1 / )" should not set the property value
+PASS e.style['opacity'] = "abs(1 2)" should not set the property value
+PASS e.style['opacity'] = "abs(1, , 2)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 2)" should not set the property value
+PASS e.style['opacity'] = "sign()" should not set the property value
+PASS e.style['opacity'] = "sign( )" should not set the property value
+PASS e.style['opacity'] = "sign(,)" should not set the property value
+PASS e.style['opacity'] = "sign(1, )" should not set the property value
+PASS e.style['opacity'] = "sign(, 1)" should not set the property value
+PASS e.style['opacity'] = "sign(1 + )" should not set the property value
+PASS e.style['opacity'] = "sign(1 - )" should not set the property value
+PASS e.style['opacity'] = "sign(1 * )" should not set the property value
+PASS e.style['opacity'] = "sign(1 / )" should not set the property value
+PASS e.style['opacity'] = "sign(1 2)" should not set the property value
+PASS e.style['opacity'] = "sign(1, , 2)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 2)" should not set the property value
+PASS e.style['opacity'] = "abs(0px)" should not set the property value
+PASS e.style['opacity'] = "abs(0s)" should not set the property value
+PASS e.style['opacity'] = "abs(0deg)" should not set the property value
+PASS e.style['opacity'] = "abs(0Hz)" should not set the property value
+PASS e.style['opacity'] = "abs(0dpi)" should not set the property value
+PASS e.style['opacity'] = "abs(0fr)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 1%)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 0px)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 0s)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 0deg)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 0Hz)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 0dpi)" should not set the property value
+PASS e.style['opacity'] = "abs(1, 0fr)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 1%)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 0px)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 0s)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 0deg)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 0Hz)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 0dpi)" should not set the property value
+PASS e.style['opacity'] = "sign(1, 0fr)" should not set the property value
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid.html (0 => 283063)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid.html	2021-09-24 22:35:01 UTC (rev 283063)
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="author" title="Apple Inc">
+<script src=""
+<script src=""
+<script src=""
+<script>
+function test_invalid_number(value) {
+  test_invalid_value('opacity', value);
+}
+
+// Syntax checking
+test_invalid_number('abs()');
+test_invalid_number('abs( )');
+test_invalid_number('abs(,)');
+test_invalid_number('abs(1, )');
+test_invalid_number('abs(, 1)');
+test_invalid_number('abs(1 + )');
+test_invalid_number('abs(1 - )');
+test_invalid_number('abs(1 * )');
+test_invalid_number('abs(1 / )');
+test_invalid_number('abs(1 2)');
+test_invalid_number('abs(1, , 2)');
+test_invalid_number('abs(1, 2)');
+test_invalid_number('sign()');
+test_invalid_number('sign( )');
+test_invalid_number('sign(,)');
+test_invalid_number('sign(1, )');
+test_invalid_number('sign(, 1)');
+test_invalid_number('sign(1 + )');
+test_invalid_number('sign(1 - )');
+test_invalid_number('sign(1 * )');
+test_invalid_number('sign(1 / )');
+test_invalid_number('sign(1 2)');
+test_invalid_number('sign(1, , 2)');
+test_invalid_number('sign(1, 2)');
+
+// Type checking
+test_invalid_number('abs(0px)');
+test_invalid_number('abs(0s)');
+test_invalid_number('abs(0deg)');
+test_invalid_number('abs(0Hz)');
+test_invalid_number('abs(0dpi)');
+test_invalid_number('abs(0fr)');
+test_invalid_number('abs(1, 1%)');
+test_invalid_number('abs(1, 0px)');
+test_invalid_number('abs(1, 0s)');
+test_invalid_number('abs(1, 0deg)');
+test_invalid_number('abs(1, 0Hz)');
+test_invalid_number('abs(1, 0dpi)');
+test_invalid_number('abs(1, 0fr)');
+test_invalid_number('sign(1, 1%)');
+test_invalid_number('sign(1, 0px)');
+test_invalid_number('sign(1, 0s)');
+test_invalid_number('sign(1, 0deg)');
+test_invalid_number('sign(1, 0Hz)');
+test_invalid_number('sign(1, 0dpi)');
+test_invalid_number('sign(1, 0fr)');
+</script>
\ No newline at end of file

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize-expected.txt (0 => 283063)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize-expected.txt	2021-09-24 22:35:01 UTC (rev 283063)
@@ -0,0 +1,34 @@
+
+FAIL 'abs(1)' as a specified value should serialize as 'calc(1)'. assert_equals: 'abs(1)' and 'calc(1)' should serialize the same in specified values. expected "calc(1)" but got "abs(1)"
+FAIL 'scale(abs(1))' as a specified value should serialize as 'scale(calc(1))'. assert_equals: 'scale(abs(1))' and 'scale(calc(1))' should serialize the same in specified values. expected "scale(calc(1))" but got "scale(abs(1))"
+PASS 'abs(1)' as a computed value should serialize as '1'.
+PASS 'scale(abs(1))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
+FAIL 'sign(.1)' as a specified value should serialize as 'calc(1)'. assert_equals: 'sign(.1)' and 'calc(1)' should serialize the same in specified values. expected "calc(1)" but got "sign(0.1)"
+FAIL 'scale(sign(.1))' as a specified value should serialize as 'scale(calc(1))'. assert_equals: 'scale(sign(.1))' and 'scale(calc(1))' should serialize the same in specified values. expected "scale(calc(1))" but got "scale(sign(0.1))"
+PASS 'sign(.1)' as a computed value should serialize as '1'.
+PASS 'scale(sign(.1))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
+FAIL 'abs(1 + 2 + 3)' as a specified value should serialize as 'calc(6)'. assert_equals: 'abs(1 + 2 + 3)' and 'calc(6)' should serialize the same in specified values. expected "calc(6)" but got "abs(6)"
+FAIL 'scale(abs(1 + 2 + 3))' as a specified value should serialize as 'scale(calc(6))'. assert_equals: 'scale(abs(1 + 2 + 3))' and 'scale(calc(6))' should serialize the same in specified values. expected "scale(calc(6))" but got "scale(abs(6))"
+FAIL 'abs(1 + 2 + 3)' as a computed value should serialize as '6'. assert_equals: '6' should round-trip exactly in computed values. expected "6" but got "1"
+PASS 'scale(abs(1 + 2 + 3))' as a computed value should serialize as 'matrix(6, 0, 0, 6, 0, 0)'.
+FAIL 'sign(1 + 2 + 3)' as a specified value should serialize as 'calc(1)'. assert_equals: 'sign(1 + 2 + 3)' and 'calc(1)' should serialize the same in specified values. expected "calc(1)" but got "sign(6)"
+FAIL 'scale(sign(1 + 2 + 3))' as a specified value should serialize as 'scale(calc(1))'. assert_equals: 'scale(sign(1 + 2 + 3))' and 'scale(calc(1))' should serialize the same in specified values. expected "scale(calc(1))" but got "scale(sign(6))"
+PASS 'sign(1 + 2 + 3)' as a computed value should serialize as '1'.
+PASS 'scale(sign(1 + 2 + 3))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
+PASS 'calc(abs(1) + abs(2))' as a specified value should serialize as 'calc(3)'.
+PASS 'scale(calc(abs(1) + abs(2)))' as a specified value should serialize as 'scale(calc(3))'.
+FAIL 'calc(abs(1) + abs(2))' as a computed value should serialize as '3'. assert_equals: '3' should round-trip exactly in computed values. expected "3" but got "1"
+PASS 'scale(calc(abs(1) + abs(2)))' as a computed value should serialize as 'matrix(3, 0, 0, 3, 0, 0)'.
+PASS 'calc(sign(.1) + sign(.2))' as a specified value should serialize as 'calc(2)'.
+PASS 'scale(calc(sign(.1) + sign(.2)))' as a specified value should serialize as 'scale(calc(2))'.
+FAIL 'calc(sign(.1) + sign(.2))' as a computed value should serialize as '2'. assert_equals: '2' should round-trip exactly in computed values. expected "2" but got "1"
+PASS 'scale(calc(sign(.1) + sign(.2)))' as a computed value should serialize as 'matrix(2, 0, 0, 2, 0, 0)'.
+PASS 'calc(1 + abs(1))' as a specified value should serialize as 'calc(2)'.
+PASS 'scale(calc(1 + abs(1)))' as a specified value should serialize as 'scale(calc(2))'.
+FAIL 'calc(1 + abs(1))' as a computed value should serialize as '2'. assert_equals: '2' should round-trip exactly in computed values. expected "2" but got "1"
+PASS 'scale(calc(1 + abs(1)))' as a computed value should serialize as 'matrix(2, 0, 0, 2, 0, 0)'.
+PASS 'calc(sign(.1) + 1)' as a specified value should serialize as 'calc(2)'.
+PASS 'scale(calc(sign(.1) + 1))' as a specified value should serialize as 'scale(calc(2))'.
+FAIL 'calc(sign(.1) + 1)' as a computed value should serialize as '2'. assert_equals: '2' should round-trip exactly in computed values. expected "2" but got "1"
+PASS 'scale(calc(sign(.1) + 1))' as a computed value should serialize as 'matrix(2, 0, 0, 2, 0, 0)'.
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize.html (0 => 283063)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize.html	2021-09-24 22:35:01 UTC (rev 283063)
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="help" href=""
+<link rel="author" title="Apple Inc">
+<script src=""
+<script src=""
+<script src=""
+<div id=target></div>
+<script>
+function test_serialization(t,s,c) {
+    test_specified_serialization('opacity', t, s);
+    test_specified_serialization('transform', `scale(${t})`, `scale(calc(${c}))`);
+    test_computed_serialization('opacity', t, c);
+    test_computed_serialization('transform', `scale(${t})`, `matrix(${c}, 0, 0, ${c}, 0, 0)`);
+}
+
+test_serialization(
+    'abs(1)',
+    'calc(1)',
+    '1');
+test_serialization(
+    'sign(.1)',
+    'calc(1)',
+    '1');
+
+test_serialization(
+    'abs(1 + 2 + 3)',
+    'calc(6)',
+    '6');
+test_serialization(
+    'sign(1 + 2 + 3)',
+    'calc(1)',
+    '1');
+
+test_serialization(
+    'calc(abs(1) + abs(2))',
+    'calc(3)',
+    '3');
+test_serialization(
+    'calc(sign(.1) + sign(.2))',
+    'calc(2)',
+    '2');
+
+test_serialization(
+    'calc(1 + abs(1))',
+    'calc(2)',
+    '2');
+test_serialization(
+    'calc(sign(.1) + 1)',
+    'calc(2)',
+    '2');
+</script>
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (283062 => 283063)


--- trunk/Source/WebCore/ChangeLog	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/ChangeLog	2021-09-24 22:35:01 UTC (rev 283063)
@@ -1,3 +1,40 @@
+2021-09-24  Nikos Mouchtaris  <[email protected]>
+
+        Implement abs,sign calc functions
+        https://bugs.webkit.org/show_bug.cgi?id=229786
+
+        Reviewed by Simon Fraser.
+
+        Added support for calc functions sign and abs. Involved adding new css keywords and handling 
+        for parsing calc _expression_ and computing the resulting value. Spec for these functions: 
+        https://drafts.csswg.org/css-values-4/#sign-funcs.
+
+        Tests: imported/w3c/web-platform-tests/css/css-values/signs-abs-computed.html
+               imported/w3c/web-platform-tests/css/css-values/signs-abs-invalid.html
+               imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize.html
+
+        * css/CSSValueKeywords.in:
+        * css/calc/CSSCalcExpressionNodeParser.cpp:
+        (WebCore::CSSCalcExpressionNodeParser::parseCalcFunction):
+        * css/calc/CSSCalcOperationNode.cpp:
+        (WebCore::determineCategory):
+        (WebCore::functionFromOperator):
+        (WebCore::CSSCalcOperationNode::createSign):
+        (WebCore::CSSCalcOperationNode::combineChildren):
+        (WebCore::CSSCalcOperationNode::simplifyNode):
+        (WebCore::CSSCalcOperationNode::doubleValue const):
+        (WebCore::functionPrefixForOperator):
+        (WebCore::CSSCalcOperationNode::evaluateOperator):
+        * css/calc/CSSCalcOperationNode.h:
+        * css/calc/CSSCalcValue.cpp:
+        (WebCore::createCSS):
+        (WebCore::CSSCalcValue::isCalcFunction):
+        * platform/calc/CalcExpressionOperation.cpp:
+        (WebCore::CalcExpressionOperation::evaluate const):
+        * platform/calc/CalcOperator.cpp:
+        (WebCore::operator<<):
+        * platform/calc/CalcOperator.h:
+
 2021-09-24  Alan Bujtas  <[email protected]>
 
         [LFC][IFC] LineBuilder should have the option of passing in the correct style when a run is added to the line

Modified: trunk/Source/WebCore/css/CSSValueKeywords.in (283062 => 283063)


--- trunk/Source/WebCore/css/CSSValueKeywords.in	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/css/CSSValueKeywords.in	2021-09-24 22:35:01 UTC (rev 283063)
@@ -1357,6 +1357,8 @@
 acos
 atan
 atan2
+abs
+sign
 
 from-image
 

Modified: trunk/Source/WebCore/css/calc/CSSCalcExpressionNodeParser.cpp (283062 => 283063)


--- trunk/Source/WebCore/css/calc/CSSCalcExpressionNodeParser.cpp	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/css/calc/CSSCalcExpressionNodeParser.cpp	2021-09-24 22:35:01 UTC (rev 283063)
@@ -137,10 +137,11 @@
     case CSSValueSin:
     case CSSValueCos:
     case CSSValueTan:
-    
     case CSSValueAcos:
     case CSSValueAsin:
     case CSSValueAtan:
+    case CSSValueSign:
+    case CSSValueAbs:
     case CSSValueCalc:
         maxArgumentCount = 1;
         break;
@@ -217,6 +218,12 @@
     case CSSValueAtan2:
         result = CSSCalcOperationNode::createAtan2(WTFMove(nodes));
         break;
+    case CSSValueAbs:
+        result = CSSCalcOperationNode::createSign(CalcOperator::Abs, WTFMove(nodes));
+        break;
+    case CSSValueSign:
+        result = CSSCalcOperationNode::createSign(CalcOperator::Sign, WTFMove(nodes));
+        break;
     // TODO: pow, sqrt, hypot
     default:
         break;

Modified: trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp (283062 => 283063)


--- trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp	2021-09-24 22:35:01 UTC (rev 283063)
@@ -85,6 +85,8 @@
     case CalcOperator::Acos:
     case CalcOperator::Atan:
     case CalcOperator::Atan2:
+    case CalcOperator::Abs:
+    case CalcOperator::Sign:
         ASSERT_NOT_REACHED();
         return CalculationCategory::Other;
     }
@@ -153,6 +155,8 @@
         case CalcOperator::Sin:
         case CalcOperator::Cos:
         case CalcOperator::Tan:
+        case CalcOperator::Abs:
+        case CalcOperator::Sign:
         case CalcOperator::Min:
         case CalcOperator::Max:
         case CalcOperator::Clamp:
@@ -291,6 +295,10 @@
         return CSSValueAtan;
     case CalcOperator::Atan2:
         return CSSValueAtan2;
+    case CalcOperator::Abs:
+        return CSSValueAbs;
+    case CalcOperator::Sign:
+        return CSSValueSign;
     }
     return CSSValueCalc;
 }
@@ -453,6 +461,21 @@
     return adoptRef(new CSSCalcOperationNode(CalculationCategory::Number, op, WTFMove(values)));
 }
 
+RefPtr<CSSCalcOperationNode> CSSCalcOperationNode::createSign(CalcOperator op, Vector<Ref<CSSCalcExpressionNode>>&& values)
+{
+    if (values.size() != 1)
+        return nullptr;
+    auto newCategory = determineCategory(values, op);
+    if (op == CalcOperator::Sign)
+        newCategory = CalculationCategory::Number;
+    
+    if (newCategory == CalculationCategory::Other) {
+        LOG_WITH_STREAM(Calc, stream << "Failed to create sign-related node because unable to determine category from " << prettyPrintNodes(values));
+        return nullptr;
+    }
+    return adoptRef(new CSSCalcOperationNode(newCategory, op, WTFMove(values)));
+}
+
 void CSSCalcOperationNode::hoistChildrenWithOperator(CalcOperator op)
 {
     ASSERT(op == CalcOperator::Add || op == CalcOperator::Multiply);
@@ -538,6 +561,15 @@
             m_children.clear();
             m_children.append(WTFMove(newChild));
         }
+        if (isSignNode()) {
+            auto combinedUnitType = m_children[0]->primitiveType();
+            if (calcOperator() == CalcOperator::Sign)
+                combinedUnitType = CSSUnitType::CSS_NUMBER;
+            double resolvedValue = doubleValue(m_children[0]->primitiveType());
+            auto newChild = CSSCalcPrimitiveValueNode::create(CSSPrimitiveValue::create(resolvedValue, combinedUnitType));
+            m_children.clear();
+            m_children.append(WTFMove(newChild));
+        }
         return;
     }
     
@@ -736,7 +768,7 @@
     if (is<CSSCalcOperationNode>(rootNode)) {
         auto& calcOperationNode = downcast<CSSCalcOperationNode>(rootNode.get());
         // Simplify operations with only one child node (other than root and operations that only need one node).
-        if (calcOperationNode.children().size() == 1 && depth && !calcOperationNode.isTrigNode() && !calcOperationNode.isExpNode() && !calcOperationNode.isInverseTrigNode())
+        if (calcOperationNode.children().size() == 1 && depth && !calcOperationNode.isTrigNode() && !calcOperationNode.isExpNode() && !calcOperationNode.isInverseTrigNode() && !calcOperationNode.isSignNode())
             return WTFMove(calcOperationNode.children()[0]);
         
         if (calcOperationNode.isCalcSumNode()) {
@@ -763,6 +795,8 @@
         
         if (calcOperationNode.isAtan2Node() && depth)
             calcOperationNode.combineChildren();
+        if (calcOperationNode.isSignNode() && depth)
+            calcOperationNode.combineChildren();
 
         // If only one child remains, return the child (except at the root).
         auto shouldCombineParentWithOnlyChild = [](const CSSCalcOperationNode& parent, int depth)
@@ -901,6 +935,8 @@
             childType = CSSUnitType::CSS_NUMBER;
         if (isAtan2Node())
             childType = child->primitiveType();
+        if (isSignNode())
+            childType = child->primitiveType();
         return child->doubleValue(childType);
     }));
 }
@@ -965,6 +1001,8 @@
     case CalcOperator::Acos: return "acos(";
     case CalcOperator::Atan: return "atan(";
     case CalcOperator::Atan2: return "atan2(";
+    case CalcOperator::Abs: return "abs(";
+    case CalcOperator::Sign: return "sign(";
     }
     
     return "";
@@ -1213,7 +1251,21 @@
             return std::numeric_limits<double>::quiet_NaN();
         return rad2deg(atan2(children[0], children[1]));
     }
+    case CalcOperator::Abs: {
+        if (children.size() != 1)
+            return std::numeric_limits<double>::quiet_NaN();
+        return std::abs(children[0]);
     }
+    case CalcOperator::Sign: {
+        if (children.size() != 1)
+            return std::numeric_limits<double>::quiet_NaN();
+        if (children[0] > 0)
+            return 1;
+        if (children[0] < 0)
+            return -1;
+        return children[0];
+    }
+    }
     ASSERT_NOT_REACHED();
     return 0;
 }

Modified: trunk/Source/WebCore/css/calc/CSSCalcOperationNode.h (283062 => 283063)


--- trunk/Source/WebCore/css/calc/CSSCalcOperationNode.h	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/css/calc/CSSCalcOperationNode.h	2021-09-24 22:35:01 UTC (rev 283063)
@@ -42,7 +42,7 @@
     static RefPtr<CSSCalcOperationNode> createExp(Vector<Ref<CSSCalcExpressionNode>>&& values);
     static RefPtr<CSSCalcOperationNode> createInverseTrig(CalcOperator, Vector<Ref<CSSCalcExpressionNode>>&& values);
     static RefPtr<CSSCalcOperationNode> createAtan2(Vector<Ref<CSSCalcExpressionNode>>&& values);
-
+    static RefPtr<CSSCalcOperationNode> createSign(CalcOperator, Vector<Ref<CSSCalcExpressionNode>>&& values);
     static Ref<CSSCalcExpressionNode> simplify(Ref<CSSCalcExpressionNode>&&);
 
     static void buildCSSText(const CSSCalcExpressionNode&, StringBuilder&);
@@ -55,6 +55,7 @@
     bool isExpNode() const { return m_operator == CalcOperator::Exp || m_operator == CalcOperator::Log; }
     bool isInverseTrigNode() const { return m_operator == CalcOperator::Asin || m_operator == CalcOperator::Acos || m_operator == CalcOperator::Atan; }
     bool isAtan2Node() const { return m_operator == CalcOperator::Atan2; }
+    bool isSignNode() const { return m_operator == CalcOperator::Abs || m_operator == CalcOperator::Sign; }
     bool shouldSortChildren() const { return isCalcSumNode() || isCalcProductNode(); }
 
     void hoistChildrenWithOperator(CalcOperator);

Modified: trunk/Source/WebCore/css/calc/CSSCalcValue.cpp (283062 => 283063)


--- trunk/Source/WebCore/css/calc/CSSCalcValue.cpp	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/css/calc/CSSCalcValue.cpp	2021-09-24 22:35:01 UTC (rev 283063)
@@ -206,7 +206,14 @@
                 return nullptr;
             return CSSCalcOperationNode::createAtan2(WTFMove(children));
         }
+        case CalcOperator::Sign:
+        case CalcOperator::Abs: {
+            auto children = createCSS(operationChildren, style);
+            if (children.size() != 1)
+                return nullptr;
+            return CSSCalcOperationNode::createSign(op, WTFMove(children));
         }
+        }
         return nullptr;
     }
     case CalcExpressionNodeType::BlendLength: {
@@ -326,6 +333,8 @@
     case CSSValueAcos:
     case CSSValueAtan:
     case CSSValueAtan2:
+    case CSSValueAbs:
+    case CSSValueSign:
         return true;
     default:
         return false;

Modified: trunk/Source/WebCore/platform/calc/CalcExpressionOperation.cpp (283062 => 283063)


--- trunk/Source/WebCore/platform/calc/CalcExpressionOperation.cpp	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/platform/calc/CalcExpressionOperation.cpp	2021-09-24 22:35:01 UTC (rev 283063)
@@ -134,7 +134,21 @@
             return std::numeric_limits<float>::quiet_NaN();
         return rad2deg(atan2(m_children[0]->evaluate(maxValue), m_children[1]->evaluate(maxValue)));
     }
+    case CalcOperator::Abs: {
+        if (m_children.size() != 1)
+            return std::numeric_limits<float>::quiet_NaN();
+        return std::abs(m_children[0]->evaluate(maxValue));
     }
+    case CalcOperator::Sign: {
+        if (m_children.size() != 1)
+            return std::numeric_limits<double>::quiet_NaN();
+        if (m_children[0]->evaluate(maxValue) > 0)
+            return 1;
+        if (m_children[0]->evaluate(maxValue) < 0)
+            return -1;
+        return m_children[0]->evaluate(maxValue);
+    }
+    }
     ASSERT_NOT_REACHED();
     return std::numeric_limits<float>::quiet_NaN();
 }

Modified: trunk/Source/WebCore/platform/calc/CalcOperator.cpp (283062 => 283063)


--- trunk/Source/WebCore/platform/calc/CalcOperator.cpp	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/platform/calc/CalcOperator.cpp	2021-09-24 22:35:01 UTC (rev 283063)
@@ -49,6 +49,8 @@
     case CalcOperator::Acos: ts << "acos"; break;
     case CalcOperator::Atan: ts << "atan"; break;
     case CalcOperator::Atan2: ts << "atan2"; break;
+    case CalcOperator::Abs: ts << "abs"; break;
+    case CalcOperator::Sign: ts << "sign"; break;
     }
     return ts;
 }

Modified: trunk/Source/WebCore/platform/calc/CalcOperator.h (283062 => 283063)


--- trunk/Source/WebCore/platform/calc/CalcOperator.h	2021-09-24 22:13:05 UTC (rev 283062)
+++ trunk/Source/WebCore/platform/calc/CalcOperator.h	2021-09-24 22:35:01 UTC (rev 283063)
@@ -47,6 +47,8 @@
     Acos,
     Atan,
     Atan2,
+    Abs,
+    Sign,
 };
 
 TextStream& operator<<(TextStream&, CalcOperator);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to