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);