Changeset 283434 in webkit


Ignore:
Timestamp:
Oct 1, 2021 11:22:54 PM (10 months ago)
Author:
commit-queue@webkit.org
Message:

Allow NaN, infinity, and -infinity in calc
https://bugs.webkit.org/show_bug.cgi?id=231044

Patch by Nikos Mouchtaris <Nikos Mouchtaris> on 2021-10-01
Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

  • web-platform-tests/css/css-values/acos-asin-atan-atan2-serialize-expected.txt:
  • web-platform-tests/css/css-values/acos-asin-atan-atan2-serialize.html:
  • web-platform-tests/css/css-values/exp-log-serialize-expected.txt:
  • web-platform-tests/css/css-values/exp-log-serialize.html:
  • web-platform-tests/css/css-values/round-mod-rem-serialize.html:
  • web-platform-tests/css/css-values/signs-abs-serialize-expected.txt:
  • web-platform-tests/css/css-values/signs-abs-serialize.html:
  • web-platform-tests/css/css-values/sin-cos-tan-serialize-expected.txt:
  • web-platform-tests/css/css-values/sin-cos-tan-serialize.html:

Source/WebCore:

Modified existing serialization tests.

Added support for NaN, infinity and -infinity keywords in calc. Involved removing checks for
inputs that would result in these values and introduction of new CSSKeywords for these three
constants. Spec for this: https://drafts.csswg.org/css-values-4/#calc-error-constants.

  • css/CSSPrimitiveValue.cpp:

(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
(WebCore::CSSPrimitiveValue::formatNumberValue const):

  • css/CSSValueKeywords.in:
  • css/CSSValuePool.cpp:

(WebCore::CSSValuePool::createValue):

  • css/calc/CSSCalcExpressionNodeParser.cpp:

(WebCore::getConstantTable):

  • css/calc/CSSCalcOperationNode.cpp:

(WebCore::determineCategory):
(WebCore::CSSCalcOperationNode::createLog):
(WebCore::CSSCalcOperationNode::createStep):
(WebCore::CSSCalcOperationNode::createRound):

  • css/calc/CSSCalcPrimitiveValueNode.cpp:

(WebCore::CSSCalcPrimitiveValueNode::invert):

Location:
trunk
Files:
2 deleted
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/css3/calc/calc-errors-expected.txt

    r107724 r283434  
    44unclosed calc with garbage => PASS
    55garbage => PASS
    6 zero division => PASS
    76non length => PASS
    87number + length => PASS
  • trunk/LayoutTests/css3/calc/calc-errors.html

    r140300 r283434  
    1717<div style="width: 100px; width: calc( flim;">unclosed calc with garbage</div>
    1818<div style="width: 100px; width: calc( flim );">garbage</div>
    19 
    20 
    21 <!-- zero division -->
    22 <div style="width: 100px; width: calc(1ex / 0);">zero division</div>
    2319
    2420<!-- wrong combination -->
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r283410 r283434  
     12021-10-01  Nikos Mouchtaris  <nmouchtaris@apple.com>
     2
     3        Allow NaN, infinity, and -infinity in calc
     4        https://bugs.webkit.org/show_bug.cgi?id=231044
     5
     6        Reviewed by Simon Fraser.
     7
     8        * web-platform-tests/css/css-values/acos-asin-atan-atan2-serialize-expected.txt:
     9        * web-platform-tests/css/css-values/acos-asin-atan-atan2-serialize.html:
     10        * web-platform-tests/css/css-values/exp-log-serialize-expected.txt:
     11        * web-platform-tests/css/css-values/exp-log-serialize.html:
     12        * web-platform-tests/css/css-values/round-mod-rem-serialize.html:
     13        * web-platform-tests/css/css-values/signs-abs-serialize-expected.txt:
     14        * web-platform-tests/css/css-values/signs-abs-serialize.html:
     15        * web-platform-tests/css/css-values/sin-cos-tan-serialize-expected.txt:
     16        * web-platform-tests/css/css-values/sin-cos-tan-serialize.html:
     17
    1182021-10-01  Yusuke Suzuki  <ysuzuki@apple.com>
    219
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/acos-asin-atan-atan2-serialize-expected.txt

    r283013 r283434  
    88PASS 'rotate(calc(asin(pi - pi + 1)))' as a specified value should serialize as 'rotate(calc(90deg))'.
    99PASS 'rotate(calc(asin(pi - pi + 1)))' as a computed value should serialize as 'matrix(6.123233995736766e-17, 1, -1, 6.123233995736766e-17, 0, 0)'.
     10PASS 'rotate(calc(atan(infinity)))' as a specified value should serialize as 'rotate(calc(90deg))'.
     11PASS 'rotate(calc(atan(infinity)))' as a computed value should serialize as 'matrix(6.123233995736766e-17, 1, -1, 6.123233995736766e-17, 0, 0)'.
    1012
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/acos-asin-atan-atan2-serialize.html

    r283013 r283434  
    4444    'calc(90deg)',
    4545    rotateMatrix);
     46
     47test_serialization(
     48    'calc(atan(infinity))',
     49    'calc(90deg)',
     50    rotateMatrix);
    4651</script>
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/exp-log-serialize-expected.txt

    r282795 r283434  
    1616PASS 'calc(log(1) + 0.5)' as a computed value should serialize as '0.5'.
    1717PASS 'scale(calc(log(1) + 0.5))' as a computed value should serialize as 'matrix(0.5, 0, 0, 0.5, 0, 0)'.
     18PASS 'calc(log(0))' as a specified value should serialize as 'calc(-infinity)'.
     19PASS 'scale(calc(log(0)))' as a specified value should serialize as 'scale(calc(-infinity))'.
     20FAIL 'calc(log(0))' as a computed value should serialize as '-infinity'. assert_equals: '-infinity' should round-trip exactly in computed values. expected "-infinity" but got "1"
     21FAIL 'scale(calc(log(0)))' as a computed value should serialize as 'matrix(-infinity, 0, 0, -infinity, 0, 0)'. assert_equals: 'matrix(-infinity, 0, 0, -infinity, 0, 0)' should round-trip exactly in computed values. expected "matrix(-infinity, 0, 0, -infinity, 0, 0)" but got "none"
    1822
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/exp-log-serialize.html

    r282795 r283434  
    3434    'calc(0.5)',
    3535    '0.5');
     36test_serialization(
     37    'calc(log(0))',
     38    'calc(-infinity)',
     39    '-infinity');
    3640</script>
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/round-function-expected.txt

    r283073 r283434  
    5050PASS round(-infinity, 5) should be used-value-equivalent to calc(-infinity)
    5151PASS round(-infinity, -5) should be used-value-equivalent to calc(-infinity)
    52 PASS calc(1 / round(5, infinity)) should be used-value-equivalent to calc(infinity)
    53 PASS calc(1 / round(5, -infinity)) should be used-value-equivalent to calc(infinity)
    54 PASS calc(1 / round(-5, infinity)) should be used-value-equivalent to calc(-infinity)
    55 PASS calc(1 / round(-5, -infinity)) should be used-value-equivalent to calc(-infinity)
    56 PASS calc(1 / round(to-zero, 5, infinity)) should be used-value-equivalent to calc(infinity)
    57 PASS calc(1 / round(to-zero, 5, -infinity)) should be used-value-equivalent to calc(infinity)
    58 PASS calc(1 / round(to-zero, -5, infinity)) should be used-value-equivalent to calc(-infinity)
    59 PASS calc(1 / round(to-zero, -5, -infinity)) should be used-value-equivalent to calc(-infinity)
    60 PASS round(up, 1, infinity) should be used-value-equivalent to calc(infinity)
    61 PASS calc(1 / round(up, 0, infinity)) should be used-value-equivalent to calc(infinity)
    62 PASS calc(1 / round(up, -1 * 0, infinity) should be used-value-equivalent to calc(-infinity)
    63 PASS calc(1 / round(up, -1, infinity) should be used-value-equivalent to calc(-infinity)
    64 PASS round(down, -1, infinity) should be used-value-equivalent to calc(-infinity)
    65 PASS calc(1 / round(down, -1 * 0, infinity)) should be used-value-equivalent to calc(-infinity)
    66 PASS calc(1 / round(down, 0, infinity)) should be used-value-equivalent to calc(infinity)
    67 PASS calc(1 / round(down, 1, infinity)) should be used-value-equivalent to calc(infinity)
     52FAIL calc(1 / round(5, infinity)) should be used-value-equivalent to calc(infinity) assert_equals: calc(1 / round(5, infinity)) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     53FAIL calc(1 / round(5, -infinity)) should be used-value-equivalent to calc(infinity) assert_equals: calc(1 / round(5, -infinity)) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     54FAIL calc(1 / round(-5, infinity)) should be used-value-equivalent to calc(-infinity) assert_equals: calc(1 / round(-5, infinity)) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     55FAIL calc(1 / round(-5, -infinity)) should be used-value-equivalent to calc(-infinity) assert_equals: calc(1 / round(-5, -infinity)) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     56FAIL calc(1 / round(to-zero, 5, infinity)) should be used-value-equivalent to calc(infinity) assert_equals: calc(1 / round(to-zero, 5, infinity)) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     57FAIL calc(1 / round(to-zero, 5, -infinity)) should be used-value-equivalent to calc(infinity) assert_equals: calc(1 / round(to-zero, 5, -infinity)) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     58FAIL calc(1 / round(to-zero, -5, infinity)) should be used-value-equivalent to calc(-infinity) assert_equals: calc(1 / round(to-zero, -5, infinity)) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     59FAIL calc(1 / round(to-zero, -5, -infinity)) should be used-value-equivalent to calc(-infinity) assert_equals: calc(1 / round(to-zero, -5, -infinity)) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     60FAIL round(up, 1, infinity) should be used-value-equivalent to calc(infinity) assert_equals: round(up, 1, infinity) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     61FAIL calc(1 / round(up, 0, infinity)) should be used-value-equivalent to calc(infinity) assert_equals: calc(1 / round(up, 0, infinity)) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     62FAIL calc(1 / round(up, -1 * 0, infinity) should be used-value-equivalent to calc(-infinity) assert_equals: calc(1 / round(up, -1 * 0, infinity) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     63FAIL calc(1 / round(up, -1, infinity) should be used-value-equivalent to calc(-infinity) assert_equals: calc(1 / round(up, -1, infinity) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     64FAIL round(down, -1, infinity) should be used-value-equivalent to calc(-infinity) assert_equals: round(down, -1, infinity) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     65FAIL calc(1 / round(down, -1 * 0, infinity)) should be used-value-equivalent to calc(-infinity) assert_equals: calc(1 / round(down, -1 * 0, infinity)) and calc(-infinity) serialize to the same thing in used values. expected "matrix3d(-infinity, NaN, NaN, NaN, NaN, -infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     66FAIL calc(1 / round(down, 0, infinity)) should be used-value-equivalent to calc(infinity) assert_equals: calc(1 / round(down, 0, infinity)) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
     67FAIL calc(1 / round(down, 1, infinity)) should be used-value-equivalent to calc(infinity) assert_equals: calc(1 / round(down, 1, infinity)) and calc(infinity) serialize to the same thing in used values. expected "matrix3d(infinity, NaN, NaN, NaN, NaN, infinity, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)" but got "matrix3d(NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0, 1, 0, 0, 0, 0, 1)"
    6868
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/round-mod-rem-serialize-expected.txt

    r283073 r283434  
    1212PASS 'rem(1,1)' as a computed value should serialize as '0'.
    1313PASS 'scale(rem(1,1))' as a computed value should serialize as 'matrix(0, 0, 0, 0, 0, 0)'.
     14PASS 'calc(round(1,0))' as a specified value should serialize as 'calc(NaN)'.
     15PASS 'scale(calc(round(1,0)))' as a specified value should serialize as 'scale(calc(NaN))'.
     16FAIL 'calc(round(1,0))' as a computed value should serialize as 'NaN'. assert_equals: 'NaN' should round-trip exactly in computed values. expected "NaN" but got "1"
     17FAIL 'scale(calc(round(1,0)))' as a computed value should serialize as 'matrix(NaN, 0, 0, NaN, 0, 0)'. assert_equals: 'matrix(NaN, 0, 0, NaN, 0, 0)' should round-trip exactly in computed values. expected "matrix(NaN, 0, 0, NaN, 0, 0)" but got "none"
     18PASS 'calc(mod(1,0))' as a specified value should serialize as 'calc(NaN)'.
     19PASS 'scale(calc(mod(1,0)))' as a specified value should serialize as 'scale(calc(NaN))'.
     20FAIL 'calc(mod(1,0))' as a computed value should serialize as 'NaN'. assert_equals: 'NaN' should round-trip exactly in computed values. expected "NaN" but got "1"
     21FAIL 'scale(calc(mod(1,0)))' as a computed value should serialize as 'matrix(NaN, 0, 0, NaN, 0, 0)'. assert_equals: 'matrix(NaN, 0, 0, NaN, 0, 0)' should round-trip exactly in computed values. expected "matrix(NaN, 0, 0, NaN, 0, 0)" but got "none"
     22PASS 'calc(rem(1,0))' as a specified value should serialize as 'calc(NaN)'.
     23PASS 'scale(calc(rem(1,0)))' as a specified value should serialize as 'scale(calc(NaN))'.
     24FAIL 'calc(rem(1,0))' as a computed value should serialize as 'NaN'. assert_equals: 'NaN' should round-trip exactly in computed values. expected "NaN" but got "1"
     25FAIL 'scale(calc(rem(1,0)))' as a computed value should serialize as 'matrix(NaN, 0, 0, NaN, 0, 0)'. assert_equals: 'matrix(NaN, 0, 0, NaN, 0, 0)' should round-trip exactly in computed values. expected "matrix(NaN, 0, 0, NaN, 0, 0)" but got "none"
    1426
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/round-mod-rem-serialize.html

    r283073 r283434  
    2929    'calc(0)',
    3030    '0');
     31
     32test_serialization(
     33    'calc(round(1,0))',
     34    'calc(NaN)',
     35    'NaN');
     36test_serialization(
     37    'calc(mod(1,0))',
     38    'calc(NaN)',
     39    'NaN');
     40test_serialization(
     41    'calc(rem(1,0))',
     42    'calc(NaN)',
     43    'NaN');
    3144</script>
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize-expected.txt

    r283063 r283434  
    3232FAIL '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"
    3333PASS 'scale(calc(sign(.1) + 1))' as a computed value should serialize as 'matrix(2, 0, 0, 2, 0, 0)'.
     34FAIL 'calc(abs(inFinity))' as a specified value should serialize as 'calc(inFinity)'. assert_equals: 'calc(inFinity)' should round-trip exactly in specified values. expected "calc(inFinity)" but got "calc(infinity)"
     35PASS 'scale(calc(abs(inFinity)))' as a specified value should serialize as 'scale(calc(infinity))'.
     36FAIL 'calc(abs(inFinity))' as a computed value should serialize as 'infinity'. assert_equals: 'infinity' should round-trip exactly in computed values. expected "infinity" but got "1"
     37FAIL 'scale(calc(abs(inFinity)))' as a computed value should serialize as 'matrix(infinity, 0, 0, infinity, 0, 0)'. assert_equals: 'matrix(infinity, 0, 0, infinity, 0, 0)' should round-trip exactly in computed values. expected "matrix(infinity, 0, 0, infinity, 0, 0)" but got "none"
     38PASS 'calc(abs(infinity))' as a specified value should serialize as 'calc(infinity)'.
     39PASS 'scale(calc(abs(infinity)))' as a specified value should serialize as 'scale(calc(infinity))'.
     40FAIL 'calc(abs(infinity))' as a computed value should serialize as 'infinity'. assert_equals: 'infinity' should round-trip exactly in computed values. expected "infinity" but got "1"
     41FAIL 'scale(calc(abs(infinity)))' as a computed value should serialize as 'matrix(infinity, 0, 0, infinity, 0, 0)'. assert_equals: 'matrix(infinity, 0, 0, infinity, 0, 0)' should round-trip exactly in computed values. expected "matrix(infinity, 0, 0, infinity, 0, 0)" but got "none"
     42PASS 'calc(sign(infinity))' as a specified value should serialize as 'calc(1)'.
     43PASS 'scale(calc(sign(infinity)))' as a specified value should serialize as 'scale(calc(1))'.
     44PASS 'calc(sign(infinity))' as a computed value should serialize as '1'.
     45PASS 'scale(calc(sign(infinity)))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
     46FAIL 'abs(infinity)' as a specified value should serialize as 'calc(infinity)'. assert_equals: 'abs(infinity)' and 'calc(infinity)' should serialize the same in specified values. expected "calc(infinity)" but got "abs(infinity)"
     47FAIL 'scale(abs(infinity))' as a specified value should serialize as 'scale(calc(infinity))'. assert_equals: 'scale(abs(infinity))' and 'scale(calc(infinity))' should serialize the same in specified values. expected "scale(calc(infinity))" but got "scale(abs(infinity))"
     48FAIL 'abs(infinity)' as a computed value should serialize as 'infinity'. assert_equals: 'infinity' should round-trip exactly in computed values. expected "infinity" but got "1"
     49FAIL 'scale(abs(infinity))' as a computed value should serialize as 'matrix(infinity, 0, 0, infinity, 0, 0)'. assert_equals: 'matrix(infinity, 0, 0, infinity, 0, 0)' should round-trip exactly in computed values. expected "matrix(infinity, 0, 0, infinity, 0, 0)" but got "none"
     50PASS 'calc(abs(-infinity))' as a specified value should serialize as 'calc(infinity)'.
     51PASS 'scale(calc(abs(-infinity)))' as a specified value should serialize as 'scale(calc(infinity))'.
     52FAIL 'calc(abs(-infinity))' as a computed value should serialize as 'infinity'. assert_equals: 'infinity' should round-trip exactly in computed values. expected "infinity" but got "1"
     53FAIL 'scale(calc(abs(-infinity)))' as a computed value should serialize as 'matrix(infinity, 0, 0, infinity, 0, 0)'. assert_equals: 'matrix(infinity, 0, 0, infinity, 0, 0)' should round-trip exactly in computed values. expected "matrix(infinity, 0, 0, infinity, 0, 0)" but got "none"
     54PASS 'calc(sign(-1 * infinity))' as a specified value should serialize as 'calc(-1)'.
     55PASS 'scale(calc(sign(-1 * infinity)))' as a specified value should serialize as 'scale(calc(-1))'.
     56FAIL 'calc(sign(-1 * infinity))' as a computed value should serialize as '-1'. assert_equals: '-1' should round-trip exactly in computed values. expected "-1" but got "0"
     57PASS 'scale(calc(sign(-1 * infinity)))' as a computed value should serialize as 'matrix(-1, 0, 0, -1, 0, 0)'.
    3458
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/signs-abs-serialize.html

    r283063 r283434  
    5151    'calc(2)',
    5252    '2');
     53
     54test_serialization(
     55    'calc(abs(inFinity))',
     56    'calc(inFinity)',
     57    'infinity');
     58
     59test_serialization(
     60    'calc(abs(infinity))',
     61    'calc(infinity)',
     62    'infinity');
     63test_serialization(
     64    'calc(sign(infinity))',
     65    'calc(1)',
     66    '1');
     67test_serialization(
     68    'abs(infinity)',
     69    'calc(infinity)',
     70    'infinity');
     71   
     72test_serialization(
     73    'calc(abs(-infinity))',
     74    'calc(infinity)',
     75    'infinity');
     76test_serialization(
     77    'calc(sign(-1 * infinity))',
     78    'calc(-1)',
     79    '-1');
    5380</script>
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/sin-cos-tan-serialize-expected.txt

    r282402 r283434  
    2828PASS 'calc(tan(0) + 0.5)' as a computed value should serialize as '0.5'.
    2929PASS 'scale(calc(tan(0) + 0.5))' as a computed value should serialize as 'matrix(0.5, 0, 0, 0.5, 0, 0)'.
     30PASS 'calc(sin(infinity))' as a specified value should serialize as 'calc(NaN)'.
     31PASS 'scale(calc(sin(infinity)))' as a specified value should serialize as 'scale(calc(NaN))'.
     32FAIL 'calc(sin(infinity))' as a computed value should serialize as 'NaN'. assert_equals: 'NaN' should round-trip exactly in computed values. expected "NaN" but got "1"
     33FAIL 'scale(calc(sin(infinity)))' as a computed value should serialize as 'matrix(NaN, 0, 0, NaN, 0, 0)'. assert_equals: 'matrix(NaN, 0, 0, NaN, 0, 0)' should round-trip exactly in computed values. expected "matrix(NaN, 0, 0, NaN, 0, 0)" but got "none"
     34PASS 'calc(cos(infinity))' as a specified value should serialize as 'calc(NaN)'.
     35PASS 'scale(calc(cos(infinity)))' as a specified value should serialize as 'scale(calc(NaN))'.
     36FAIL 'calc(cos(infinity))' as a computed value should serialize as 'NaN'. assert_equals: 'NaN' should round-trip exactly in computed values. expected "NaN" but got "1"
     37FAIL 'scale(calc(cos(infinity)))' as a computed value should serialize as 'matrix(NaN, 0, 0, NaN, 0, 0)'. assert_equals: 'matrix(NaN, 0, 0, NaN, 0, 0)' should round-trip exactly in computed values. expected "matrix(NaN, 0, 0, NaN, 0, 0)" but got "none"
     38PASS 'calc(tan(infinity))' as a specified value should serialize as 'calc(NaN)'.
     39PASS 'scale(calc(tan(infinity)))' as a specified value should serialize as 'scale(calc(NaN))'.
     40FAIL 'calc(tan(infinity))' as a computed value should serialize as 'NaN'. assert_equals: 'NaN' should round-trip exactly in computed values. expected "NaN" but got "1"
     41FAIL 'scale(calc(tan(infinity)))' as a computed value should serialize as 'matrix(NaN, 0, 0, NaN, 0, 0)'. assert_equals: 'matrix(NaN, 0, 0, NaN, 0, 0)' should round-trip exactly in computed values. expected "matrix(NaN, 0, 0, NaN, 0, 0)" but got "none"
    3042
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/sin-cos-tan-serialize.html

    r282402 r283434  
    4646    'calc(0.5)',
    4747    '0.5');
     48
     49test_serialization(
     50    'calc(sin(infinity))',
     51    'calc(NaN)',
     52    'NaN');
     53test_serialization(
     54    'calc(cos(infinity))',
     55    'calc(NaN)',
     56    'NaN');
     57test_serialization(
     58    'calc(tan(infinity))',
     59    'calc(NaN)',
     60    'NaN');
    4861</script>
  • trunk/Source/WebCore/ChangeLog

    r283432 r283434  
     12021-10-01  Nikos Mouchtaris  <nmouchtaris@apple.com>
     2
     3        Allow NaN, infinity, and -infinity in calc
     4        https://bugs.webkit.org/show_bug.cgi?id=231044
     5
     6        Reviewed by Simon Fraser.
     7
     8        Modified existing serialization tests.
     9
     10        Added support for NaN, infinity and -infinity keywords in calc. Involved removing checks for
     11        inputs that would result in these values and introduction of new CSSKeywords for these three
     12        constants. Spec for this: https://drafts.csswg.org/css-values-4/#calc-error-constants.
     13
     14        * css/CSSPrimitiveValue.cpp:
     15        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     16        (WebCore::CSSPrimitiveValue::formatNumberValue const):
     17        * css/CSSValueKeywords.in:
     18        * css/CSSValuePool.cpp:
     19        (WebCore::CSSValuePool::createValue):
     20        * css/calc/CSSCalcExpressionNodeParser.cpp:
     21        (WebCore::getConstantTable):
     22        * css/calc/CSSCalcOperationNode.cpp:
     23        (WebCore::determineCategory):
     24        (WebCore::CSSCalcOperationNode::createLog):
     25        (WebCore::CSSCalcOperationNode::createStep):
     26        (WebCore::CSSCalcOperationNode::createRound):
     27        * css/calc/CSSCalcPrimitiveValueNode.cpp:
     28        (WebCore::CSSCalcPrimitiveValueNode::invert):
     29
    1302021-10-01  Lauro Moura  <lmoura@igalia.com>
    231
  • trunk/Source/WebCore/css/CSSPrimitiveValue.cpp

    r283279 r283434  
    261261{
    262262    setPrimitiveUnitType(type);
    263     ASSERT(std::isfinite(num));
    264263    m_value.num = num;
    265264}
     
    952951NEVER_INLINE String CSSPrimitiveValue::formatNumberValue(StringView suffix) const
    953952{
     953    if (m_value.num == std::numeric_limits<double>::infinity())
     954        return makeString("infinity", suffix);
     955    if (m_value.num == -1 * std::numeric_limits<double>::infinity())
     956        return makeString("-infinity", suffix);
    954957    return makeString(m_value.num, suffix);
    955958}
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r283359 r283434  
    13671367to-zero
    13681368nearest
     1369infinity
     1370-infinity
     1371NaN
    13691372
    13701373from-image
  • trunk/Source/WebCore/css/CSSValuePool.cpp

    r267009 r283434  
    113113Ref<CSSPrimitiveValue> CSSValuePool::createValue(double value, CSSUnitType type)
    114114{
    115     ASSERT(std::isfinite(value));
    116 
    117115    if (value < 0 || value > StaticCSSValuePool::maximumCacheableIntegerValue)
    118116        return CSSPrimitiveValue::create(value, type);
  • trunk/Source/WebCore/css/calc/CSSCalcExpressionNodeParser.cpp

    r283359 r283434  
    9898static const CSSCalcSymbolTable getConstantTable()
    9999{
    100     return { { CSSValuePi, CSSUnitType::CSS_NUMBER, piDouble }, { CSSValueE, CSSUnitType::CSS_NUMBER, std::exp(1.0) } };
     100    return {
     101        { CSSValuePi, CSSUnitType::CSS_NUMBER, piDouble }, { CSSValueE, CSSUnitType::CSS_NUMBER, std::exp(1.0) },
     102        { CSSValueNegativeInfinity, CSSUnitType::CSS_NUMBER, -1 * std::numeric_limits<double>::infinity() },
     103        { CSSValueInfinity, CSSUnitType::CSS_NUMBER, std::numeric_limits<double>::infinity() },
     104        { CSSValueNaN, CSSUnitType::CSS_NUMBER, std::numeric_limits<double>::quiet_NaN() },
     105    };
    101106}
    102107
  • trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp

    r283359 r283434  
    7171        return leftCategory == CalculationCategory::Number ? rightCategory : leftCategory;
    7272    case CalcOperator::Divide:
    73         if (rightCategory != CalculationCategory::Number || rightSide.isZero())
     73        if (rightCategory != CalculationCategory::Number)
    7474            return CalculationCategory::Other;
    7575        return leftCategory;
     
    159159            // and right type be the result of finding the types of its right argument and then inverting it.
    160160            // The sub-expression’s type is the result of multiplying the left type and right type.
    161             if (invertCategory != CalculationCategory::Number || node.isZero())
     161            if (invertCategory != CalculationCategory::Number)
    162162                return CalculationCategory::Other;
    163163            break;
     
    439439        return nullptr;
    440440    for (auto& value : values) {
    441         // TODO: Support infinity
    442         if (value->category() != CalculationCategory::Number || !value->doubleValue(value->primitiveType())) {
     441        if (value->category() != CalculationCategory::Number) {
    443442            LOG_WITH_STREAM(Calc, stream << "Failed to create log node because unable to determine category from " << prettyPrintNodes(values));
    444443            return nullptr;
    445444        }
    446     }
    447    
    448     // TODO: Support infinity
    449     if ((values.size() == 2 && values[1]->doubleValue(values[1]->primitiveType()) == 1)) {
    450         LOG_WITH_STREAM(Calc, stream << "Failed to create log node because unable to determine category from " << prettyPrintNodes(values));
    451         return nullptr;
    452445    }
    453446
     
    568561        return nullptr;
    569562    }
    570    
    571     if (!values[1]->doubleValue(values[1]->primitiveType())) {
    572         LOG_WITH_STREAM(Calc, stream << "Failed to create stepped value node because unable to determine category from " << prettyPrintNodes(values));
    573         return nullptr;
    574     }
    575 
    576563    return adoptRef(new CSSCalcOperationNode(values[0]->category(), op, WTFMove(values)));
    577564}
     
    609596    if (values.size() == 3)
    610597        values.remove(0);
    611     if (!values[1]->doubleValue(values[1]->primitiveType())) {
    612         LOG_WITH_STREAM(Calc, stream << "Failed to create round node because unable to determine category from " << prettyPrintNodes(values));
    613         return nullptr;
    614     }
    615598    return adoptRef(new CSSCalcOperationNode(values.rbegin()[0]->category(), roundType, WTFMove(values)));
    616599}
  • trunk/Source/WebCore/css/calc/CSSCalcPrimitiveValueNode.cpp

    r282430 r283434  
    8686{
    8787    ASSERT(isNumericValue());
    88     if (!m_value->doubleValue())
     88    if (!m_value->doubleValue()) {
    8989        m_value = CSSPrimitiveValue::create(std::numeric_limits<double>::infinity(), m_value->primitiveType());
     90        return;
     91    }
    9092
    9193    m_value = CSSPrimitiveValue::create(1.0 / m_value->doubleValue(), m_value->primitiveType());
  • trunk/Source/WebCore/css/makevalues.pl

    r278304 r283434  
    103103  my $id = $names[$i];
    104104  $id =~ s/(^[^-])|-(.)/uc($1||$2)/ge;
    105   print GPERF $lower_names[$i] . ", CSSValue" . $id . "\n";
     105  if($lower_names[$i]=="-infinity") {
     106    print GPERF $lower_names[$i] . ", CSSValueNegativeInfinity" . "\n";
     107  } else {
     108    print GPERF $lower_names[$i] . ", CSSValue" . $id . "\n";
     109  }
    106110}
    107111
     
    180184  my $id = $name;
    181185  $id =~ s/(^[^-])|-(.)/uc($1||$2)/ge;
    182   print HEADER "    CSSValue" . $id . " = " . $i . ",\n";
     186  if($name=="-infinity") {
     187    print HEADER "    CSSValueNegativeInfinity = " . $i . ",\n";
     188  } else {
     189    print HEADER "    CSSValue" . $id . " = " . $i . ",\n";
     190  }
    183191  $i = $i + 1;
    184192  if (length($name) > $maxLen) {
Note: See TracChangeset for help on using the changeset viewer.