summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibWeb/CSS/StyleValue.cpp314
-rw-r--r--Userland/Libraries/LibWeb/CSS/StyleValue.h157
2 files changed, 339 insertions, 132 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp
index 6087dde11d..188d78a344 100644
--- a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp
+++ b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp
@@ -281,21 +281,62 @@ String BackgroundStyleValue::to_string() const
return builder.to_string();
}
+bool BackgroundStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_background();
+ return m_color->equals(typed_other.m_color)
+ && m_image->equals(typed_other.m_image)
+ && m_position->equals(typed_other.m_position)
+ && m_size->equals(typed_other.m_size)
+ && m_repeat->equals(typed_other.m_repeat)
+ && m_attachment->equals(typed_other.m_attachment)
+ && m_origin->equals(typed_other.m_origin)
+ && m_clip->equals(typed_other.m_clip);
+}
+
String BackgroundRepeatStyleValue::to_string() const
{
return String::formatted("{} {}", CSS::to_string(m_repeat_x), CSS::to_string(m_repeat_y));
}
+bool BackgroundRepeatStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_background_repeat();
+ return m_repeat_x == typed_other.m_repeat_x && m_repeat_y == typed_other.m_repeat_y;
+}
+
String BackgroundSizeStyleValue::to_string() const
{
return String::formatted("{} {}", m_size_x.to_string(), m_size_y.to_string());
}
+bool BackgroundSizeStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_background_size();
+ return m_size_x == typed_other.m_size_x && m_size_y == typed_other.m_size_y;
+}
+
String BorderStyleValue::to_string() const
{
return String::formatted("{} {} {}", m_border_width->to_string(), m_border_style->to_string(), m_border_color->to_string());
}
+bool BorderStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_border();
+ return m_border_width->equals(typed_other.m_border_width)
+ && m_border_style->equals(typed_other.m_border_style)
+ && m_border_color->equals(typed_other.m_border_color);
+}
+
String BorderRadiusStyleValue::to_string() const
{
if (m_horizontal_radius == m_vertical_radius)
@@ -303,13 +344,30 @@ String BorderRadiusStyleValue::to_string() const
return String::formatted("{} / {}", m_horizontal_radius.to_string(), m_vertical_radius.to_string());
}
-String ShadowStyleValue::to_string() const
+bool BorderRadiusStyleValue::equals(StyleValue const& other) const
{
- StringBuilder builder;
- builder.appendff("{} {} {} {} {}", m_color.to_string(), m_offset_x.to_string(), m_offset_y.to_string(), m_blur_radius.to_string(), m_spread_distance.to_string());
- if (m_placement == ShadowPlacement::Inner)
- builder.append(" inset");
- return builder.to_string();
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_border_radius();
+ return m_is_elliptical == typed_other.m_is_elliptical
+ && m_horizontal_radius == typed_other.m_horizontal_radius
+ && m_vertical_radius == typed_other.m_vertical_radius;
+}
+
+String BorderRadiusShorthandStyleValue::to_string() const
+{
+ return String::formatted("{} {} {} {} / {} {} {} {}", m_top_left->horizontal_radius().to_string(), m_top_right->horizontal_radius().to_string(), m_bottom_right->horizontal_radius().to_string(), m_bottom_left->horizontal_radius().to_string(), m_top_left->vertical_radius().to_string(), m_top_right->vertical_radius().to_string(), m_bottom_right->vertical_radius().to_string(), m_bottom_left->vertical_radius().to_string());
+}
+
+bool BorderRadiusShorthandStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_border_radius_shorthand();
+ return m_top_left->equals(typed_other.m_top_left)
+ && m_top_right->equals(typed_other.m_top_right)
+ && m_bottom_right->equals(typed_other.m_bottom_right)
+ && m_bottom_left->equals(typed_other.m_bottom_left);
}
void CalculatedStyleValue::CalculationResult::add(CalculationResult const& other, Layout::Node const* layout_node, PercentageBasis const& percentage_basis)
@@ -503,6 +561,14 @@ String CalculatedStyleValue::to_string() const
return String::formatted("calc({})", m_expression->to_string());
}
+bool CalculatedStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ // This is a case where comparing the strings actually makes sense.
+ return to_string() == other.to_string();
+}
+
String CalculatedStyleValue::CalcNumberValue::to_string() const
{
return value.visit(
@@ -1010,9 +1076,11 @@ String ColorStyleValue::to_string() const
return String::formatted("rgba({}, {}, {}, {})", m_color.red(), m_color.green(), m_color.blue(), (float)(m_color.alpha()) / 255.0f);
}
-String BorderRadiusShorthandStyleValue::to_string() const
+bool ColorStyleValue::equals(StyleValue const& other) const
{
- return String::formatted("{} {} {} {} / {} {} {} {}", m_top_left->horizontal_radius().to_string(), m_top_right->horizontal_radius().to_string(), m_bottom_right->horizontal_radius().to_string(), m_bottom_left->horizontal_radius().to_string(), m_top_left->vertical_radius().to_string(), m_top_right->vertical_radius().to_string(), m_bottom_right->vertical_radius().to_string(), m_bottom_left->vertical_radius().to_string());
+ if (type() != other.type())
+ return false;
+ return m_color == other.as_color().m_color;
}
String ContentStyleValue::to_string() const
@@ -1022,26 +1090,85 @@ String ContentStyleValue::to_string() const
return m_content->to_string();
}
+bool ContentStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_content();
+ if (!m_content->equals(typed_other.m_content))
+ return false;
+ if (m_alt_text.is_null() != typed_other.m_alt_text.is_null())
+ return false;
+ if (!m_alt_text.is_null())
+ return m_alt_text->equals(*typed_other.m_alt_text);
+ return true;
+}
+
String FlexStyleValue::to_string() const
{
return String::formatted("{} {} {}", m_grow->to_string(), m_shrink->to_string(), m_basis->to_string());
}
+bool FlexStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_flex();
+ return m_grow->equals(typed_other.m_grow)
+ && m_shrink->equals(typed_other.m_shrink)
+ && m_basis->equals(typed_other.m_basis);
+}
+
String FlexFlowStyleValue::to_string() const
{
return String::formatted("{} {}", m_flex_direction->to_string(), m_flex_wrap->to_string());
}
+bool FlexFlowStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_flex_flow();
+ return m_flex_direction->equals(typed_other.m_flex_direction)
+ && m_flex_wrap->equals(typed_other.m_flex_wrap);
+}
+
String FontStyleValue::to_string() const
{
return String::formatted("{} {} {} / {} {}", m_font_style->to_string(), m_font_weight->to_string(), m_font_size->to_string(), m_line_height->to_string(), m_font_families->to_string());
}
+bool FontStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_font();
+ return m_font_style->equals(typed_other.m_font_style)
+ && m_font_weight->equals(typed_other.m_font_weight)
+ && m_font_size->equals(typed_other.m_font_size)
+ && m_line_height->equals(typed_other.m_line_height)
+ && m_font_families->equals(typed_other.m_font_families);
+}
+
+bool FrequencyStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_frequency == other.as_frequency().m_frequency;
+}
+
String IdentifierStyleValue::to_string() const
{
return CSS::string_from_value_id(m_id);
}
+bool IdentifierStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_id == other.as_identifier().m_id;
+}
+
bool IdentifierStyleValue::has_color() const
{
switch (m_id) {
@@ -1268,11 +1395,45 @@ String ImageStyleValue::to_string() const
return serialize_a_url(m_url.to_string());
}
+bool ImageStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_url == other.as_image().m_url;
+}
+
+bool InheritStyleValue::equals(StyleValue const& other) const
+{
+ return type() == other.type();
+}
+
+bool InitialStyleValue::equals(StyleValue const& other) const
+{
+ return type() == other.type();
+}
+
+bool LengthStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_length == other.as_length().m_length;
+}
+
String ListStyleStyleValue::to_string() const
{
return String::formatted("{} {} {}", m_position->to_string(), m_image->to_string(), m_style_type->to_string());
}
+bool ListStyleStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_list_style();
+ return m_position->equals(typed_other.m_position)
+ && m_image->equals(typed_other.m_image)
+ && m_style_type->equals(typed_other.m_style_type);
+}
+
String NumericStyleValue::to_string() const
{
return m_value.visit(
@@ -1284,16 +1445,43 @@ String NumericStyleValue::to_string() const
});
}
+bool NumericStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ if (has_integer() != other.has_integer())
+ return false;
+ if (has_integer())
+ return m_value.get<i64>() == other.as_numeric().m_value.get<i64>();
+ return m_value.get<float>() == other.as_numeric().m_value.get<float>();
+}
+
String OverflowStyleValue::to_string() const
{
return String::formatted("{} {}", m_overflow_x->to_string(), m_overflow_y->to_string());
}
+bool OverflowStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_overflow();
+ return m_overflow_x->equals(typed_other.m_overflow_x)
+ && m_overflow_y->equals(typed_other.m_overflow_y);
+}
+
String PercentageStyleValue::to_string() const
{
return m_percentage.to_string();
}
+bool PercentageStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_percentage == other.as_percentage().m_percentage;
+}
+
String PositionStyleValue::to_string() const
{
auto to_string = [](PositionEdge edge) {
@@ -1313,11 +1501,76 @@ String PositionStyleValue::to_string() const
return String::formatted("{} {} {} {}", to_string(m_edge_x), m_offset_x.to_string(), to_string(m_edge_y), m_offset_y.to_string());
}
+bool PositionStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_position();
+ return m_edge_x == typed_other.m_edge_x
+ && m_offset_x == typed_other.m_offset_x
+ && m_edge_y == typed_other.m_edge_y
+ && m_offset_y == typed_other.m_offset_y;
+}
+
+bool ResolutionStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_resolution == other.as_resolution().m_resolution;
+}
+
+String ShadowStyleValue::to_string() const
+{
+ StringBuilder builder;
+ builder.appendff("{} {} {} {} {}", m_color.to_string(), m_offset_x.to_string(), m_offset_y.to_string(), m_blur_radius.to_string(), m_spread_distance.to_string());
+ if (m_placement == ShadowPlacement::Inner)
+ builder.append(" inset");
+ return builder.to_string();
+}
+
+bool ShadowStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_shadow();
+ return m_color == typed_other.m_color
+ && m_offset_x == typed_other.m_offset_x
+ && m_offset_y == typed_other.m_offset_y
+ && m_blur_radius == typed_other.m_blur_radius
+ && m_spread_distance == typed_other.m_spread_distance
+ && m_placement == typed_other.m_placement;
+}
+
+bool StringStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_string == other.as_string().m_string;
+}
+
String TextDecorationStyleValue::to_string() const
{
return String::formatted("{} {} {} {}", m_line->to_string(), m_thickness->to_string(), m_style->to_string(), m_color->to_string());
}
+bool TextDecorationStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_text_decoration();
+ return m_line->equals(typed_other.m_line)
+ && m_thickness->equals(typed_other.m_thickness)
+ && m_style->equals(typed_other.m_style)
+ && m_color->equals(typed_other.m_color);
+}
+
+bool TimeStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ return m_time == other.as_time().m_time;
+}
+
String TransformationStyleValue::to_string() const
{
StringBuilder builder;
@@ -1329,6 +1582,22 @@ String TransformationStyleValue::to_string() const
return builder.to_string();
}
+bool TransformationStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_transformation();
+ if (m_transform_function != typed_other.m_transform_function)
+ return false;
+ if (m_values.size() != typed_other.m_values.size())
+ return false;
+ for (size_t i = 0; i < m_values.size(); ++i) {
+ if (!m_values[i].equals(typed_other.m_values[i]))
+ return false;
+ }
+ return true;
+}
+
String UnresolvedStyleValue::to_string() const
{
StringBuilder builder;
@@ -1337,6 +1606,19 @@ String UnresolvedStyleValue::to_string() const
return builder.to_string();
}
+bool UnresolvedStyleValue::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ // This is a case where comparing the strings actually makes sense.
+ return to_string() == other.to_string();
+}
+
+bool UnsetStyleValue::equals(StyleValue const& other) const
+{
+ return type() == other.type();
+}
+
String StyleValueList::to_string() const
{
String separator = "";
@@ -1354,6 +1636,22 @@ String StyleValueList::to_string() const
return String::join(separator, m_values);
}
+bool StyleValueList::equals(StyleValue const& other) const
+{
+ if (type() != other.type())
+ return false;
+ auto const& typed_other = other.as_value_list();
+ if (m_separator != typed_other.m_separator)
+ return false;
+ if (m_values.size() != typed_other.m_values.size())
+ return false;
+ for (size_t i = 0; i < m_values.size(); ++i) {
+ if (!m_values[i].equals(typed_other.m_values[i]))
+ return false;
+ }
+ return true;
+}
+
NonnullRefPtr<ColorStyleValue> ColorStyleValue::create(Color color)
{
if (color.value() == 0) {
diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h
index 5ec1035d76..be50c97dba 100644
--- a/Userland/Libraries/LibWeb/CSS/StyleValue.h
+++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h
@@ -239,12 +239,7 @@ public:
bool operator==(StyleValue const& other) const { return equals(other); }
bool operator!=(StyleValue const& other) const { return !(*this == other); }
- virtual bool equals(StyleValue const& other) const
- {
- if (type() != other.type())
- return false;
- return to_string() == other.to_string();
- }
+ virtual bool equals(StyleValue const& other) const = 0;
protected:
explicit StyleValue(Type);
@@ -310,6 +305,7 @@ public:
NonnullRefPtr<StyleValue> size() const { return m_size; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
BackgroundStyleValue(
@@ -346,14 +342,7 @@ public:
Repeat repeat_y() const { return m_repeat_y; }
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- auto& other_value = static_cast<BackgroundRepeatStyleValue const&>(other);
- return m_repeat_x == other_value.m_repeat_x && m_repeat_y == other_value.m_repeat_y;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
BackgroundRepeatStyleValue(Repeat repeat_x, Repeat repeat_y)
@@ -380,14 +369,7 @@ public:
LengthPercentage size_y() const { return m_size_y; }
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- auto& other_value = static_cast<BackgroundSizeStyleValue const&>(other);
- return m_size_x == other_value.m_size_x && m_size_y == other_value.m_size_y;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
BackgroundSizeStyleValue(LengthPercentage size_x, LengthPercentage size_y)
@@ -417,6 +399,7 @@ public:
NonnullRefPtr<StyleValue> border_color() const { return m_border_color; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
BorderStyleValue(
@@ -448,16 +431,7 @@ public:
bool is_elliptical() const { return m_is_elliptical; }
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- auto& other_value = static_cast<BorderRadiusStyleValue const&>(other);
- return m_is_elliptical == other_value.m_is_elliptical
- && m_horizontal_radius == other_value.m_horizontal_radius
- && m_vertical_radius == other_value.m_vertical_radius;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
BorderRadiusStyleValue(LengthPercentage const& horizontal_radius, LengthPercentage const& vertical_radius)
@@ -489,6 +463,7 @@ public:
NonnullRefPtr<BorderRadiusStyleValue> bottom_left() const { return m_bottom_left; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
BorderRadiusShorthandStyleValue(NonnullRefPtr<BorderRadiusStyleValue> top_left, NonnullRefPtr<BorderRadiusStyleValue> top_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_left)
@@ -666,6 +641,7 @@ public:
}
String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
ResolvedType resolved_type() const { return m_resolved_type; }
NonnullOwnPtr<CalcSum> const& expression() const { return m_expression; }
@@ -703,12 +679,7 @@ public:
virtual bool has_color() const override { return true; }
virtual Color to_color(Layout::NodeWithStyle const&) const override { return m_color; }
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- return m_color == static_cast<ColorStyleValue const&>(other).m_color;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit ColorStyleValue(Color color)
@@ -732,6 +703,7 @@ public:
StyleValueList const* alt_text() const { return m_alt_text; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
ContentStyleValue(NonnullRefPtr<StyleValueList> content, RefPtr<StyleValueList> alt_text)
@@ -761,6 +733,7 @@ public:
NonnullRefPtr<StyleValue> basis() const { return m_basis; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
FlexStyleValue(
@@ -791,6 +764,7 @@ public:
NonnullRefPtr<StyleValue> flex_wrap() const { return m_flex_wrap; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
FlexFlowStyleValue(NonnullRefPtr<StyleValue> flex_direction, NonnullRefPtr<StyleValue> flex_wrap)
@@ -816,6 +790,7 @@ public:
NonnullRefPtr<StyleValue> font_families() const { return m_font_families; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
FontStyleValue(NonnullRefPtr<StyleValue> font_style, NonnullRefPtr<StyleValue> font_weight, NonnullRefPtr<StyleValue> font_size, NonnullRefPtr<StyleValue> line_height, NonnullRefPtr<StyleValue> font_families)
@@ -847,13 +822,7 @@ public:
Frequency const& frequency() const { return m_frequency; }
virtual String to_string() const override { return m_frequency.to_string(); }
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- return m_frequency == static_cast<FrequencyStyleValue const&>(other).m_frequency;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit FrequencyStyleValue(Frequency frequency)
@@ -881,13 +850,7 @@ public:
virtual bool has_color() const override;
virtual Color to_color(Layout::NodeWithStyle const& node) const override;
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- return m_id == static_cast<IdentifierStyleValue const&>(other).m_id;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit IdentifierStyleValue(CSS::ValueID id)
@@ -907,6 +870,7 @@ public:
virtual ~ImageStyleValue() override = default;
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
void load_bitmap(DOM::Document& document);
Gfx::Bitmap const* bitmap() const { return m_bitmap; }
@@ -932,6 +896,7 @@ public:
virtual ~InheritStyleValue() override = default;
String to_string() const override { return "inherit"; }
+ virtual bool equals(StyleValue const& other) const override;
private:
InheritStyleValue()
@@ -950,6 +915,7 @@ public:
virtual ~InitialStyleValue() override = default;
String to_string() const override { return "initial"; }
+ virtual bool equals(StyleValue const& other) const override;
private:
InitialStyleValue()
@@ -972,13 +938,7 @@ public:
virtual Length to_length() const override { return m_length; }
virtual ValueID to_identifier() const override { return has_auto() ? ValueID::Auto : ValueID::Invalid; }
virtual NonnullRefPtr<StyleValue> absolutized(Gfx::IntRect const& viewport_rect, Gfx::FontPixelMetrics const& font_metrics, float font_size, float root_font_size) const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- return m_length == static_cast<LengthStyleValue const&>(other).m_length;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit LengthStyleValue(Length const& length)
@@ -1006,6 +966,7 @@ public:
NonnullRefPtr<StyleValue> style_type() const { return m_style_type; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
ListStyleStyleValue(
@@ -1051,17 +1012,7 @@ public:
virtual float to_integer() const override { return m_value.get<i64>(); }
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- if (has_integer() != other.has_integer())
- return false;
- if (has_integer())
- return m_value.get<i64>() == static_cast<NumericStyleValue const&>(other).m_value.get<i64>();
- return m_value.get<float>() == static_cast<NumericStyleValue const&>(other).m_value.get<float>();
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit NumericStyleValue(Variant<float, i64> value)
@@ -1085,6 +1036,7 @@ public:
NonnullRefPtr<StyleValue> overflow_y() const { return m_overflow_y; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
OverflowStyleValue(NonnullRefPtr<StyleValue> overflow_x, NonnullRefPtr<StyleValue> overflow_y)
@@ -1110,6 +1062,7 @@ public:
Percentage& percentage() { return m_percentage; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
PercentageStyleValue(Percentage&& percentage)
@@ -1135,17 +1088,7 @@ public:
LengthPercentage const& offset_y() const { return m_offset_y; }
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- auto const& typed_other = static_cast<PositionStyleValue const&>(other);
- return m_edge_x == typed_other.m_edge_x
- && m_offset_x == typed_other.m_offset_x
- && m_edge_y == typed_other.m_edge_y
- && m_offset_y == typed_other.m_offset_y;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
PositionStyleValue(PositionEdge edge_x, LengthPercentage const& offset_x, PositionEdge edge_y, LengthPercentage const& offset_y)
@@ -1174,13 +1117,7 @@ public:
Resolution const& resolution() const { return m_resolution; }
virtual String to_string() const override { return m_resolution.to_string(); }
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- return m_resolution == static_cast<ResolutionStyleValue const&>(other).m_resolution;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit ResolutionStyleValue(Resolution resolution)
@@ -1209,19 +1146,7 @@ public:
ShadowPlacement placement() const { return m_placement; }
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- auto& other_value = static_cast<ShadowStyleValue const&>(other);
- return m_color == other_value.m_color
- && m_offset_x == other_value.m_offset_x
- && m_offset_y == other_value.m_offset_y
- && m_blur_radius == other_value.m_blur_radius
- && m_spread_distance == other_value.m_spread_distance
- && m_placement == other_value.m_placement;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit ShadowStyleValue(Color const& color, Length const& offset_x, Length const& offset_y, Length const& blur_radius, Length const& spread_distance, ShadowPlacement placement)
@@ -1254,6 +1179,7 @@ public:
virtual ~StringStyleValue() override = default;
String to_string() const override { return m_string; }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit StringStyleValue(String const& string)
@@ -1283,6 +1209,7 @@ public:
NonnullRefPtr<StyleValue> color() const { return m_color; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
TextDecorationStyleValue(
@@ -1315,13 +1242,7 @@ public:
Time const& time() const { return m_time; }
virtual String to_string() const override { return m_time.to_string(); }
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- return m_time == static_cast<TimeStyleValue const&>(other).m_time;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
explicit TimeStyleValue(Time time)
@@ -1345,6 +1266,7 @@ public:
NonnullRefPtrVector<StyleValue> values() const { return m_values; }
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
private:
TransformationStyleValue(CSS::TransformFunction transform_function, NonnullRefPtrVector<StyleValue>&& values)
@@ -1367,6 +1289,7 @@ public:
virtual ~UnresolvedStyleValue() override = default;
virtual String to_string() const override;
+ virtual bool equals(StyleValue const& other) const override;
Vector<Parser::ComponentValue> const& values() const { return m_values; }
bool contains_var_or_attr() const { return m_contains_var_or_attr; }
@@ -1393,6 +1316,7 @@ public:
virtual ~UnsetStyleValue() override = default;
String to_string() const override { return "unset"; }
+ virtual bool equals(StyleValue const& other) const override;
private:
UnsetStyleValue()
@@ -1419,22 +1343,7 @@ public:
}
virtual String to_string() const override;
-
- virtual bool equals(StyleValue const& other) const override
- {
- if (type() != other.type())
- return false;
- auto& other_value = static_cast<StyleValueList const&>(other);
- if (m_separator != other_value.m_separator)
- return false;
- if (m_values.size() != other_value.m_values.size())
- return false;
- for (size_t i = 0; i < m_values.size(); ++i) {
- if (!m_values[i].equals(other_value.m_values[i]))
- return false;
- }
- return true;
- }
+ virtual bool equals(StyleValue const& other) const override;
private:
StyleValueList(NonnullRefPtrVector<StyleValue>&& values, Separator separator)