From 09b8f73e111e8dca17aee95dd1893e21d3584ac9 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 27 Mar 2025 17:35:06 +0000 Subject: [PATCH] LibWeb/CSS: Implement UnicodeRangeStyleValue This is preparation for storing at-rule descriptors as style values. --- Libraries/LibWeb/CMakeLists.txt | 1 + Libraries/LibWeb/CSS/CSSStyleValue.cpp | 7 ++++ Libraries/LibWeb/CSS/CSSStyleValue.h | 5 +++ Libraries/LibWeb/CSS/Parser/Parser.h | 1 + Libraries/LibWeb/CSS/Parser/ValueParsing.cpp | 8 +++++ .../StyleValues/UnicodeRangeStyleValue.cpp | 29 ++++++++++++++++ .../CSS/StyleValues/UnicodeRangeStyleValue.h | 34 +++++++++++++++++++ Libraries/LibWeb/Forward.h | 1 + 8 files changed, 86 insertions(+) create mode 100644 Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.cpp create mode 100644 Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.h diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index f68a045d40f..da4c2e7a9bf 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -183,6 +183,7 @@ set(SOURCES CSS/StyleValues/StyleValueList.cpp CSS/StyleValues/TransformationStyleValue.cpp CSS/StyleValues/TransitionStyleValue.cpp + CSS/StyleValues/UnicodeRangeStyleValue.cpp CSS/StyleValues/UnresolvedStyleValue.cpp CSS/Supports.cpp CSS/SyntaxHighlighter/SyntaxHighlighter.cpp diff --git a/Libraries/LibWeb/CSS/CSSStyleValue.cpp b/Libraries/LibWeb/CSS/CSSStyleValue.cpp index 638a5a98651..6ba2ac82cfe 100644 --- a/Libraries/LibWeb/CSS/CSSStyleValue.cpp +++ b/Libraries/LibWeb/CSS/CSSStyleValue.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include namespace Web::CSS { @@ -351,6 +352,12 @@ TransitionStyleValue const& CSSStyleValue::as_transition() const return static_cast(*this); } +UnicodeRangeStyleValue const& CSSStyleValue::as_unicode_range() const +{ + VERIFY(is_unicode_range()); + return static_cast(*this); +} + UnresolvedStyleValue const& CSSStyleValue::as_unresolved() const { VERIFY(is_unresolved()); diff --git a/Libraries/LibWeb/CSS/CSSStyleValue.h b/Libraries/LibWeb/CSS/CSSStyleValue.h index 73e5e00b84c..0fd3a50dd14 100644 --- a/Libraries/LibWeb/CSS/CSSStyleValue.h +++ b/Libraries/LibWeb/CSS/CSSStyleValue.h @@ -133,6 +133,7 @@ public: Time, Transformation, Transition, + UnicodeRange, Unresolved, URL, ValueList, @@ -331,6 +332,10 @@ public: TransitionStyleValue const& as_transition() const; TransitionStyleValue& as_transition() { return const_cast(const_cast(*this).as_transition()); } + bool is_unicode_range() const { return type() == Type::UnicodeRange; } + UnicodeRangeStyleValue const& as_unicode_range() const; + UnicodeRangeStyleValue& as_unicode_range() { return const_cast(const_cast(*this).as_unicode_range()); } + bool is_unresolved() const { return type() == Type::Unresolved; } UnresolvedStyleValue const& as_unresolved() const; UnresolvedStyleValue& as_unresolved() { return const_cast(const_cast(*this).as_unresolved()); } diff --git a/Libraries/LibWeb/CSS/Parser/Parser.h b/Libraries/LibWeb/CSS/Parser/Parser.h index 208a01da7f3..21ef0446c0c 100644 --- a/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Libraries/LibWeb/CSS/Parser/Parser.h @@ -268,6 +268,7 @@ private: Optional parse_unicode_range(TokenStream&); Optional parse_unicode_range(StringView); Vector parse_unicode_ranges(TokenStream&); + RefPtr parse_unicode_range_value(TokenStream&); Optional parse_grid_size(ComponentValue const&); Optional parse_grid_fit_content(Vector const&); Optional parse_min_max(Vector const&); diff --git a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp index 083d33149b3..afdd2c6d606 100644 --- a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp @@ -56,6 +56,7 @@ #include #include #include +#include #include #include #include @@ -621,6 +622,13 @@ Vector Parser::parse_unicode_ranges(TokenStream Parser::parse_unicode_range_value(TokenStream& tokens) +{ + if (auto range = parse_unicode_range(tokens); range.has_value()) + return UnicodeRangeStyleValue::create(range.release_value()); + return nullptr; +} + RefPtr Parser::parse_integer_value(TokenStream& tokens) { auto const& peek_token = tokens.next_token(); diff --git a/Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.cpp new file mode 100644 index 00000000000..7134da04e3e --- /dev/null +++ b/Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2025, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Web::CSS { + +UnicodeRangeStyleValue::UnicodeRangeStyleValue(Gfx::UnicodeRange unicode_range) + : StyleValueWithDefaultOperators(Type::UnicodeRange) + , m_unicode_range(unicode_range) +{ +} + +UnicodeRangeStyleValue::~UnicodeRangeStyleValue() = default; + +String UnicodeRangeStyleValue::to_string(SerializationMode) const +{ + return m_unicode_range.to_string(); +} + +bool UnicodeRangeStyleValue::properties_equal(UnicodeRangeStyleValue const& other) const +{ + return m_unicode_range == other.m_unicode_range; +} + +} diff --git a/Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.h new file mode 100644 index 00000000000..ef873e64719 --- /dev/null +++ b/Libraries/LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::CSS { + +class UnicodeRangeStyleValue final : public StyleValueWithDefaultOperators { +public: + static ValueComparingNonnullRefPtr create(Gfx::UnicodeRange unicode_range) + { + return adopt_ref(*new (nothrow) UnicodeRangeStyleValue(unicode_range)); + } + virtual ~UnicodeRangeStyleValue() override; + + Gfx::UnicodeRange const& unicode_range() const { return m_unicode_range; } + + virtual String to_string(SerializationMode) const override; + + bool properties_equal(UnicodeRangeStyleValue const&) const; + +private: + UnicodeRangeStyleValue(Gfx::UnicodeRange); + + Gfx::UnicodeRange m_unicode_range; +}; + +} diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index 91e44f3acc6..ae7b6c43c33 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -265,6 +265,7 @@ class TimeStyleValue; class Transformation; class TransformationStyleValue; class TransitionStyleValue; +class UnicodeRangeStyleValue; class UnresolvedStyleValue; class URLStyleValue; class VisualViewport;