LibWeb/CSS: Implement UnicodeRangeStyleValue

This is preparation for storing at-rule descriptors as style values.
This commit is contained in:
Sam Atkins 2025-03-27 17:35:06 +00:00
parent e0a03147c6
commit 09b8f73e11
Notes: github-actions[bot] 2025-03-28 09:15:53 +00:00
8 changed files with 86 additions and 0 deletions

View file

@ -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

View file

@ -60,6 +60,7 @@
#include <LibWeb/CSS/StyleValues/TransformationStyleValue.h>
#include <LibWeb/CSS/StyleValues/TransitionStyleValue.h>
#include <LibWeb/CSS/StyleValues/URLStyleValue.h>
#include <LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.h>
#include <LibWeb/CSS/StyleValues/UnresolvedStyleValue.h>
namespace Web::CSS {
@ -351,6 +352,12 @@ TransitionStyleValue const& CSSStyleValue::as_transition() const
return static_cast<TransitionStyleValue const&>(*this);
}
UnicodeRangeStyleValue const& CSSStyleValue::as_unicode_range() const
{
VERIFY(is_unicode_range());
return static_cast<UnicodeRangeStyleValue const&>(*this);
}
UnresolvedStyleValue const& CSSStyleValue::as_unresolved() const
{
VERIFY(is_unresolved());

View file

@ -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<TransitionStyleValue&>(const_cast<CSSStyleValue const&>(*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<UnicodeRangeStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_unicode_range()); }
bool is_unresolved() const { return type() == Type::Unresolved; }
UnresolvedStyleValue const& as_unresolved() const;
UnresolvedStyleValue& as_unresolved() { return const_cast<UnresolvedStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_unresolved()); }

View file

@ -268,6 +268,7 @@ private:
Optional<Gfx::UnicodeRange> parse_unicode_range(TokenStream<ComponentValue>&);
Optional<Gfx::UnicodeRange> parse_unicode_range(StringView);
Vector<Gfx::UnicodeRange> parse_unicode_ranges(TokenStream<ComponentValue>&);
RefPtr<UnicodeRangeStyleValue> parse_unicode_range_value(TokenStream<ComponentValue>&);
Optional<GridSize> parse_grid_size(ComponentValue const&);
Optional<GridFitContent> parse_grid_fit_content(Vector<ComponentValue> const&);
Optional<GridMinMax> parse_min_max(Vector<ComponentValue> const&);

View file

@ -56,6 +56,7 @@
#include <LibWeb/CSS/StyleValues/StringStyleValue.h>
#include <LibWeb/CSS/StyleValues/TimeStyleValue.h>
#include <LibWeb/CSS/StyleValues/URLStyleValue.h>
#include <LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.h>
#include <LibWeb/CSS/StyleValues/UnresolvedStyleValue.h>
#include <LibWeb/DOM/Element.h>
#include <LibWeb/Dump.h>
@ -621,6 +622,13 @@ Vector<Gfx::UnicodeRange> Parser::parse_unicode_ranges(TokenStream<ComponentValu
return unicode_ranges;
}
RefPtr<UnicodeRangeStyleValue> Parser::parse_unicode_range_value(TokenStream<ComponentValue>& tokens)
{
if (auto range = parse_unicode_range(tokens); range.has_value())
return UnicodeRangeStyleValue::create(range.release_value());
return nullptr;
}
RefPtr<CSSStyleValue> Parser::parse_integer_value(TokenStream<ComponentValue>& tokens)
{
auto const& peek_token = tokens.next_token();

View file

@ -0,0 +1,29 @@
/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/CSS/StyleValues/UnicodeRangeStyleValue.h>
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;
}
}

View file

@ -0,0 +1,34 @@
/*
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibGfx/Font/UnicodeRange.h>
#include <LibWeb/CSS/CSSStyleValue.h>
namespace Web::CSS {
class UnicodeRangeStyleValue final : public StyleValueWithDefaultOperators<UnicodeRangeStyleValue> {
public:
static ValueComparingNonnullRefPtr<UnicodeRangeStyleValue> 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;
};
}

View file

@ -265,6 +265,7 @@ class TimeStyleValue;
class Transformation;
class TransformationStyleValue;
class TransitionStyleValue;
class UnicodeRangeStyleValue;
class UnresolvedStyleValue;
class URLStyleValue;
class VisualViewport;