From 99bce9a94dc6c926b4366a444cbd71940fac8d1b Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 8 Aug 2025 11:08:54 +0100 Subject: [PATCH] LibWeb/CSS: Replace CSSUnitValue with DimensionStyleValue CSSUnitValue is a typed-om type which we will implement separately in the future. However, it still seems useful to give our dimension values a base class. (Maybe they could be templated in the future?) So instead of deleting it entirely, rename it to DimensionStyleValue and make its API match our style better. --- Libraries/LibWeb/CSS/Parser/DescriptorParsing.cpp | 6 +++--- Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp | 8 ++++---- .../LibWeb/CSS/StyleValues/AngleStyleValue.cpp | 2 +- Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.h | 8 ++++---- Libraries/LibWeb/CSS/StyleValues/CSSRGB.cpp | 2 +- .../CSS/StyleValues/ColorFunctionStyleValue.cpp | 2 +- .../{CSSUnitValue.h => DimensionStyleValue.h} | 13 ++++++------- Libraries/LibWeb/CSS/StyleValues/FlexStyleValue.h | 10 +++++----- .../LibWeb/CSS/StyleValues/FrequencyStyleValue.h | 10 +++++----- Libraries/LibWeb/CSS/StyleValues/LengthStyleValue.h | 10 +++++----- .../LibWeb/CSS/StyleValues/PercentageStyleValue.h | 10 +++++----- .../LibWeb/CSS/StyleValues/ResolutionStyleValue.h | 10 +++++----- Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp | 6 ++++++ Libraries/LibWeb/CSS/StyleValues/StyleValue.h | 7 +++++++ Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h | 10 +++++----- Libraries/LibWeb/Forward.h | 1 + Libraries/LibWeb/HTML/Parser/HTMLParser.cpp | 2 +- 17 files changed, 65 insertions(+), 52 deletions(-) rename Libraries/LibWeb/CSS/StyleValues/{CSSUnitValue.h => DimensionStyleValue.h} (53%) diff --git a/Libraries/LibWeb/CSS/Parser/DescriptorParsing.cpp b/Libraries/LibWeb/CSS/Parser/DescriptorParsing.cpp index f3e650fb7d0..65834fa4daa 100644 --- a/Libraries/LibWeb/CSS/Parser/DescriptorParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/DescriptorParsing.cpp @@ -133,13 +133,13 @@ Parser::ParseErrorOr> Parser::parse_descriptor_v // {1,2} if (auto first_length = parse_length_value(tokens)) { - if (first_length->is_length() && first_length->as_length().length().raw_value() < 0) + if (first_length->is_length() && first_length->as_length().raw_value() < 0) return nullptr; tokens.discard_whitespace(); if (auto second_length = parse_length_value(tokens)) { - if (second_length->is_length() && second_length->as_length().length().raw_value() < 0) + if (second_length->is_length() && second_length->as_length().raw_value() < 0) return nullptr; return StyleValueList::create(StyleValueVector { first_length.release_nonnull(), second_length.release_nonnull() }, StyleValueList::Separator::Space); @@ -186,7 +186,7 @@ Parser::ParseErrorOr> Parser::parse_descriptor_v case DescriptorMetadata::ValueType::PositivePercentage: { if (auto percentage_value = parse_percentage_value(tokens)) { if (percentage_value->is_percentage()) { - if (percentage_value->as_percentage().value() < 0) + if (percentage_value->as_percentage().raw_value() < 0) return nullptr; return percentage_value.release_nonnull(); } diff --git a/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp b/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp index 8458540ceb9..26f969e4acc 100644 --- a/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp @@ -2032,9 +2032,9 @@ RefPtr Parser::parse_single_shadow_value(TokenStreamis_length() && blur_radius->as_length().length().raw_value() < 0) + if (blur_radius->is_length() && blur_radius->as_length().raw_value() < 0) return nullptr; - if (blur_radius->is_percentage() && blur_radius->as_percentage().value() < 0) + if (blur_radius->is_percentage() && blur_radius->as_percentage().raw_value() < 0) return nullptr; tokens.discard_a_token(); @@ -2189,9 +2189,9 @@ RefPtr Parser::parse_stroke_dasharray_value(TokenStreamis_percentage() && value->as_percentage().value() < 0) + if (value->is_percentage() && value->as_percentage().raw_value() < 0) return {}; - if (value->is_length() && value->as_length().length().raw_value() < 0) + if (value->is_length() && value->as_length().raw_value() < 0) return {}; dashes.append(value.release_nonnull()); } diff --git a/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.cpp index ddebc0a5f3f..034bcb2b62b 100644 --- a/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.cpp @@ -12,7 +12,7 @@ namespace Web::CSS { AngleStyleValue::AngleStyleValue(Angle angle) - : CSSUnitValue(Type::Angle) + : DimensionStyleValue(Type::Angle) , m_angle(move(angle)) { } diff --git a/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.h index ab23c339a97..c76793f0468 100644 --- a/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/AngleStyleValue.h @@ -10,11 +10,11 @@ #pragma once #include -#include +#include namespace Web::CSS { -class AngleStyleValue : public CSSUnitValue { +class AngleStyleValue : public DimensionStyleValue { public: static ValueComparingNonnullRefPtr create(Angle angle) { @@ -23,8 +23,8 @@ public: virtual ~AngleStyleValue() override; Angle const& angle() const { return m_angle; } - virtual double value() const override { return m_angle.raw_value(); } - virtual StringView unit() const override { return m_angle.unit_name(); } + virtual double raw_value() const override { return m_angle.raw_value(); } + virtual StringView unit_name() const override { return m_angle.unit_name(); } virtual String to_string(SerializationMode) const override; diff --git a/Libraries/LibWeb/CSS/StyleValues/CSSRGB.cpp b/Libraries/LibWeb/CSS/StyleValues/CSSRGB.cpp index 147667d362d..a374eb7f47c 100644 --- a/Libraries/LibWeb/CSS/StyleValues/CSSRGB.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/CSSRGB.cpp @@ -28,7 +28,7 @@ Optional CSSRGB::to_color(ColorResolutionContext color_resolution_context return normalized(style_value.as_number().number()); if (style_value.is_percentage()) - return normalized(style_value.as_percentage().value() * 255 / 100); + return normalized(style_value.as_percentage().raw_value() * 255 / 100); if (style_value.is_calculated()) { auto const& calculated = style_value.as_calculated(); diff --git a/Libraries/LibWeb/CSS/StyleValues/ColorFunctionStyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/ColorFunctionStyleValue.cpp index 4b22f774696..8b9faf28be6 100644 --- a/Libraries/LibWeb/CSS/StyleValues/ColorFunctionStyleValue.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/ColorFunctionStyleValue.cpp @@ -105,7 +105,7 @@ String ColorFunctionStyleValue::to_string(SerializationMode mode) const { auto convert_percentage = [&](ValueComparingNonnullRefPtr const& value) -> RemoveReference { if (value->is_percentage()) - return NumberStyleValue::create(value->as_percentage().value() / 100); + return NumberStyleValue::create(value->as_percentage().raw_value() / 100); if (mode == SerializationMode::ResolvedValue && value->is_calculated()) { // FIXME: Figure out how to get the proper calculation resolution context here CalculationResolutionContext context {}; diff --git a/Libraries/LibWeb/CSS/StyleValues/CSSUnitValue.h b/Libraries/LibWeb/CSS/StyleValues/DimensionStyleValue.h similarity index 53% rename from Libraries/LibWeb/CSS/StyleValues/CSSUnitValue.h rename to Libraries/LibWeb/CSS/StyleValues/DimensionStyleValue.h index 976b7e9034f..8073d07beb1 100644 --- a/Libraries/LibWeb/CSS/StyleValues/CSSUnitValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/DimensionStyleValue.h @@ -13,20 +13,19 @@ namespace Web::CSS { -// https://drafts.css-houdini.org/css-typed-om-1/#cssunitvalue -class CSSUnitValue : public StyleValue { +class DimensionStyleValue : public StyleValue { public: - virtual ~CSSUnitValue() override = default; + virtual ~DimensionStyleValue() override = default; - virtual double value() const = 0; - virtual StringView unit() const = 0; + virtual double raw_value() const = 0; + virtual StringView unit_name() const = 0; virtual Vector tokenize() const override { - return { Parser::Token::create_dimension(value(), FlyString::from_utf8_without_validation(unit().bytes())) }; + return { Parser::Token::create_dimension(raw_value(), FlyString::from_utf8_without_validation(unit_name().bytes())) }; } protected: - explicit CSSUnitValue(Type type) + explicit DimensionStyleValue(Type type) : StyleValue(type) { } diff --git a/Libraries/LibWeb/CSS/StyleValues/FlexStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/FlexStyleValue.h index 8dfaa23a1d4..c0a85367878 100644 --- a/Libraries/LibWeb/CSS/StyleValues/FlexStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/FlexStyleValue.h @@ -7,11 +7,11 @@ #pragma once #include -#include +#include namespace Web::CSS { -class FlexStyleValue final : public CSSUnitValue { +class FlexStyleValue final : public DimensionStyleValue { public: static ValueComparingNonnullRefPtr create(Flex flex) { @@ -20,8 +20,8 @@ public: virtual ~FlexStyleValue() override = default; Flex const& flex() const { return m_flex; } - virtual double value() const override { return m_flex.raw_value(); } - virtual StringView unit() const override { return m_flex.unit_name(); } + virtual double raw_value() const override { return m_flex.raw_value(); } + virtual StringView unit_name() const override { return m_flex.unit_name(); } virtual String to_string(SerializationMode serialization_mode) const override { return m_flex.to_string(serialization_mode); } @@ -35,7 +35,7 @@ public: private: FlexStyleValue(Flex&& flex) - : CSSUnitValue(Type::Flex) + : DimensionStyleValue(Type::Flex) , m_flex(flex) { } diff --git a/Libraries/LibWeb/CSS/StyleValues/FrequencyStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/FrequencyStyleValue.h index 7d924382c89..37a8c2f154c 100644 --- a/Libraries/LibWeb/CSS/StyleValues/FrequencyStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/FrequencyStyleValue.h @@ -10,11 +10,11 @@ #pragma once #include -#include +#include namespace Web::CSS { -class FrequencyStyleValue final : public CSSUnitValue { +class FrequencyStyleValue final : public DimensionStyleValue { public: static ValueComparingNonnullRefPtr create(Frequency frequency) { @@ -23,8 +23,8 @@ public: virtual ~FrequencyStyleValue() override = default; Frequency const& frequency() const { return m_frequency; } - virtual double value() const override { return m_frequency.raw_value(); } - virtual StringView unit() const override { return m_frequency.unit_name(); } + virtual double raw_value() const override { return m_frequency.raw_value(); } + virtual StringView unit_name() const override { return m_frequency.unit_name(); } virtual String to_string(SerializationMode serialization_mode) const override { return m_frequency.to_string(serialization_mode); } @@ -38,7 +38,7 @@ public: private: explicit FrequencyStyleValue(Frequency frequency) - : CSSUnitValue(Type::Frequency) + : DimensionStyleValue(Type::Frequency) , m_frequency(move(frequency)) { } diff --git a/Libraries/LibWeb/CSS/StyleValues/LengthStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/LengthStyleValue.h index e559a636343..926fcdcadcc 100644 --- a/Libraries/LibWeb/CSS/StyleValues/LengthStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/LengthStyleValue.h @@ -10,18 +10,18 @@ #pragma once #include -#include +#include namespace Web::CSS { -class LengthStyleValue final : public CSSUnitValue { +class LengthStyleValue final : public DimensionStyleValue { public: static ValueComparingNonnullRefPtr create(Length const&); virtual ~LengthStyleValue() override = default; Length const& length() const { return m_length; } - virtual double value() const override { return m_length.raw_value(); } - virtual StringView unit() const override { return m_length.unit_name(); } + virtual double raw_value() const override { return m_length.raw_value(); } + virtual StringView unit_name() const override { return m_length.unit_name(); } virtual String to_string(SerializationMode serialization_mode) const override { return m_length.to_string(serialization_mode); } virtual ValueComparingNonnullRefPtr absolutized(CSSPixelRect const& viewport_rect, Length::FontMetrics const& font_metrics, Length::FontMetrics const& root_font_metrics) const override; @@ -30,7 +30,7 @@ public: private: explicit LengthStyleValue(Length const& length) - : CSSUnitValue(Type::Length) + : DimensionStyleValue(Type::Length) , m_length(length) { } diff --git a/Libraries/LibWeb/CSS/StyleValues/PercentageStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/PercentageStyleValue.h index 280584e0804..e4b919f0733 100644 --- a/Libraries/LibWeb/CSS/StyleValues/PercentageStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/PercentageStyleValue.h @@ -10,11 +10,11 @@ #pragma once #include -#include +#include namespace Web::CSS { -class PercentageStyleValue final : public CSSUnitValue { +class PercentageStyleValue final : public DimensionStyleValue { public: static ValueComparingNonnullRefPtr create(Percentage percentage) { @@ -23,8 +23,8 @@ public: virtual ~PercentageStyleValue() override = default; Percentage const& percentage() const { return m_percentage; } - virtual double value() const override { return m_percentage.value(); } - virtual StringView unit() const override { return "percent"sv; } + virtual double raw_value() const override { return m_percentage.value(); } + virtual StringView unit_name() const override { return "percent"sv; } virtual String to_string(SerializationMode) const override { return m_percentage.to_string(); } @@ -38,7 +38,7 @@ public: private: PercentageStyleValue(Percentage&& percentage) - : CSSUnitValue(Type::Percentage) + : DimensionStyleValue(Type::Percentage) , m_percentage(percentage) { } diff --git a/Libraries/LibWeb/CSS/StyleValues/ResolutionStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/ResolutionStyleValue.h index b044e53cb5c..4a787db9c49 100644 --- a/Libraries/LibWeb/CSS/StyleValues/ResolutionStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/ResolutionStyleValue.h @@ -7,11 +7,11 @@ #pragma once #include -#include +#include namespace Web::CSS { -class ResolutionStyleValue : public CSSUnitValue { +class ResolutionStyleValue : public DimensionStyleValue { public: static ValueComparingNonnullRefPtr create(Resolution resolution) { @@ -20,8 +20,8 @@ public: virtual ~ResolutionStyleValue() override = default; Resolution const& resolution() const { return m_resolution; } - virtual double value() const override { return m_resolution.raw_value(); } - virtual StringView unit() const override { return m_resolution.unit_name(); } + virtual double raw_value() const override { return m_resolution.raw_value(); } + virtual StringView unit_name() const override { return m_resolution.unit_name(); } virtual String to_string(SerializationMode serialization_mode) const override { return m_resolution.to_string(serialization_mode); } @@ -35,7 +35,7 @@ public: private: explicit ResolutionStyleValue(Resolution resolution) - : CSSUnitValue(Type::Resolution) + : DimensionStyleValue(Type::Resolution) , m_resolution(move(resolution)) { } diff --git a/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp index 32a39685406..491d9abcbdf 100644 --- a/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/StyleValue.cpp @@ -110,6 +110,12 @@ AbstractImageStyleValue const& StyleValue::as_abstract_image() const return static_cast(*this); } +DimensionStyleValue const& StyleValue::as_dimension() const +{ + VERIFY(is_dimension()); + return static_cast(*this); +} + #define __ENUMERATE_CSS_STYLE_VALUE_TYPE(title_case, snake_case, style_value_class_name) \ style_value_class_name const& StyleValue::as_##snake_case() const \ { \ diff --git a/Libraries/LibWeb/CSS/StyleValues/StyleValue.h b/Libraries/LibWeb/CSS/StyleValues/StyleValue.h index 53975d7fc9b..96958a1515c 100644 --- a/Libraries/LibWeb/CSS/StyleValues/StyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/StyleValue.h @@ -172,6 +172,13 @@ public: AbstractImageStyleValue const& as_abstract_image() const; AbstractImageStyleValue& as_abstract_image() { return const_cast(const_cast(*this).as_abstract_image()); } + bool is_dimension() const + { + return first_is_one_of(type(), Type::Angle, Type::Flex, Type::Frequency, Type::Length, Type::Percentage, Type::Resolution, Type::Time); + } + DimensionStyleValue const& as_dimension() const; + DimensionStyleValue& as_dimension() { return const_cast(const_cast(*this).as_dimension()); } + virtual bool is_color_function() const { return false; } #define __ENUMERATE_CSS_STYLE_VALUE_TYPE(title_case, snake_case, style_value_class_name) \ diff --git a/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h index 8561c5912d1..a9555bfa8a3 100644 --- a/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h @@ -9,12 +9,12 @@ #pragma once -#include +#include #include namespace Web::CSS { -class TimeStyleValue : public CSSUnitValue { +class TimeStyleValue : public DimensionStyleValue { public: static ValueComparingNonnullRefPtr create(Time time) { @@ -23,8 +23,8 @@ public: virtual ~TimeStyleValue() override = default; Time const& time() const { return m_time; } - virtual double value() const override { return m_time.raw_value(); } - virtual StringView unit() const override { return m_time.unit_name(); } + virtual double raw_value() const override { return m_time.raw_value(); } + virtual StringView unit_name() const override { return m_time.unit_name(); } virtual String to_string(SerializationMode serialization_mode) const override { return m_time.to_string(serialization_mode); } @@ -38,7 +38,7 @@ public: private: explicit TimeStyleValue(Time time) - : CSSUnitValue(Type::Time) + : DimensionStyleValue(Type::Time) , m_time(move(time)) { } diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index c1cdc97e269..2ebaac90bf9 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -252,6 +252,7 @@ class CSSStyleSheet; class CSSSupportsRule; class CursorStyleValue; class CustomIdentStyleValue; +class DimensionStyleValue; class Display; class DisplayStyleValue; class EasingStyleValue; diff --git a/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp b/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp index 58f3e4ab25e..e0457a512e4 100644 --- a/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp +++ b/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp @@ -5486,7 +5486,7 @@ RefPtr parse_nonzero_dimension_value(StringView string) return nullptr; // 4. If value is zero, return an error. - if (value->is_length() && value->as_length().length().raw_value() == 0) + if (value->is_length() && value->as_length().raw_value() == 0) return nullptr; if (value->is_percentage() && value->as_percentage().percentage().value() == 0) return nullptr;