mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-09 09:34:57 +09:00
LibWeb: Make CSS sign(A) ignore A's unit and just look at the raw value
This allows stuff like sign(1em) even when we don't have something to resolve the em unit against. +25 new WPT subtest passes.
This commit is contained in:
parent
4ef34ebd96
commit
d7cd8f0fc7
Notes:
github-actions[bot]
2025-05-20 11:29:37 +00:00
Author: https://github.com/awesomekling
Commit: d7cd8f0fc7
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4823
2 changed files with 39 additions and 34 deletions
|
@ -1384,26 +1384,31 @@ NonnullRefPtr<CalculationNode const> SignCalculationNode::with_simplified_childr
|
|||
}
|
||||
|
||||
// https://drafts.csswg.org/css-values-4/#funcdef-sign
|
||||
Optional<CalculatedStyleValue::CalculationResult> SignCalculationNode::run_operation_if_possible(CalculationContext const& context, CalculationResolutionContext const& resolution_context) const
|
||||
Optional<CalculatedStyleValue::CalculationResult> SignCalculationNode::run_operation_if_possible(CalculationContext const&, CalculationResolutionContext const&) const
|
||||
{
|
||||
// The sign(A) function contains one calculation A, and returns -1 if A’s numeric value is negative,
|
||||
// +1 if A’s numeric value is positive, 0⁺ if A’s numeric value is 0⁺, and 0⁻ if A’s numeric value is 0⁻.
|
||||
// The return type is a <number>, made consistent with the input calculation’s type.
|
||||
auto child_value = try_get_value_with_canonical_unit(m_value, context, resolution_context);
|
||||
if (!child_value.has_value())
|
||||
|
||||
if (m_value->type() != CalculationNode::Type::Numeric)
|
||||
return {};
|
||||
auto const& numeric_child = as<NumericCalculationNode>(*m_value);
|
||||
double raw_value = numeric_child.value().visit(
|
||||
[](Number const& number) { return number.value(); },
|
||||
[](Percentage const& percentage) { return percentage.as_fraction(); },
|
||||
[](auto const& dimension) { return dimension.raw_value(); });
|
||||
|
||||
double sign = 0;
|
||||
if (child_value->value() < 0) {
|
||||
if (raw_value < 0) {
|
||||
sign = -1;
|
||||
} else if (child_value->value() > 0) {
|
||||
} else if (raw_value > 0) {
|
||||
sign = 1;
|
||||
} else {
|
||||
FloatExtractor<double> const extractor { .d = child_value->value() };
|
||||
FloatExtractor<double> const extractor { .d = raw_value };
|
||||
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(numeric_child.numeric_type().value_or({})) };
|
||||
}
|
||||
|
||||
void SignCalculationNode::dump(StringBuilder& builder, int indent) const
|
||||
|
|
|
@ -2,8 +2,8 @@ Harness status: OK
|
|||
|
||||
Found 233 tests
|
||||
|
||||
181 Pass
|
||||
52 Fail
|
||||
206 Pass
|
||||
27 Fail
|
||||
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
|
||||
|
@ -46,14 +46,14 @@ 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
|
||||
Fail sign(1em) should be used-value-equivalent to 1
|
||||
Fail sign(1ex) should be used-value-equivalent to 1
|
||||
Fail sign(1ch) should be used-value-equivalent to 1
|
||||
Fail sign(1rem) should be used-value-equivalent to 1
|
||||
Fail sign(1vh) should be used-value-equivalent to 1
|
||||
Fail sign(1vw) should be used-value-equivalent to 1
|
||||
Fail sign(1vmin) should be used-value-equivalent to 1
|
||||
Fail sign(1vmax) 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
|
||||
|
@ -61,14 +61,14 @@ 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
|
||||
Fail sign(-1em) should be used-value-equivalent to -1
|
||||
Fail sign(-1ex) should be used-value-equivalent to -1
|
||||
Fail sign(-1ch) should be used-value-equivalent to -1
|
||||
Fail sign(-1rem) should be used-value-equivalent to -1
|
||||
Fail sign(-1vh) should be used-value-equivalent to -1
|
||||
Fail sign(-1vw) should be used-value-equivalent to -1
|
||||
Fail sign(-1vmin) should be used-value-equivalent to -1
|
||||
Fail sign(-1vmax) 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
|
||||
|
@ -112,7 +112,7 @@ Pass clamp(-1, calc( 1 / sign(sign(0vmin))), 1) should be used-value-equivalent
|
|||
Pass calc(sign(0vmax)) should be used-value-equivalent to 0
|
||||
Pass clamp(-1, calc( 1 / sign(sign(0vmax))), 1) should be used-value-equivalent to 1
|
||||
Pass calc(sign(-0px)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0px))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0px))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0cm)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0cm))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0mm)) should be used-value-equivalent to 0
|
||||
|
@ -126,21 +126,21 @@ Fail clamp(-1, calc( 1 / sign(sign(-0pc))), 1) should be used-value-equivalent t
|
|||
Pass calc(sign(-0pt)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0pt))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0em)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0em))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0em))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0ex)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0ex))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0ex))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0ch)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0ch))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0ch))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0rem)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0rem))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0rem))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0vh)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0vh))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0vh))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0vw)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0vw))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0vw))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0vmin)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0vmin))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0vmin))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(-0vmax)) should be used-value-equivalent to 0
|
||||
Fail clamp(-1, calc( 1 / sign(sign(-0vmax))), 1) should be used-value-equivalent to -1
|
||||
Pass clamp(-1, calc( 1 / sign(sign(-0vmax))), 1) should be used-value-equivalent to -1
|
||||
Pass calc(sign(0s)) should be used-value-equivalent to 0
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue