Coverage Report

Created: 2026-05-16 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Userland/Libraries/LibWeb/CSS/CSSStyleValue.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org>
3
 * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
4
 * Copyright (c) 2021-2024, Sam Atkins <sam@ladybird.org>
5
 * Copyright (c) 2022-2023, MacDue <macdue@dueutil.tech>
6
 *
7
 * SPDX-License-Identifier: BSD-2-Clause
8
 */
9
10
#pragma once
11
12
#include <AK/Concepts.h>
13
#include <AK/GenericShorthands.h>
14
#include <AK/NonnullOwnPtr.h>
15
#include <AK/RefCounted.h>
16
#include <AK/RefPtr.h>
17
#include <AK/String.h>
18
#include <AK/StringView.h>
19
#include <AK/Variant.h>
20
#include <AK/Vector.h>
21
#include <AK/WeakPtr.h>
22
#include <LibGfx/Color.h>
23
#include <LibURL/URL.h>
24
#include <LibWeb/CSS/Enums.h>
25
#include <LibWeb/CSS/Keyword.h>
26
#include <LibWeb/CSS/Length.h>
27
#include <LibWeb/Forward.h>
28
29
namespace Web::CSS {
30
31
template<typename T>
32
struct ValueComparingNonnullRefPtr : public NonnullRefPtr<T> {
33
    using NonnullRefPtr<T>::NonnullRefPtr;
34
35
    ValueComparingNonnullRefPtr(NonnullRefPtr<T> const& other)
36
0
        : NonnullRefPtr<T>(other)
37
0
    {
38
0
    }
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSStyleValue const>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSStyleValue const> const&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::LengthStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::LengthStyleValue> const&)
39
40
    ValueComparingNonnullRefPtr(NonnullRefPtr<T>&& other)
41
0
        : NonnullRefPtr<T>(move(other))
42
0
    {
43
0
    }
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::URLStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::URLStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::BasicShapeStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::BasicShapeStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSKeywordValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSKeywordValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CustomIdentStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CustomIdentStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSMathValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSMathValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::AngleStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::AngleStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::FrequencyStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::FrequencyStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::PercentageStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::PercentageStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::ResolutionStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::ResolutionStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::TimeStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::TimeStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::IntegerStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::IntegerStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::NumberStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::NumberStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSRGB>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSRGB>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSHSL>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSHSL>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSHWB>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSHWB>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CounterStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CounterStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CounterDefinitionsStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CounterDefinitionsStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::RatioStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::RatioStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::StringStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::StringStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::ImageStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::ImageStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::PositionStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::PositionStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::EdgeStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::EdgeStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::StyleValueList>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::StyleValueList>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::BackgroundRepeatStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::BackgroundRepeatStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::BackgroundSizeStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::BackgroundSizeStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::ShorthandStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::ShorthandStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::BorderRadiusStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::BorderRadiusStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::ShadowStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::ShadowStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::RotationStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::RotationStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::ContentStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::ContentStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::FilterValueListStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::FilterValueListStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::OpenTypeTaggedStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::OpenTypeTaggedStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::EasingStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::EasingStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::TransformationStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::TransformationStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::TransitionStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::TransitionStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::ScrollbarGutterStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::ScrollbarGutterStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::UnresolvedStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::UnresolvedStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::FlexStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::FlexStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSLab>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSLab>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSOKLab>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSOKLab>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSLCH>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSLCH>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSOKLCH>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSOKLCH>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::LinearGradientStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::LinearGradientStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::ConicGradientStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::ConicGradientStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::RadialGradientStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::RadialGradientStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSStyleValue const>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSStyleValue const>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSColor>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::CSSColor>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::DisplayStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::DisplayStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::GridAutoFlowStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::GridAutoFlowStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::GridTemplateAreaStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::GridTemplateAreaStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::GridTrackPlacementStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::GridTrackPlacementStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::GridTrackSizeListStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::GridTrackSizeListStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::LengthStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::LengthStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::MathDepthStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::MathDepthStyleValue>&&)
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::RectStyleValue>::ValueComparingNonnullRefPtr(AK::NonnullRefPtr<Web::CSS::RectStyleValue>&&)
44
45
    bool operator==(ValueComparingNonnullRefPtr const& other) const
46
0
    {
47
0
        return this->ptr() == other.ptr() || this->ptr()->equals(*other);
48
0
    }
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::EdgeStyleValue>::operator==(Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::EdgeStyleValue> const&) const
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSStyleValue const>::operator==(Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSStyleValue const> const&) const
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::StyleValueList>::operator==(Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::StyleValueList> const&) const
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::PositionStyleValue>::operator==(Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::PositionStyleValue> const&) const
Unexecuted instantiation: Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSStyleValue>::operator==(Web::CSS::ValueComparingNonnullRefPtr<Web::CSS::CSSStyleValue> const&) const
49
50
private:
51
    using NonnullRefPtr<T>::operator==;
52
};
53
54
template<typename T>
55
struct ValueComparingRefPtr : public RefPtr<T> {
56
    using RefPtr<T>::RefPtr;
57
58
    ValueComparingRefPtr(RefPtr<T> const& other)
59
        : RefPtr<T>(other)
60
    {
61
    }
62
63
    ValueComparingRefPtr(RefPtr<T>&& other)
64
0
        : RefPtr<T>(move(other))
65
0
    {
66
0
    }
67
68
    template<typename U>
69
    bool operator==(ValueComparingNonnullRefPtr<U> const& other) const
70
    {
71
        return this->ptr() == other.ptr() || (this->ptr() && this->ptr()->equals(*other));
72
    }
73
74
    bool operator==(ValueComparingRefPtr const& other) const
75
0
    {
76
0
        return this->ptr() == other.ptr() || (this->ptr() && other.ptr() && this->ptr()->equals(*other));
77
0
    }
Unexecuted instantiation: Web::CSS::ValueComparingRefPtr<Web::CSS::StyleValueList>::operator==(Web::CSS::ValueComparingRefPtr<Web::CSS::StyleValueList> const&) const
Unexecuted instantiation: Web::CSS::ValueComparingRefPtr<Web::CSS::CSSStyleValue const>::operator==(Web::CSS::ValueComparingRefPtr<Web::CSS::CSSStyleValue const> const&) const
Unexecuted instantiation: Web::CSS::ValueComparingRefPtr<Web::CSS::CustomIdentStyleValue>::operator==(Web::CSS::ValueComparingRefPtr<Web::CSS::CustomIdentStyleValue> const&) const
Unexecuted instantiation: Web::CSS::ValueComparingRefPtr<Web::CSS::EasingStyleValue>::operator==(Web::CSS::ValueComparingRefPtr<Web::CSS::EasingStyleValue> const&) const
78
79
private:
80
    using RefPtr<T>::operator==;
81
};
82
83
using StyleValueVector = Vector<ValueComparingNonnullRefPtr<CSSStyleValue const>>;
84
85
// https://drafts.css-houdini.org/css-typed-om-1/#cssstylevalue
86
class CSSStyleValue : public RefCounted<CSSStyleValue> {
87
public:
88
0
    virtual ~CSSStyleValue() = default;
89
90
    enum class Type {
91
        Angle,
92
        BackgroundRepeat,
93
        BackgroundSize,
94
        BasicShape,
95
        BorderRadius,
96
        Color,
97
        ConicGradient,
98
        Content,
99
        Counter,
100
        CounterDefinitions,
101
        CustomIdent,
102
        Display,
103
        Easing,
104
        Edge,
105
        FilterValueList,
106
        Flex,
107
        Frequency,
108
        GridAutoFlow,
109
        GridTemplateArea,
110
        GridTrackPlacement,
111
        GridTrackSizeList,
112
        Image,
113
        Integer,
114
        Keyword,
115
        Length,
116
        LinearGradient,
117
        Math,
118
        MathDepth,
119
        Number,
120
        OpenTypeTagged,
121
        Percentage,
122
        Position,
123
        RadialGradient,
124
        Ratio,
125
        Rect,
126
        Resolution,
127
        Rotation,
128
        ScrollbarGutter,
129
        Shadow,
130
        Shorthand,
131
        String,
132
        Time,
133
        Transformation,
134
        Transition,
135
        Unresolved,
136
        URL,
137
        ValueList,
138
    };
139
140
0
    Type type() const { return m_type; }
141
142
    bool is_abstract_image() const
143
0
    {
144
0
        return AK::first_is_one_of(type(), Type::Image, Type::LinearGradient, Type::ConicGradient, Type::RadialGradient);
145
0
    }
146
    AbstractImageStyleValue const& as_abstract_image() const;
147
0
    AbstractImageStyleValue& as_abstract_image() { return const_cast<AbstractImageStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_abstract_image()); }
148
149
0
    bool is_angle() const { return type() == Type::Angle; }
150
    AngleStyleValue const& as_angle() const;
151
0
    AngleStyleValue& as_angle() { return const_cast<AngleStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_angle()); }
152
153
0
    bool is_background_repeat() const { return type() == Type::BackgroundRepeat; }
154
    BackgroundRepeatStyleValue const& as_background_repeat() const;
155
0
    BackgroundRepeatStyleValue& as_background_repeat() { return const_cast<BackgroundRepeatStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_background_repeat()); }
156
157
0
    bool is_background_size() const { return type() == Type::BackgroundSize; }
158
    BackgroundSizeStyleValue const& as_background_size() const;
159
0
    BackgroundSizeStyleValue& as_background_size() { return const_cast<BackgroundSizeStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_background_size()); }
160
161
0
    bool is_basic_shape() const { return type() == Type::BasicShape; }
162
    BasicShapeStyleValue const& as_basic_shape() const;
163
0
    BasicShapeStyleValue& as_basic_shape() { return const_cast<BasicShapeStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_basic_shape()); }
164
165
0
    bool is_border_radius() const { return type() == Type::BorderRadius; }
166
    BorderRadiusStyleValue const& as_border_radius() const;
167
0
    BorderRadiusStyleValue& as_border_radius() { return const_cast<BorderRadiusStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_border_radius()); }
168
169
0
    bool is_color() const { return type() == Type::Color; }
170
    CSSColorValue const& as_color() const;
171
0
    CSSColorValue& as_color() { return const_cast<CSSColorValue&>(const_cast<CSSStyleValue const&>(*this).as_color()); }
172
173
0
    bool is_conic_gradient() const { return type() == Type::ConicGradient; }
174
    ConicGradientStyleValue const& as_conic_gradient() const;
175
0
    ConicGradientStyleValue& as_conic_gradient() { return const_cast<ConicGradientStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_conic_gradient()); }
176
177
0
    bool is_content() const { return type() == Type::Content; }
178
    ContentStyleValue const& as_content() const;
179
0
    ContentStyleValue& as_content() { return const_cast<ContentStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_content()); }
180
181
0
    bool is_counter() const { return type() == Type::Counter; }
182
    CounterStyleValue const& as_counter() const;
183
0
    CounterStyleValue& as_counter() { return const_cast<CounterStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_counter()); }
184
185
0
    bool is_counter_definitions() const { return type() == Type::CounterDefinitions; }
186
    CounterDefinitionsStyleValue const& as_counter_definitions() const;
187
0
    CounterDefinitionsStyleValue& as_counter_definitions() { return const_cast<CounterDefinitionsStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_counter_definitions()); }
188
189
0
    bool is_custom_ident() const { return type() == Type::CustomIdent; }
190
    CustomIdentStyleValue const& as_custom_ident() const;
191
0
    CustomIdentStyleValue& as_custom_ident() { return const_cast<CustomIdentStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_custom_ident()); }
192
193
0
    bool is_display() const { return type() == Type::Display; }
194
    DisplayStyleValue const& as_display() const;
195
0
    DisplayStyleValue& as_display() { return const_cast<DisplayStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_display()); }
196
197
0
    bool is_easing() const { return type() == Type::Easing; }
198
    EasingStyleValue const& as_easing() const;
199
0
    EasingStyleValue& as_easing() { return const_cast<EasingStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_easing()); }
200
201
0
    bool is_edge() const { return type() == Type::Edge; }
202
    EdgeStyleValue const& as_edge() const;
203
0
    EdgeStyleValue& as_edge() { return const_cast<EdgeStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_edge()); }
204
205
0
    bool is_filter_value_list() const { return type() == Type::FilterValueList; }
206
    FilterValueListStyleValue const& as_filter_value_list() const;
207
0
    FilterValueListStyleValue& as_filter_value_list() { return const_cast<FilterValueListStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_filter_value_list()); }
208
209
0
    bool is_flex() const { return type() == Type::Flex; }
210
    FlexStyleValue const& as_flex() const;
211
0
    FlexStyleValue& as_flex() { return const_cast<FlexStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_flex()); }
212
213
0
    bool is_frequency() const { return type() == Type::Frequency; }
214
    FrequencyStyleValue const& as_frequency() const;
215
0
    FrequencyStyleValue& as_frequency() { return const_cast<FrequencyStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_frequency()); }
216
217
0
    bool is_grid_auto_flow() const { return type() == Type::GridAutoFlow; }
218
    GridAutoFlowStyleValue const& as_grid_auto_flow() const;
219
0
    GridAutoFlowStyleValue& as_grid_auto_flow() { return const_cast<GridAutoFlowStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_grid_auto_flow()); }
220
221
0
    bool is_grid_template_area() const { return type() == Type::GridTemplateArea; }
222
    GridTemplateAreaStyleValue const& as_grid_template_area() const;
223
0
    GridTemplateAreaStyleValue& as_grid_template_area() { return const_cast<GridTemplateAreaStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_grid_template_area()); }
224
225
0
    bool is_grid_track_placement() const { return type() == Type::GridTrackPlacement; }
226
    GridTrackPlacementStyleValue const& as_grid_track_placement() const;
227
0
    GridTrackPlacementStyleValue& as_grid_track_placement() { return const_cast<GridTrackPlacementStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_grid_track_placement()); }
228
229
0
    bool is_grid_track_size_list() const { return type() == Type::GridTrackSizeList; }
230
    GridTrackSizeListStyleValue const& as_grid_track_size_list() const;
231
0
    GridTrackSizeListStyleValue& as_grid_track_size_list() { return const_cast<GridTrackSizeListStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_grid_track_size_list()); }
232
233
0
    bool is_image() const { return type() == Type::Image; }
234
    ImageStyleValue const& as_image() const;
235
0
    ImageStyleValue& as_image() { return const_cast<ImageStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_image()); }
236
237
0
    bool is_integer() const { return type() == Type::Integer; }
238
    IntegerStyleValue const& as_integer() const;
239
0
    IntegerStyleValue& as_integer() { return const_cast<IntegerStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_integer()); }
240
241
0
    bool is_keyword() const { return type() == Type::Keyword; }
242
    CSSKeywordValue const& as_keyword() const;
243
0
    CSSKeywordValue& as_keyword() { return const_cast<CSSKeywordValue&>(const_cast<CSSStyleValue const&>(*this).as_keyword()); }
244
245
0
    bool is_length() const { return type() == Type::Length; }
246
    LengthStyleValue const& as_length() const;
247
0
    LengthStyleValue& as_length() { return const_cast<LengthStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_length()); }
248
249
0
    bool is_linear_gradient() const { return type() == Type::LinearGradient; }
250
    LinearGradientStyleValue const& as_linear_gradient() const;
251
0
    LinearGradientStyleValue& as_linear_gradient() { return const_cast<LinearGradientStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_linear_gradient()); }
252
253
0
    bool is_math() const { return type() == Type::Math; }
254
    CSSMathValue const& as_math() const;
255
0
    CSSMathValue& as_math() { return const_cast<CSSMathValue&>(const_cast<CSSStyleValue const&>(*this).as_math()); }
256
257
0
    bool is_math_depth() const { return type() == Type::MathDepth; }
258
    MathDepthStyleValue const& as_math_depth() const;
259
0
    MathDepthStyleValue& as_math_depth() { return const_cast<MathDepthStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_math_depth()); }
260
261
0
    bool is_number() const { return type() == Type::Number; }
262
    NumberStyleValue const& as_number() const;
263
0
    NumberStyleValue& as_number() { return const_cast<NumberStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_number()); }
264
265
0
    bool is_open_type_tagged() const { return type() == Type::OpenTypeTagged; }
266
    OpenTypeTaggedStyleValue const& as_open_type_tagged() const;
267
0
    OpenTypeTaggedStyleValue& as_open_type_tagged() { return const_cast<OpenTypeTaggedStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_open_type_tagged()); }
268
269
0
    bool is_percentage() const { return type() == Type::Percentage; }
270
    PercentageStyleValue const& as_percentage() const;
271
0
    PercentageStyleValue& as_percentage() { return const_cast<PercentageStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_percentage()); }
272
273
0
    bool is_position() const { return type() == Type::Position; }
274
    PositionStyleValue const& as_position() const;
275
276
0
    PositionStyleValue& as_position() { return const_cast<PositionStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_position()); }
277
0
    bool is_radial_gradient() const { return type() == Type::RadialGradient; }
278
    RadialGradientStyleValue const& as_radial_gradient() const;
279
0
    RadialGradientStyleValue& as_radial_gradient() { return const_cast<RadialGradientStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_radial_gradient()); }
280
281
0
    bool is_ratio() const { return type() == Type::Ratio; }
282
    RatioStyleValue const& as_ratio() const;
283
0
    RatioStyleValue& as_ratio() { return const_cast<RatioStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_ratio()); }
284
285
0
    bool is_rect() const { return type() == Type::Rect; }
286
    RectStyleValue const& as_rect() const;
287
0
    RectStyleValue& as_rect() { return const_cast<RectStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_rect()); }
288
289
0
    bool is_resolution() const { return type() == Type::Resolution; }
290
    ResolutionStyleValue const& as_resolution() const;
291
0
    ResolutionStyleValue& as_resolution() { return const_cast<ResolutionStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_resolution()); }
292
293
0
    bool is_rotation() const { return type() == Type::Rotation; }
294
    RotationStyleValue const& as_rotation() const;
295
0
    RotationStyleValue& as_rotation() { return const_cast<RotationStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_rotation()); }
296
297
0
    bool is_scrollbar_gutter() const { return type() == Type::ScrollbarGutter; }
298
    ScrollbarGutterStyleValue const& as_scrollbar_gutter() const;
299
0
    ScrollbarGutterStyleValue& as_scrollbar_gutter() { return const_cast<ScrollbarGutterStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_scrollbar_gutter()); }
300
301
0
    bool is_shadow() const { return type() == Type::Shadow; }
302
    ShadowStyleValue const& as_shadow() const;
303
0
    ShadowStyleValue& as_shadow() { return const_cast<ShadowStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_shadow()); }
304
305
0
    bool is_shorthand() const { return type() == Type::Shorthand; }
306
    ShorthandStyleValue const& as_shorthand() const;
307
0
    ShorthandStyleValue& as_shorthand() { return const_cast<ShorthandStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_shorthand()); }
308
309
0
    bool is_string() const { return type() == Type::String; }
310
    StringStyleValue const& as_string() const;
311
0
    StringStyleValue& as_string() { return const_cast<StringStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_string()); }
312
313
0
    bool is_time() const { return type() == Type::Time; }
314
    TimeStyleValue const& as_time() const;
315
0
    TimeStyleValue& as_time() { return const_cast<TimeStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_time()); }
316
317
0
    bool is_transformation() const { return type() == Type::Transformation; }
318
    TransformationStyleValue const& as_transformation() const;
319
0
    TransformationStyleValue& as_transformation() { return const_cast<TransformationStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_transformation()); }
320
321
0
    bool is_transition() const { return type() == Type::Transition; }
322
    TransitionStyleValue const& as_transition() const;
323
0
    TransitionStyleValue& as_transition() { return const_cast<TransitionStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_transition()); }
324
325
0
    bool is_unresolved() const { return type() == Type::Unresolved; }
326
    UnresolvedStyleValue const& as_unresolved() const;
327
0
    UnresolvedStyleValue& as_unresolved() { return const_cast<UnresolvedStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_unresolved()); }
328
329
0
    bool is_url() const { return type() == Type::URL; }
330
    URLStyleValue const& as_url() const;
331
0
    URLStyleValue& as_url() { return const_cast<URLStyleValue&>(const_cast<CSSStyleValue const&>(*this).as_url()); }
332
333
0
    bool is_value_list() const { return type() == Type::ValueList; }
334
    StyleValueList const& as_value_list() const;
335
0
    StyleValueList& as_value_list() { return const_cast<StyleValueList&>(const_cast<CSSStyleValue const&>(*this).as_value_list()); }
336
337
    // https://www.w3.org/TR/css-values-4/#common-keywords
338
    // https://drafts.csswg.org/css-cascade-4/#valdef-all-revert
339
0
    bool is_css_wide_keyword() const { return is_inherit() || is_initial() || is_revert() || is_unset() || is_revert_layer(); }
340
0
    bool is_inherit() const { return to_keyword() == Keyword::Inherit; }
341
0
    bool is_initial() const { return to_keyword() == Keyword::Initial; }
342
0
    bool is_revert() const { return to_keyword() == Keyword::Revert; }
343
0
    bool is_revert_layer() const { return to_keyword() == Keyword::RevertLayer; }
344
0
    bool is_unset() const { return to_keyword() == Keyword::Unset; }
345
346
    bool has_auto() const;
347
0
    virtual bool has_color() const { return false; }
348
349
    virtual ValueComparingNonnullRefPtr<CSSStyleValue const> absolutized(CSSPixelRect const& viewport_rect, Length::FontMetrics const& font_metrics, Length::FontMetrics const& root_font_metrics) const;
350
351
0
    virtual Color to_color(Optional<Layout::NodeWithStyle const&>) const { return {}; }
352
    Keyword to_keyword() const;
353
    virtual String to_string() const = 0;
354
355
    [[nodiscard]] int to_font_weight() const;
356
    [[nodiscard]] int to_font_slope() const;
357
    [[nodiscard]] int to_font_width() const;
358
359
    virtual bool equals(CSSStyleValue const& other) const = 0;
360
361
    bool operator==(CSSStyleValue const& other) const
362
0
    {
363
0
        return this->equals(other);
364
0
    }
365
366
protected:
367
    explicit CSSStyleValue(Type);
368
369
private:
370
    Type m_type;
371
};
372
373
template<typename T>
374
struct StyleValueWithDefaultOperators : public CSSStyleValue {
375
    using CSSStyleValue::CSSStyleValue;
376
377
    virtual bool equals(CSSStyleValue const& other) const override
378
0
    {
379
0
        if (type() != other.type())
380
0
            return false;
381
0
        auto const& typed_other = static_cast<T const&>(other);
382
0
        return static_cast<T const&>(*this).properties_equal(typed_other);
383
0
    }
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::EasingStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::FilterValueListStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::BasicShapeStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::EdgeStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::PositionStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::ShadowStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::BorderRadiusStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::CSSKeywordValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::ContentStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::CounterDefinitionsStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::CustomIdentStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::DisplayStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::GridAutoFlowStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::GridTemplateAreaStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::GridTrackPlacementStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::GridTrackSizeListStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::OpenTypeTaggedStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::RatioStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::RectStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::RotationStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::ScrollbarGutterStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::StringStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::StyleValueList>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::TransformationStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::TransitionStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::URLStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::BackgroundRepeatStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::BackgroundSizeStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::CounterStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::MathDepthStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
Unexecuted instantiation: Web::CSS::StyleValueWithDefaultOperators<Web::CSS::ShorthandStyleValue>::equals(Web::CSS::CSSStyleValue const&) const
384
};
385
386
}
387
388
template<>
389
struct AK::Formatter<Web::CSS::CSSStyleValue> : Formatter<StringView> {
390
    ErrorOr<void> format(FormatBuilder& builder, Web::CSS::CSSStyleValue const& style_value)
391
0
    {
392
0
        return Formatter<StringView>::format(builder, style_value.to_string());
393
0
    }
394
};