LibWeb: Coerce NaNs to 0 when escaping top-level calculations

This commit is contained in:
Jelle Raaijmakers 2025-03-25 18:58:08 +00:00 committed by Sam Atkins
parent 545d151948
commit 6a3c3ee291
Notes: github-actions[bot] 2025-03-25 19:54:37 +00:00
3 changed files with 12 additions and 3 deletions

View file

@ -2716,9 +2716,16 @@ Optional<Time> CalculatedStyleValue::resolve_time(CalculationResolutionContext c
Optional<double> CalculatedStyleValue::resolve_number(CalculationResolutionContext const& context) const
{
auto result = m_calculation->resolve(context);
if (result.type().has_value() && result.type()->matches_number(m_context.percentages_resolve_as))
return result.value();
return {};
if (!result.type().has_value() || !result.type()->matches_number(m_context.percentages_resolve_as))
return {};
// https://drafts.csswg.org/css-values/#calc-ieee
// NaN does not escape a top-level calculation; its censored into a zero value.
auto value = result.value();
if (isnan(value))
return 0.;
return value;
}
Optional<i64> CalculatedStyleValue::resolve_integer(CalculationResolutionContext const& context) const

View file

@ -12,6 +12,7 @@ scale(1, 2) => matrix(1, 0, 0, 2, 0, 0)
scale(100%, 200%) => matrix(1, 0, 0, 2, 0, 0)
scale(calc(1 / 2)) => matrix(0.5, 0, 0, 0.5, 0, 0)
scale(calc(50% + 25%)) => matrix(0.75, 0, 0, 0.75, 0, 0)
scale(calc(NaN)) => matrix(0, 0, 0, 0, 0, 0)
scaleX(2) => matrix(2, 0, 0, 1, 0, 0)
scaleX(200%) => matrix(2, 0, 0, 1, 0, 0)
scaleY(2.5) => matrix(1, 0, 0, 2.5, 0, 0)

View file

@ -25,6 +25,7 @@
"scale(100%, 200%)",
"scale(calc(1 / 2))",
"scale(calc(50% + 25%))",
"scale(calc(NaN))",
"scaleX(2)",
"scaleX(200%)",
"scaleY(2.5)",