LibWeb: Make CSS sign(A) behave correctly for negative zero

We were incorrectly returning 0 instead of -0 for sign(-0).

+7 new WPT subtest passes.
This commit is contained in:
Andreas Kling 2025-05-20 12:08:34 +02:00 committed by Andreas Kling
commit 4ef34ebd96
Notes: github-actions[bot] 2025-05-20 11:29:42 +00:00
2 changed files with 10 additions and 10 deletions

View file

@ -1400,7 +1400,7 @@ Optional<CalculatedStyleValue::CalculationResult> SignCalculationNode::run_opera
sign = 1; sign = 1;
} else { } else {
FloatExtractor<double> const extractor { .d = child_value->value() }; FloatExtractor<double> const extractor { .d = child_value->value() };
sign = extractor.sign ? -0 : 0; sign = extractor.sign ? -0.0 : 0.0;
} }
return CalculatedStyleValue::CalculationResult { sign, CSSNumericType {}.made_consistent_with(child_value->type().value()) }; return CalculatedStyleValue::CalculationResult { sign, CSSNumericType {}.made_consistent_with(child_value->type().value()) };

View file

@ -2,8 +2,8 @@ Harness status: OK
Found 233 tests Found 233 tests
174 Pass 181 Pass
59 Fail 52 Fail
Pass abs(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 sign(1) should be used-value-equivalent to 1
Pass abs(-1) should be used-value-equivalent to 1 Pass abs(-1) should be used-value-equivalent to 1
@ -26,7 +26,7 @@ Pass abs(-10px) should be used-value-equivalent to 10px
Pass abs(-10%) should be used-value-equivalent to 10px Pass abs(-10%) should be used-value-equivalent to 10px
Pass calc((1em + 1px) * (sign(1em - 10px - 10%) + 1)) should be used-value-equivalent to 21px Pass calc((1em + 1px) * (sign(1em - 10px - 10%) + 1)) should be used-value-equivalent to 21px
Pass calc(calc(sign(-0))) should be used-value-equivalent to 0 Pass calc(calc(sign(-0))) should be used-value-equivalent to 0
Fail clamp(-1, calc( 1 / sign(calc(sign(-0)))), 1) should be used-value-equivalent to -1 Pass clamp(-1, calc( 1 / sign(calc(sign(-0)))), 1) should be used-value-equivalent to -1
Pass calc(calc(sign(0))) should be used-value-equivalent to 0 Pass calc(calc(sign(0))) should be used-value-equivalent to 0
Pass clamp(-1, calc( 1 / sign(calc(sign(0)))), 1) should be used-value-equivalent to 1 Pass clamp(-1, calc( 1 / sign(calc(sign(0)))), 1) should be used-value-equivalent to 1
Pass abs(infinity) should be used-value-equivalent to calc(infinity) Pass abs(infinity) should be used-value-equivalent to calc(infinity)
@ -146,9 +146,9 @@ Pass clamp(-1, calc( 1 / sign(sign(0s))), 1) should be used-value-equivalent to
Pass calc(sign(0ms)) should be used-value-equivalent to 0 Pass calc(sign(0ms)) should be used-value-equivalent to 0
Pass clamp(-1, calc( 1 / sign(sign(0ms))), 1) should be used-value-equivalent to 1 Pass clamp(-1, calc( 1 / sign(sign(0ms))), 1) should be used-value-equivalent to 1
Pass calc(sign(-0s)) should be used-value-equivalent to 0 Pass calc(sign(-0s)) should be used-value-equivalent to 0
Fail clamp(-1, calc( 1 / sign(sign(-0s))), 1) should be used-value-equivalent to -1 Pass clamp(-1, calc( 1 / sign(sign(-0s))), 1) should be used-value-equivalent to -1
Pass calc(sign(-0ms)) should be used-value-equivalent to 0 Pass calc(sign(-0ms)) should be used-value-equivalent to 0
Fail clamp(-1, calc( 1 / sign(sign(-0ms))), 1) should be used-value-equivalent to -1 Pass clamp(-1, calc( 1 / sign(sign(-0ms))), 1) should be used-value-equivalent to -1
Pass calc(sign(0deg)) should be used-value-equivalent to 0 Pass calc(sign(0deg)) should be used-value-equivalent to 0
Pass clamp(-1, calc( 1 / sign(sign(0deg))), 1) should be used-value-equivalent to 1 Pass clamp(-1, calc( 1 / sign(sign(0deg))), 1) should be used-value-equivalent to 1
Pass calc(sign(0grad)) should be used-value-equivalent to 0 Pass calc(sign(0grad)) should be used-value-equivalent to 0
@ -158,13 +158,13 @@ Pass clamp(-1, calc( 1 / sign(sign(0rad))), 1) should be used-value-equivalent t
Pass calc(sign(0turn)) should be used-value-equivalent to 0 Pass calc(sign(0turn)) should be used-value-equivalent to 0
Pass clamp(-1, calc( 1 / sign(sign(0turn))), 1) should be used-value-equivalent to 1 Pass clamp(-1, calc( 1 / sign(sign(0turn))), 1) should be used-value-equivalent to 1
Pass calc(sign(-0deg)) should be used-value-equivalent to 0 Pass calc(sign(-0deg)) should be used-value-equivalent to 0
Fail clamp(-1, calc( 1 / sign(sign(-0deg))), 1) should be used-value-equivalent to -1 Pass clamp(-1, calc( 1 / sign(sign(-0deg))), 1) should be used-value-equivalent to -1
Pass calc(sign(-0grad)) should be used-value-equivalent to 0 Pass calc(sign(-0grad)) should be used-value-equivalent to 0
Fail clamp(-1, calc( 1 / sign(sign(-0grad))), 1) should be used-value-equivalent to -1 Pass clamp(-1, calc( 1 / sign(sign(-0grad))), 1) should be used-value-equivalent to -1
Pass calc(sign(-0rad)) should be used-value-equivalent to 0 Pass calc(sign(-0rad)) should be used-value-equivalent to 0
Fail clamp(-1, calc( 1 / sign(sign(-0rad))), 1) should be used-value-equivalent to -1 Pass clamp(-1, calc( 1 / sign(sign(-0rad))), 1) should be used-value-equivalent to -1
Pass calc(sign(-0turn)) should be used-value-equivalent to 0 Pass calc(sign(-0turn)) should be used-value-equivalent to 0
Fail clamp(-1, calc( 1 / sign(sign(-0turn))), 1) should be used-value-equivalent to -1 Pass clamp(-1, calc( 1 / sign(sign(-0turn))), 1) should be used-value-equivalent to -1
Pass abs(1px) should be used-value-equivalent to 1px Pass abs(1px) should be used-value-equivalent to 1px
Pass abs(1cm) should be used-value-equivalent to 1cm Pass abs(1cm) should be used-value-equivalent to 1cm
Pass abs(1mm) should be used-value-equivalent to 1mm Pass abs(1mm) should be used-value-equivalent to 1mm