diff --git a/Userland/Libraries/LibWeb/CSS/CalculatedOr.cpp b/Userland/Libraries/LibWeb/CSS/CalculatedOr.cpp index 51d2a34f89..16f12bc1c7 100644 --- a/Userland/Libraries/LibWeb/CSS/CalculatedOr.cpp +++ b/Userland/Libraries/LibWeb/CSS/CalculatedOr.cpp @@ -5,6 +5,15 @@ */ #include "CalculatedOr.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace Web::CSS { @@ -13,21 +22,41 @@ Angle AngleOrCalculated::resolve_calculated(NonnullRefPtr return calculated->resolve_angle().value(); } +NonnullRefPtr AngleOrCalculated::create_style_value() const +{ + return AngleStyleValue::create(value()); +} + Flex FlexOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const&) const { return calculated->resolve_flex().value(); } +NonnullRefPtr FlexOrCalculated::create_style_value() const +{ + return FlexStyleValue::create(value()); +} + Frequency FrequencyOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const&) const { return calculated->resolve_frequency().value(); } +NonnullRefPtr FrequencyOrCalculated::create_style_value() const +{ + return FrequencyStyleValue::create(value()); +} + i64 IntegerOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const&) const { return calculated->resolve_integer().value(); } +NonnullRefPtr IntegerOrCalculated::create_style_value() const +{ + return IntegerStyleValue::create(value()); +} + Length LengthOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const& layout_node) const { return calculated->resolve_length(layout_node).value(); @@ -40,24 +69,49 @@ Length LengthOrCalculated::resolved(Length::ResolutionContext const& context) co return value(); } +NonnullRefPtr LengthOrCalculated::create_style_value() const +{ + return LengthStyleValue::create(value()); +} + double NumberOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const&) const { return calculated->resolve_number().value(); } +NonnullRefPtr NumberOrCalculated::create_style_value() const +{ + return NumberStyleValue::create(value()); +} + Percentage PercentageOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const&) const { return calculated->resolve_percentage().value(); } +NonnullRefPtr PercentageOrCalculated::create_style_value() const +{ + return PercentageStyleValue::create(value()); +} + Resolution ResolutionOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const&) const { return calculated->resolve_resolution().value(); } +NonnullRefPtr ResolutionOrCalculated::create_style_value() const +{ + return ResolutionStyleValue::create(value()); +} + Time TimeOrCalculated::resolve_calculated(NonnullRefPtr const& calculated, Layout::Node const&) const { return calculated->resolve_time().value(); } +NonnullRefPtr TimeOrCalculated::create_style_value() const +{ + return TimeStyleValue::create(value()); +} + } diff --git a/Userland/Libraries/LibWeb/CSS/CalculatedOr.h b/Userland/Libraries/LibWeb/CSS/CalculatedOr.h index 1a200b68d2..bbb64f2a62 100644 --- a/Userland/Libraries/LibWeb/CSS/CalculatedOr.h +++ b/Userland/Libraries/LibWeb/CSS/CalculatedOr.h @@ -41,14 +41,19 @@ public: return m_value.template get(); } + NonnullRefPtr as_style_value() const + { + if (is_calculated()) + return calculated(); + return create_style_value(); + } + NonnullRefPtr const& calculated() const { VERIFY(is_calculated()); return m_value.template get>(); } - virtual T resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const = 0; - T resolved(Layout::Node const& layout_node) const { return m_value.visit( @@ -75,6 +80,10 @@ public: return (m_value.template get() == other.m_value.template get()); } +protected: + virtual T resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const = 0; + virtual NonnullRefPtr create_style_value() const = 0; + private: Variant> m_value; }; @@ -83,64 +92,83 @@ class AngleOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - Angle resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; +private: + virtual Angle resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class FlexOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - Flex resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; +private: + virtual Flex resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class FrequencyOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - Frequency resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; +private: + virtual Frequency resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class IntegerOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - i64 resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; +private: + virtual i64 resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class LengthOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - Length resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; [[nodiscard]] Length resolved(Length::ResolutionContext const&) const; + +private: + virtual Length resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class NumberOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - double resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; +private: + virtual double resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class PercentageOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - Percentage resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; +private: + virtual Percentage resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class ResolutionOrCalculated : public CalculatedOr { public: using CalculatedOr::CalculatedOr; - Resolution resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; +private: + virtual Resolution resolve_calculated(NonnullRefPtr const&, Layout::Node const&) const override; + virtual NonnullRefPtr create_style_value() const override; }; class TimeOrCalculated : public CalculatedOr