diff --git a/Tests/LibWeb/Text/expected/css/calc-missing-context.txt b/Tests/LibWeb/Text/expected/css/calc-missing-context.txt new file mode 100644 index 00000000000..2caa40cdf57 --- /dev/null +++ b/Tests/LibWeb/Text/expected/css/calc-missing-context.txt @@ -0,0 +1 @@ +NO CRASH diff --git a/Tests/LibWeb/Text/input/css/calc-missing-context.html b/Tests/LibWeb/Text/input/css/calc-missing-context.html new file mode 100644 index 00000000000..19b28454c57 --- /dev/null +++ b/Tests/LibWeb/Text/input/css/calc-missing-context.html @@ -0,0 +1,15 @@ + + +
diff --git a/Userland/Libraries/LibWeb/CSS/Length.h b/Userland/Libraries/LibWeb/CSS/Length.h index f3556ca63d2..1a8e0d968b1 100644 --- a/Userland/Libraries/LibWeb/CSS/Length.h +++ b/Userland/Libraries/LibWeb/CSS/Length.h @@ -178,11 +178,14 @@ class Length { { if (is_auto()) return 0; + if (is_absolute()) + return absolute_length_to_px(); if (is_font_relative()) return font_relative_length_to_px(font_metrics, root_font_metrics); if (is_viewport_relative()) return viewport_relative_length_to_px(viewport_rect); - return absolute_length_to_px(); + + VERIFY_NOT_REACHED(); } ALWAYS_INLINE CSSPixels absolute_length_to_px() const diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/CSSMathValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValues/CSSMathValue.cpp index 7da3e81bf17..7283e3397d2 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValues/CSSMathValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/CSSMathValue.cpp @@ -40,10 +40,23 @@ static double resolve_value(CSSMathValue::CalculationResult::Value value, Option [](Angle const& angle) { return angle.to_degrees(); }, [](Flex const& flex) { return flex.to_fr(); }, [](Frequency const& frequency) { return frequency.to_hertz(); }, - [&context](Length const& length) { return length.to_px(*context).to_double(); }, [](Percentage const& percentage) { return percentage.value(); }, [](Resolution const& resolution) { return resolution.to_dots_per_pixel(); }, - [](Time const& time) { return time.to_seconds(); }); + [](Time const& time) { return time.to_seconds(); }, + [&context](Length const& length) { + // Handle some common cases first, so we can resolve more without a context + if (length.is_auto()) + return 0.0; + + if (length.is_absolute()) + return length.absolute_length_to_px().to_double(); + + // If we dont have a context, we cant resolve the length, so return NAN + if (!context.has_value()) + return Number(Number::Type::Number, NAN).value(); + + return length.to_px(*context).to_double(); + }); } static Optional add_the_types(Vector> const& nodes, PropertyID property_id) @@ -2390,6 +2403,12 @@ void CSSMathValue::CalculationResult::add_or_subtract_internal(SumOperation op, } }, [&](Length const& length) { + if (!context.has_value()) { + dbgln("CSSMathValue::CalculationResult::add_or_subtract_internal: Length without context"); + m_value = Length::make_px(0); + return; + } + auto this_px = length.to_px(*context); if (other.m_value.has()) { auto other_px = other.m_value.get().to_px(*context);