Skip to content

Commit

Permalink
LibWeb: Handle calculations without a context better
Browse files Browse the repository at this point in the history
  • Loading branch information
stelar7 committed Oct 16, 2024
1 parent c0beacb commit f4070ad
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
5 changes: 4 additions & 1 deletion Userland/Libraries/LibWeb/CSS/Length.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
23 changes: 21 additions & 2 deletions Userland/Libraries/LibWeb/CSS/StyleValues/CSSMathValue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<CSSNumericType> add_the_types(Vector<NonnullOwnPtr<CalculationNode>> const& nodes, PropertyID property_id)
Expand Down Expand Up @@ -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<Length>()) {
auto other_px = other.m_value.get<Length>().to_px(*context);
Expand Down

0 comments on commit f4070ad

Please sign in to comment.