Changeset 292893 in webkit


Ignore:
Timestamp:
Apr 14, 2022 4:32:40 PM (3 months ago)
Author:
Nikos Mouchtaris
Message:

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

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

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

Source/WebCore:

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

  • css/calc/CSSCalcOperationNode.cpp:

(WebCore::CSSCalcOperationNode::simplifyNode):

  • css/calc/CSSCalcOperationNode.h:

LayoutTests:

  • fast/css/calc-parsing-expected.txt:
  • fast/css/calc-parsing.html:
Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r292875 r292893  
     12022-04-14  Nikolaos Mouchtaris  <nmouchtaris@apple.com>
     2
     3        calc(): Serialize top level min/max/hypot as calc()
     4        https://bugs.webkit.org/show_bug.cgi?id=239019
     5
     6        Reviewed by Darin Adler.
     7
     8        * fast/css/calc-parsing-expected.txt:
     9        * fast/css/calc-parsing.html:
     10
    1112022-04-14  Karl Rackler  <rackler@apple.com>
    212
  • trunk/LayoutTests/fast/css/calc-parsing-expected.txt

    r287909 r292893  
    1010
    1111element.style["width"] = "max(100px + 200px)"
    12 PASS element.style['width'] is "max(300px)"
     12PASS element.style['width'] is "calc(300px)"
    1313PASS getComputedStyle(element).getPropertyValue('width') is "300px"
    1414
    1515element.style["width"] = "max(100px , 200px)"
    16 PASS element.style['width'] is "max(200px)"
     16PASS element.style['width'] is "calc(200px)"
    1717PASS getComputedStyle(element).getPropertyValue('width') is "200px"
    1818
    1919element.style["width"] = "max(100px,200px)"
    20 PASS element.style['width'] is "max(200px)"
     20PASS element.style['width'] is "calc(200px)"
    2121PASS getComputedStyle(element).getPropertyValue('width') is "200px"
    2222
     
    7474
    7575element.style["width"] = "hypot(4px, 5px, 7px, 9px)"
    76 PASS element.style['width'] is "hypot(13.076697px)"
     76PASS element.style['width'] is "calc(13.076697px)"
    7777PASS getComputedStyle(element).getPropertyValue('width') is "13.0625px"
    7878
    7979element.style["width"] = "hypot(3px, 4px)"
    80 PASS element.style['width'] is "hypot(5px)"
     80PASS element.style['width'] is "calc(5px)"
    8181PASS getComputedStyle(element).getPropertyValue('width') is "5px"
    8282
     
    8686
    8787element.style["width"] = "hypot(-5px)"
    88 PASS element.style['width'] is "hypot(5px)"
     88PASS element.style['width'] is "calc(5px)"
    8989PASS getComputedStyle(element).getPropertyValue('width') is "5px"
    9090
     
    270270
    271271element.style["min-width"] = "max(100px + 200px)"
    272 PASS element.style['min-width'] is "max(300px)"
     272PASS element.style['min-width'] is "calc(300px)"
    273273PASS getComputedStyle(element).getPropertyValue('min-width') is "300px"
    274274
    275275element.style["min-width"] = "max(100px , 200px)"
    276 PASS element.style['min-width'] is "max(200px)"
     276PASS element.style['min-width'] is "calc(200px)"
    277277PASS getComputedStyle(element).getPropertyValue('min-width') is "200px"
    278278
    279279element.style["min-width"] = "max(100px,200px)"
    280 PASS element.style['min-width'] is "max(200px)"
     280PASS element.style['min-width'] is "calc(200px)"
    281281PASS getComputedStyle(element).getPropertyValue('min-width') is "200px"
    282282
     
    334334
    335335element.style["min-width"] = "hypot(4px, 5px, 7px, 9px)"
    336 PASS element.style['min-width'] is "hypot(13.076697px)"
     336PASS element.style['min-width'] is "calc(13.076697px)"
    337337PASS getComputedStyle(element).getPropertyValue('min-width') is "13.076696px"
    338338
    339339element.style["min-width"] = "hypot(3px, 4px)"
    340 PASS element.style['min-width'] is "hypot(5px)"
     340PASS element.style['min-width'] is "calc(5px)"
    341341PASS getComputedStyle(element).getPropertyValue('min-width') is "5px"
    342342
     
    346346
    347347element.style["min-width"] = "hypot(-5px)"
    348 PASS element.style['min-width'] is "hypot(5px)"
     348PASS element.style['min-width'] is "calc(5px)"
    349349PASS getComputedStyle(element).getPropertyValue('min-width') is "5px"
    350350
  • trunk/LayoutTests/fast/css/calc-parsing.html

    r287909 r292893  
    3232                // Valid expressions.
    3333                testExpression('calc(100px)', 'calc(100px)', '100px');
    34                 testExpression('max(100px + 200px)', 'max(300px)', '300px');
    35                 testExpression('max(100px , 200px)', 'max(200px)', '200px');
    36                 testExpression('max(100px,200px)', 'max(200px)', '200px');
     34                testExpression('max(100px + 200px)', 'calc(300px)', '300px');
     35                testExpression('max(100px , 200px)', 'calc(200px)', '200px');
     36                testExpression('max(100px,200px)', 'calc(200px)', '200px');
    3737                testExpression('clamp(100px,123px,200px)', 'clamp(100px, 123px, 200px)', '123px');
    3838                testExpression('clamp(100px,300px,200px)', 'clamp(100px, 300px, 200px)', '200px');
     
    4848                testExpression('calc(1px * sqrt(999))', 'calc(31.606961px)', propertyName == 'width' ? '31.59375px' : '31.606962px');
    4949                testExpression('calc(1px * pow(2, sqrt(100))', 'calc(1024px)', '1024px');
    50                 testExpression('hypot(4px, 5px, 7px, 9px)', 'hypot(13.076697px)', propertyName == 'width' ? '13.0625px' : '13.076696px');
    51                 testExpression('hypot(3px, 4px)', 'hypot(5px)', '5px');
     50                testExpression('hypot(4px, 5px, 7px, 9px)', 'calc(13.076697px)', propertyName == 'width' ? '13.0625px' : '13.076696px');
     51                testExpression('hypot(3px, 4px)', 'calc(5px)', '5px');
    5252                testExpression('calc(100px * hypot(3, 4))', 'calc(500px)', '500px');
    53                 testExpression('hypot(-5px)', 'hypot(5px)', '5px');
     53                testExpression('hypot(-5px)', 'calc(5px)', '5px');
    5454                testExpression('calc(1px * hypot(-5))', 'calc(5px)', '5px');
    5555                testExpression('calc(1px * hypot(10000))', 'calc(10000px)', '10000px');
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r292861 r292893  
     12022-04-14  Nikolaos Mouchtaris  <nmouchtaris@apple.com>
     2
     3        calc(): Serialize top level min/max/hypot as calc()
     4        https://bugs.webkit.org/show_bug.cgi?id=239019
     5
     6        Reviewed by Darin Adler.
     7
     8        * web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt:
     9        * web-platform-tests/css/css-values/hypot-pow-sqrt-serialize-expected.txt:
     10        * web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt:
     11        * web-platform-tests/css/css-values/minmax-length-percent-serialize-expected.txt:
     12        * web-platform-tests/css/css-values/minmax-length-serialize-expected.txt:
     13        * web-platform-tests/css/css-values/minmax-number-serialize-expected.txt:
     14        * web-platform-tests/css/css-values/minmax-percentage-serialize-expected.txt:
     15        * web-platform-tests/css/css-values/minmax-time-serialize-expected.txt:
     16
    1172022-04-14  Youenn Fablet  <youenn@apple.com>
    218
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-invalid-expected.txt

    r287909 r292893  
    1111PASS e.style['opacity'] = "hypot(1 2)" should not set the property value
    1212PASS e.style['opacity'] = "hypot(1, , 2)" should not set the property value
    13 FAIL e.style['opacity'] = "hypot(1, 2)" should not set the property value assert_equals: expected "" but got "hypot(2.236068)"
     13FAIL e.style['opacity'] = "hypot(1, 2)" should not set the property value assert_equals: expected "" but got "calc(2.236068)"
    1414PASS e.style['opacity'] = "sqrt()" should not set the property value
    1515PASS e.style['opacity'] = "sqrt( )" should not set the property value
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/hypot-pow-sqrt-serialize-expected.txt

    r283447 r292893  
    44PASS 'pow(1,1)' as a computed value should serialize as '1'.
    55PASS 'scale(pow(1,1))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
    6 FAIL 'hypot(1)' as a specified value should serialize as 'calc(1)'. assert_equals: 'hypot(1)' and 'calc(1)' should serialize the same in specified values. expected "calc(1)" but got "hypot(1)"
    7 FAIL 'scale(hypot(1))' as a specified value should serialize as 'scale(calc(1))'. assert_equals: 'scale(hypot(1))' and 'scale(calc(1))' should serialize the same in specified values. expected "scale(calc(1))" but got "scale(hypot(1))"
     6PASS 'hypot(1)' as a specified value should serialize as 'calc(1)'.
     7PASS 'scale(hypot(1))' as a specified value should serialize as 'scale(calc(1))'.
    88PASS 'hypot(1)' as a computed value should serialize as '1'.
    99PASS 'scale(hypot(1))' as a computed value should serialize as 'matrix(1, 0, 0, 1, 0, 0)'.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-angle-serialize-expected.txt

    r287909 r292893  
    11
    2 FAIL 'rotate(min(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
     2PASS 'rotate(min(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    33PASS 'rotate(min(90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    4 FAIL 'rotate(min(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
     4PASS 'rotate(min(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
    55PASS 'rotate(min(.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    6 FAIL 'rotate(min(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(100grad))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
     6PASS 'rotate(min(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'.
    77PASS 'rotate(min(100grad))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    8 FAIL 'rotate(max(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
     8PASS 'rotate(max(90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    99PASS 'rotate(max(90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    10 FAIL 'rotate(max(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
     10PASS 'rotate(max(.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
    1111PASS 'rotate(max(.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    12 FAIL 'rotate(max(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(100grad))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
     12PASS 'rotate(max(100grad))' as a specified value should serialize as 'rotate(calc(90deg))'.
    1313PASS 'rotate(max(100grad))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    14 FAIL 'rotate(min(90deg, 92deg, 93deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(90deg, 92deg, 93deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
     14PASS 'rotate(min(90deg, 92deg, 93deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    1515PASS 'rotate(min(90deg, 92deg, 93deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    16 FAIL 'rotate(min(93deg, 92deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(93deg, 92deg, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
     16PASS 'rotate(min(93deg, 92deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    1717PASS 'rotate(min(93deg, 92deg, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    18 FAIL 'rotate(min(90deg, 1.58rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(90deg, 1.58rad, 0.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
     18PASS 'rotate(min(90deg, 1.58rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
    1919PASS 'rotate(min(90deg, 1.58rad, 0.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    20 FAIL 'rotate(min(0.25turn, 1.58rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(min(0.25turn, 1.58rad, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(min(90deg))"
     20PASS 'rotate(min(0.25turn, 1.58rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    2121PASS 'rotate(min(0.25turn, 1.58rad, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    22 FAIL 'rotate(max(81deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(81deg, 82deg, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
     22PASS 'rotate(max(81deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    2323PASS 'rotate(max(81deg, 82deg, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    24 FAIL 'rotate(max(83deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(83deg, 82deg, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
     24PASS 'rotate(max(83deg, 82deg, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    2525PASS 'rotate(max(83deg, 82deg, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    26 FAIL 'rotate(max(90deg, 1.57rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(90deg, 1.57rad, 0.25turn))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
     26PASS 'rotate(max(90deg, 1.57rad, 0.25turn))' as a specified value should serialize as 'rotate(calc(90deg))'.
    2727PASS 'rotate(max(90deg, 1.57rad, 0.25turn))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    28 FAIL 'rotate(max(0.25turn, 1.57rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'. assert_equals: 'rotate(max(0.25turn, 1.57rad, 90deg))' and 'rotate(calc(90deg))' should serialize the same in specified values. expected "rotate(calc(90deg))" but got "rotate(max(90deg))"
     28PASS 'rotate(max(0.25turn, 1.57rad, 90deg))' as a specified value should serialize as 'rotate(calc(90deg))'.
    2929PASS 'rotate(max(0.25turn, 1.57rad, 90deg))' as a computed value should serialize as 'matrix(0, 1, -1, 0, 0, 0)'.
    3030PASS 'rotate(calc(min(30deg) + max(60deg)))' as a specified value should serialize as 'rotate(calc(90deg))'.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-percent-serialize-expected.txt

    r276262 r292893  
    11
    2 FAIL 'min(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'min(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "min(1px)"
     2PASS 'min(1px)' as a specified value should serialize as 'calc(1px)'.
    33PASS 'min(1px)' as a computed value should serialize as '1px'.
    44PASS 'min(1px)' as a used value should serialize as '1px'.
    5 FAIL 'max(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'max(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "max(1px)"
     5PASS 'max(1px)' as a specified value should serialize as 'calc(1px)'.
    66PASS 'max(1px)' as a computed value should serialize as '1px'.
    77PASS 'max(1px)' as a used value should serialize as '1px'.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-length-serialize-expected.txt

    r267650 r292893  
    11
    2 FAIL 'min(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'min(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "min(1px)"
     2PASS 'min(1px)' as a specified value should serialize as 'calc(1px)'.
    33PASS 'min(1px)' as a computed value should serialize as '1px'.
    4 FAIL 'min(1in)' as a specified value should serialize as 'calc(96px)'. assert_equals: 'min(1in)' and 'calc(96px)' should serialize the same in specified values. expected "calc(96px)" but got "min(96px)"
     4PASS 'min(1in)' as a specified value should serialize as 'calc(96px)'.
    55PASS 'min(1in)' as a computed value should serialize as '96px'.
    6 FAIL 'max(1px)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'max(1px)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "max(1px)"
     6PASS 'max(1px)' as a specified value should serialize as 'calc(1px)'.
    77PASS 'max(1px)' as a computed value should serialize as '1px'.
    8 FAIL 'max(1in)' as a specified value should serialize as 'calc(96px)'. assert_equals: 'max(1in)' and 'calc(96px)' should serialize the same in specified values. expected "calc(96px)" but got "max(96px)"
     8PASS 'max(1in)' as a specified value should serialize as 'calc(96px)'.
    99PASS 'max(1in)' as a computed value should serialize as '96px'.
    10 FAIL 'min(1PX)' as a specified value should serialize as 'calc(1px)'. assert_equals: 'min(1PX)' and 'calc(1px)' should serialize the same in specified values. expected "calc(1px)" but got "min(1px)"
     10PASS 'min(1PX)' as a specified value should serialize as 'calc(1px)'.
    1111PASS 'min(1PX)' as a computed value should serialize as '1px'.
    12 FAIL 'min(50px, 1in + 1px)' as a specified value should serialize as 'calc(50px)'. assert_equals: 'min(50px, 1in + 1px)' and 'calc(50px)' should serialize the same in specified values. expected "calc(50px)" but got "min(50px)"
     12PASS 'min(50px, 1in + 1px)' as a specified value should serialize as 'calc(50px)'.
    1313PASS 'min(50px, 1in + 1px)' as a computed value should serialize as '50px'.
    14 FAIL 'max(50px, 1in + 1px)' as a specified value should serialize as 'calc(97px)'. assert_equals: 'max(50px, 1in + 1px)' and 'calc(97px)' should serialize the same in specified values. expected "calc(97px)" but got "max(97px)"
     14PASS 'max(50px, 1in + 1px)' as a specified value should serialize as 'calc(97px)'.
    1515PASS 'max(50px, 1in + 1px)' as a computed value should serialize as '97px'.
    1616PASS 'calc(1px + min(1in, 100px))' as a specified value should serialize as 'calc(97px)'.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-number-serialize-expected.txt

    r287909 r292893  
    11
    2 FAIL 'min(.1)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'min(.1)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "min(0.1)"
    3 FAIL 'scale(min(.1))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(min(.1))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(min(0.1))"
     2PASS 'min(.1)' as a specified value should serialize as 'calc(0.1)'.
     3PASS 'scale(min(.1))' as a specified value should serialize as 'scale(calc(0.1))'.
    44PASS 'min(.1)' as a computed value should serialize as '0.1'.
    55PASS 'scale(min(.1))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
    6 FAIL 'max(.1)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'max(.1)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "max(0.1)"
    7 FAIL 'scale(max(.1))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(max(.1))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(max(0.1))"
     6PASS 'max(.1)' as a specified value should serialize as 'calc(0.1)'.
     7PASS 'scale(max(.1))' as a specified value should serialize as 'scale(calc(0.1))'.
    88PASS 'max(.1)' as a computed value should serialize as '0.1'.
    99PASS 'scale(max(.1))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
    10 FAIL 'min(.1, .2, .3)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'min(.1, .2, .3)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "min(0.1)"
    11 FAIL 'scale(min(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(min(.1, .2, .3))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(min(0.1))"
     10PASS 'min(.1, .2, .3)' as a specified value should serialize as 'calc(0.1)'.
     11PASS 'scale(min(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.1))'.
    1212PASS 'min(.1, .2, .3)' as a computed value should serialize as '0.1'.
    1313PASS 'scale(min(.1, .2, .3))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
    14 FAIL 'max(.1, .2, .3)' as a specified value should serialize as 'calc(0.3)'. assert_equals: 'max(.1, .2, .3)' and 'calc(0.3)' should serialize the same in specified values. expected "calc(0.3)" but got "max(0.3)"
    15 FAIL 'scale(max(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.3))'. assert_equals: 'scale(max(.1, .2, .3))' and 'scale(calc(0.3))' should serialize the same in specified values. expected "scale(calc(0.3))" but got "scale(max(0.3))"
     14PASS 'max(.1, .2, .3)' as a specified value should serialize as 'calc(0.3)'.
     15PASS 'scale(max(.1, .2, .3))' as a specified value should serialize as 'scale(calc(0.3))'.
    1616PASS 'max(.1, .2, .3)' as a computed value should serialize as '0.3'.
    1717PASS 'scale(max(.1, .2, .3))' as a computed value should serialize as 'matrix(0.3, 0, 0, 0.3, 0, 0)'.
    18 FAIL 'min(.3, .2, .1)' as a specified value should serialize as 'calc(0.1)'. assert_equals: 'min(.3, .2, .1)' and 'calc(0.1)' should serialize the same in specified values. expected "calc(0.1)" but got "min(0.1)"
    19 FAIL 'scale(min(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.1))'. assert_equals: 'scale(min(.3, .2, .1))' and 'scale(calc(0.1))' should serialize the same in specified values. expected "scale(calc(0.1))" but got "scale(min(0.1))"
     18PASS 'min(.3, .2, .1)' as a specified value should serialize as 'calc(0.1)'.
     19PASS 'scale(min(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.1))'.
    2020PASS 'min(.3, .2, .1)' as a computed value should serialize as '0.1'.
    2121PASS 'scale(min(.3, .2, .1))' as a computed value should serialize as 'matrix(0.1, 0, 0, 0.1, 0, 0)'.
    22 FAIL 'max(.3, .2, .1)' as a specified value should serialize as 'calc(0.3)'. assert_equals: 'max(.3, .2, .1)' and 'calc(0.3)' should serialize the same in specified values. expected "calc(0.3)" but got "max(0.3)"
    23 FAIL 'scale(max(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.3))'. assert_equals: 'scale(max(.3, .2, .1))' and 'scale(calc(0.3))' should serialize the same in specified values. expected "scale(calc(0.3))" but got "scale(max(0.3))"
     22PASS 'max(.3, .2, .1)' as a specified value should serialize as 'calc(0.3)'.
     23PASS 'scale(max(.3, .2, .1))' as a specified value should serialize as 'scale(calc(0.3))'.
    2424PASS 'max(.3, .2, .1)' as a computed value should serialize as '0.3'.
    2525PASS 'scale(max(.3, .2, .1))' as a computed value should serialize as 'matrix(0.3, 0, 0, 0.3, 0, 0)'.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-percentage-serialize-expected.txt

    r286897 r292893  
    11
    2 FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)"
    3 FAIL 'min(1%)' as a computed value should serialize as '1%'. assert_equals: 'min(1%)' and '1%' should serialize the same in computed values. expected "1%" but got "min(1%)"
     2PASS 'min(1%)' as a specified value should serialize as 'calc(1%)'.
     3PASS 'min(1%)' as a computed value should serialize as '1%'.
    44PASS 'min(1%)' as a used value should serialize as '1px'.
    5 FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)"
    6 FAIL 'max(1%)' as a computed value should serialize as '1%'. assert_equals: 'max(1%)' and '1%' should serialize the same in computed values. expected "1%" but got "max(1%)"
     5PASS 'max(1%)' as a specified value should serialize as 'calc(1%)'.
     6PASS 'max(1%)' as a computed value should serialize as '1%'.
    77PASS 'max(1%)' as a used value should serialize as '1px'.
    8 FAIL 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in specified values. expected "min(1%, 2%, 3%)" but got "min(1%)"
    9 FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "min(1%)"
     8FAIL 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in specified values. expected "min(1%, 2%, 3%)" but got "calc(1%)"
     9FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%"
    1010PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'.
    11 FAIL 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in specified values. expected "min(3%, 2%, 1%)" but got "min(1%)"
    12 FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "min(1%)"
     11FAIL 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in specified values. expected "min(3%, 2%, 1%)" but got "calc(1%)"
     12FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%"
    1313PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'.
    14 FAIL 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in specified values. expected "max(1%, 2%, 3%)" but got "max(3%)"
    15 FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "max(3%)"
     14FAIL 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in specified values. expected "max(1%, 2%, 3%)" but got "calc(3%)"
     15FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%"
    1616PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'.
    17 FAIL 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in specified values. expected "max(3%, 2%, 1%)" but got "max(3%)"
    18 FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "max(3%)"
     17FAIL 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in specified values. expected "max(3%, 2%, 1%)" but got "calc(3%)"
     18FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%"
    1919PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'.
    2020PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'.
    21 FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1%) 0px"
     21FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "calc(1%) 0px"
    2222PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(15%)'.
    2323PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as '15%'.
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-values/minmax-time-serialize-expected.txt

    r289997 r292893  
    11
    2 FAIL 'min(1ms)' as a specified value should serialize as 'calc(0.001s)'. assert_equals: 'min(1ms)' and 'calc(0.001s)' should serialize the same in specified values. expected "calc(0.001s)" but got "min(0.001s)"
     2PASS 'min(1ms)' as a specified value should serialize as 'calc(0.001s)'.
    33PASS 'min(1ms)' as a computed value should serialize as '0.001s'.
    4 FAIL 'min(1s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'min(1s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "min(1s)"
     4PASS 'min(1s)' as a specified value should serialize as 'calc(1s)'.
    55PASS 'min(1s)' as a computed value should serialize as '1s'.
    6 FAIL 'max(1ms)' as a specified value should serialize as 'calc(0.001s)'. assert_equals: 'max(1ms)' and 'calc(0.001s)' should serialize the same in specified values. expected "calc(0.001s)" but got "max(0.001s)"
     6PASS 'max(1ms)' as a specified value should serialize as 'calc(0.001s)'.
    77PASS 'max(1ms)' as a computed value should serialize as '0.001s'.
    8 FAIL 'max(1s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'max(1s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "max(1s)"
     8PASS 'max(1s)' as a specified value should serialize as 'calc(1s)'.
    99PASS 'max(1s)' as a computed value should serialize as '1s'.
    10 FAIL 'min(1s, 2s, 3s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'min(1s, 2s, 3s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "min(1s)"
     10PASS 'min(1s, 2s, 3s)' as a specified value should serialize as 'calc(1s)'.
    1111PASS 'min(1s, 2s, 3s)' as a computed value should serialize as '1s'.
    12 FAIL 'min(3s, 2s, 1s)' as a specified value should serialize as 'calc(1s)'. assert_equals: 'min(3s, 2s, 1s)' and 'calc(1s)' should serialize the same in specified values. expected "calc(1s)" but got "min(1s)"
     12PASS 'min(3s, 2s, 1s)' as a specified value should serialize as 'calc(1s)'.
    1313PASS 'min(3s, 2s, 1s)' as a computed value should serialize as '1s'.
    14 FAIL 'max(1s, 2s, 3s)' as a specified value should serialize as 'calc(3s)'. assert_equals: 'max(1s, 2s, 3s)' and 'calc(3s)' should serialize the same in specified values. expected "calc(3s)" but got "max(3s)"
     14PASS 'max(1s, 2s, 3s)' as a specified value should serialize as 'calc(3s)'.
    1515PASS 'max(1s, 2s, 3s)' as a computed value should serialize as '3s'.
    16 FAIL 'max(3s, 2s, 1s)' as a specified value should serialize as 'calc(3s)'. assert_equals: 'max(3s, 2s, 1s)' and 'calc(3s)' should serialize the same in specified values. expected "calc(3s)" but got "max(3s)"
     16PASS 'max(3s, 2s, 1s)' as a specified value should serialize as 'calc(3s)'.
    1717PASS 'max(3s, 2s, 1s)' as a computed value should serialize as '3s'.
    18 FAIL 'min(900ms, 1s)' as a specified value should serialize as 'calc(0.9s)'. assert_equals: 'min(900ms, 1s)' and 'calc(0.9s)' should serialize the same in specified values. expected "calc(0.9s)" but got "min(0.9s)"
     18PASS 'min(900ms, 1s)' as a specified value should serialize as 'calc(0.9s)'.
    1919PASS 'min(900ms, 1s)' as a computed value should serialize as '0.9s'.
    20 FAIL 'max(1100ms, 1s)' as a specified value should serialize as 'calc(1.1s)'. assert_equals: 'max(1100ms, 1s)' and 'calc(1.1s)' should serialize the same in specified values. expected "calc(1.1s)" but got "max(1.1s)"
     20PASS 'max(1100ms, 1s)' as a specified value should serialize as 'calc(1.1s)'.
    2121PASS 'max(1100ms, 1s)' as a computed value should serialize as '1.1s'.
    2222PASS 'calc(min(1s, 2s) + max(3s, 4s) + 10s)' as a specified value should serialize as 'calc(15s)'.
  • trunk/Source/WebCore/ChangeLog

    r292892 r292893  
     12022-04-14  Nikolaos Mouchtaris  <nmouchtaris@apple.com>
     2
     3        calc(): Serialize top level min/max/hypot as calc()
     4        https://bugs.webkit.org/show_bug.cgi?id=239019
     5
     6        Reviewed by Darin Adler.
     7
     8        For functions that would have no effect on the top level value, serialize as calc() rather
     9        than the function.
     10
     11        * css/calc/CSSCalcOperationNode.cpp:
     12        (WebCore::CSSCalcOperationNode::simplifyNode):
     13        * css/calc/CSSCalcOperationNode.h:
     14
    1152022-04-14  Gabriel Nava Marino  <gnavamarino@apple.com>
    216
  • trunk/Source/WebCore/css/calc/CSSCalcOperationNode.cpp

    r292732 r292893  
    867867}
    868868
     869inline void CSSCalcOperationNode::makeTopLevelCalc()
     870{
     871    // Top level calc nodes where we need not preserve the function are changed into add nodes because
     872    // that’s the best way to make them serialize as "calc(xxx)".
     873    m_operator = CalcOperator::Add;
     874}
     875
    869876Ref<CSSCalcExpressionNode> CSSCalcOperationNode::simplifyNode(Ref<CSSCalcExpressionNode>&& rootNode, int depth)
    870877{
     
    902909
    903910        // If only one child remains, return the child (except at the root).
    904         auto shouldCombineParentWithOnlyChild = [](const CSSCalcOperationNode& parent, int depth)
     911        auto shouldCombineParentWithOnlyChild = [](CSSCalcOperationNode& parent, int depth)
    905912        {
    906913            if (parent.children().size() != 1)
     
    910917            if (depth)
    911918                return true;
     919           
     920            if (parent.shouldNotPreserveFunction() && is<CSSCalcPrimitiveValueNode>(parent.children()[0])) {
     921                parent.makeTopLevelCalc();
     922                return false;
     923            }
    912924
    913925            // At the root, preserve the root function by only merging nodes with the same function.
  • trunk/Source/WebCore/css/calc/CSSCalcOperationNode.h

    r292732 r292893  
    143143    }
    144144
     145    void makeTopLevelCalc();
     146    bool shouldNotPreserveFunction() const { return isMinOrMaxNode() || isHypotNode(); }
    145147    static double evaluateOperator(CalcOperator, const Vector<double>&);
    146148    static Ref<CSSCalcExpressionNode> simplifyNode(Ref<CSSCalcExpressionNode>&&, int depth);
Note: See TracChangeset for help on using the changeset viewer.