/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 | | }; |