From 536f8c395ceb3a5f6af0ebcd5f19e001f50709e0 Mon Sep 17 00:00:00 2001 From: Callum Law Date: Wed, 25 Jun 2025 14:25:20 +1200 Subject: [PATCH] LibWeb: Set numeric type of asin, acos, atan calculation results Previously we were omitting the numeric type which meant these functions weren't valid in some cases e.g. within rotate() functions. --- .../CSS/StyleValues/CalculatedStyleValue.cpp | 2 +- .../acos-asin-atan-atan2-computed.txt | 51 +++++++++++++ .../acos-asin-atan-atan2-serialize.txt | 68 +++++++++++++++++ .../acos-asin-atan-atan2-computed.html | 73 +++++++++++++++++++ .../acos-asin-atan-atan2-serialize.html | 61 ++++++++++++++++ 5 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-computed.txt create mode 100644 Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-computed.html create mode 100644 Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.html diff --git a/Libraries/LibWeb/CSS/StyleValues/CalculatedStyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/CalculatedStyleValue.cpp index a230bff43e2..2e0f81cb6a6 100644 --- a/Libraries/LibWeb/CSS/StyleValues/CalculatedStyleValue.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/CalculatedStyleValue.cpp @@ -1702,7 +1702,7 @@ static Optional run_asin_acos_or_atan_o break; } - return CalculatedStyleValue::CalculationResult { result, CSSNumericType {}.made_consistent_with(child.numeric_type().value()) }; + return CalculatedStyleValue::CalculationResult { result, CSSNumericType { CSSNumericType::BaseType::Angle, 1 }.made_consistent_with(child.numeric_type().value()) }; } // https://drafts.csswg.org/css-values-4/#funcdef-asin diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-computed.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-computed.txt new file mode 100644 index 00000000000..eb74f4a8383 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-computed.txt @@ -0,0 +1,51 @@ +Harness status: OK + +Found 45 tests + +34 Pass +11 Fail +Pass acos(1) should be used-value-equivalent to 0deg +Pass atan(0) should be used-value-equivalent to 0deg +Pass asin(0) should be used-value-equivalent to 0deg +Pass atan2(0,0) should be used-value-equivalent to 0deg +Pass calc(asin(sin(pi/2))) should be used-value-equivalent to 90deg +Pass calc(acos(cos(pi - 3.14159265358979323846))) should be used-value-equivalent to 0deg +Pass calc(atan(e - 2.7182818284590452354) ) should be used-value-equivalent to 0deg +Pass calc(asin(sin(30deg + 1.0471967rad ) )) should be used-value-equivalent to 90deg +Pass calc(acos(cos(30deg - 0.523599rad ) )) should be used-value-equivalent to 0deg +Pass calc(asin(sin(3.14159 / 2 + 1 - 1) )) should be used-value-equivalent to 90deg +Pass calc(asin(sin(100grad) )) should be used-value-equivalent to 90deg +Pass calc(acos(cos(0 / 2 + 1 - 1) )) should be used-value-equivalent to 0deg +Pass calc(atan(tan(30deg + 0.261799rad ) )) should be used-value-equivalent to 45deg +Pass calc(atan(tan(0.7853975rad ) )) should be used-value-equivalent to 45deg +Pass calc(atan(tan(3.14159 / 4 + 1 - 1) )) should be used-value-equivalent to 45deg +Pass calc(asin(sin(0.25turn)) ) should be used-value-equivalent to 90deg +Pass calc(atan2(0,1)) should be used-value-equivalent to 0deg +Pass calc(atan2(0,-1) / 4) should be used-value-equivalent to 45deg +Pass calc(atan2(1,-1)) should be used-value-equivalent to 135deg +Pass calc(atan2(-1,1)) should be used-value-equivalent to -45deg +Fail calc(asin(sin(180deg * sibling-index()))) should be used-value-equivalent to 0deg +Fail calc(acos(cos(180deg * sibling-index()))) should be used-value-equivalent to 180deg +Fail calc(atan(tan(180deg * sibling-index()))) should be used-value-equivalent to 0deg +Pass calc(cos(sin(acos(cos(pi))))) should be used-value-equivalent to 1 +Pass atan2(1px, -1px) should be used-value-equivalent to 135deg +Pass atan2(1cm, -1cm) should be used-value-equivalent to 135deg +Pass atan2(1mm, -1mm) should be used-value-equivalent to 135deg +Pass atan2(1Q, -1Q) should be used-value-equivalent to 135deg +Pass atan2(1in, -1in) should be used-value-equivalent to 135deg +Pass atan2(1pc, -1pc) should be used-value-equivalent to 135deg +Pass atan2(1pt, -1pt) should be used-value-equivalent to 135deg +Fail atan2(1em, -1em) should be used-value-equivalent to 135deg +Fail atan2(1ex, -1ex) should be used-value-equivalent to 135deg +Fail atan2(1ch, -1ch) should be used-value-equivalent to 135deg +Fail atan2(1rem, -1rem) should be used-value-equivalent to 135deg +Fail atan2(1rem + 1px - 1px, -1rem) should be used-value-equivalent to 135deg +Fail atan2(1vh, -1vh) should be used-value-equivalent to 135deg +Fail atan2(1vh + 0px, -1vh + 0px) should be used-value-equivalent to 135deg +Fail atan2(1vw, -1vw) should be used-value-equivalent to 135deg +Pass atan2(1deg, -1deg) should be used-value-equivalent to 135deg +Pass atan2(1grad, -1grad) should be used-value-equivalent to 135deg +Pass atan2(1turn, -1turn) should be used-value-equivalent to 135deg +Pass atan2(1rad, -1rad) should be used-value-equivalent to 135deg +Pass atan2(1s, -1s) should be used-value-equivalent to 135deg +Pass atan2(1ms, -1ms) should be used-value-equivalent to 135deg \ No newline at end of file diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.txt new file mode 100644 index 00000000000..faf9dc54a84 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.txt @@ -0,0 +1,68 @@ +Harness status: OK + +Found 62 tests + +50 Pass +12 Fail +Pass 'rotate(acos(1))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(calc(acos(1)))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(acos(-1))' as a specified value should serialize as 'rotate(calc(180deg))'. +Pass 'rotate(calc(acos(-1)))' as a specified value should serialize as 'rotate(calc(180deg))'. +Pass 'rotate(acos(-1.5))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(acos(-1.5)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(acos(1.5))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(acos(1.5)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(acos(2))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(acos(2)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Fail 'rotate(acos(0.5))' as a specified value should serialize as 'rotate(calc(60deg))'. +Fail 'rotate(calc(acos(0.5)))' as a specified value should serialize as 'rotate(calc(60deg))'. +Fail 'rotate(acos(1 - 0.5))' as a specified value should serialize as 'rotate(calc(60deg))'. +Fail 'rotate(calc(acos(1 - 0.5)))' as a specified value should serialize as 'rotate(calc(60deg))'. +Pass 'rotate(acos(0))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(calc(acos(0)))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(asin(1))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(calc(asin(1)))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(asin(-1))' as a specified value should serialize as 'rotate(calc(-90deg))'. +Pass 'rotate(calc(asin(-1)))' as a specified value should serialize as 'rotate(calc(-90deg))'. +Pass 'rotate(asin(-1.5))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(asin(-1.5)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(asin(1.5))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(asin(1.5)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(asin(2))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(asin(2)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Fail 'rotate(asin(0.5))' as a specified value should serialize as 'rotate(calc(30deg))'. +Fail 'rotate(calc(asin(0.5)))' as a specified value should serialize as 'rotate(calc(30deg))'. +Fail 'rotate(asin(1 - 0.5))' as a specified value should serialize as 'rotate(calc(30deg))'. +Fail 'rotate(calc(asin(1 - 0.5)))' as a specified value should serialize as 'rotate(calc(30deg))'. +Pass 'rotate(asin(0))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(calc(asin(0)))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(acos(pi - pi))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(calc(acos(pi - pi)))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(asin(pi - pi + 1))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(calc(asin(pi - pi + 1)))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(atan(1))' as a specified value should serialize as 'rotate(calc(45deg))'. +Pass 'rotate(calc(atan(1)))' as a specified value should serialize as 'rotate(calc(45deg))'. +Fail 'rotate(atan(0.577350269))' as a specified value should serialize as 'rotate(calc(30deg))'. +Fail 'rotate(calc(atan(0.577350269)))' as a specified value should serialize as 'rotate(calc(30deg))'. +Pass 'rotate(atan(0))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(calc(atan(0)))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(atan(infinity))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(calc(atan(infinity)))' as a specified value should serialize as 'rotate(calc(90deg))'. +Fail 'rotate(atan2(37.320508075, 10))' as a specified value should serialize as 'rotate(calc(75deg))'. +Fail 'rotate(calc(atan2(37.320508075, 10)))' as a specified value should serialize as 'rotate(calc(75deg))'. +Pass 'rotate(atan2(1s, 1000ms))' as a specified value should serialize as 'rotate(calc(45deg))'. +Pass 'rotate(calc(atan2(1s, 1000ms)))' as a specified value should serialize as 'rotate(calc(45deg))'. +Pass 'rotate(atan2(infinity, infinity))' as a specified value should serialize as 'rotate(calc(45deg))'. +Pass 'rotate(calc(atan2(infinity, infinity)))' as a specified value should serialize as 'rotate(calc(45deg))'. +Pass 'rotate(atan2(-infinity, -infinity))' as a specified value should serialize as 'rotate(calc(-135deg))'. +Pass 'rotate(calc(atan2(-infinity, -infinity)))' as a specified value should serialize as 'rotate(calc(-135deg))'. +Pass 'rotate(atan2(infinity, 10))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(calc(atan2(infinity, 10)))' as a specified value should serialize as 'rotate(calc(90deg))'. +Pass 'rotate(atan2(10, infinity))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(calc(atan2(10, infinity)))' as a specified value should serialize as 'rotate(calc(0deg))'. +Pass 'rotate(atan2(NaN, 10))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(atan2(NaN, 10)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(atan2(10, NaN))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(atan2(10, NaN)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(atan2(NaN, NaN))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. +Pass 'rotate(calc(atan2(NaN, NaN)))' as a specified value should serialize as 'rotate(calc(NaN * 1deg))'. \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-computed.html b/Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-computed.html new file mode 100644 index 00000000000..53351b42c7a --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-computed.html @@ -0,0 +1,73 @@ + + + + + + + + +
+ diff --git a/Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.html b/Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.html new file mode 100644 index 00000000000..ea57e1b8ba7 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/css-values/acos-asin-atan-atan2-serialize.html @@ -0,0 +1,61 @@ + + + + + + + + + +
+