diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 2c942f7be8..e0fc77ab96 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -2388,23 +2388,23 @@ static Optional> parse_color_stop_list(auto& tokens, auto is_po return color_stops; } +static StringView consume_if_starts_with(StringView str, StringView start, auto found_callback) +{ + if (str.starts_with(start, CaseSensitivity::CaseInsensitive)) { + found_callback(); + return str.substring_view(start.length()); + } + return str; +}; + RefPtr Parser::parse_linear_gradient_function(ComponentValue const& component_value) { using GradientType = LinearGradientStyleValue::GradientType; - using Repeating = LinearGradientStyleValue::Repeating; if (!component_value.is_function()) return {}; - auto consume_if_starts_with = [](StringView str, StringView start, auto found_callback) { - if (str.starts_with(start, CaseSensitivity::CaseInsensitive)) { - found_callback(); - return str.substring_view(start.length()); - } - return str; - }; - - Repeating repeating_gradient = Repeating::No; + GradientRepeating repeating_gradient = GradientRepeating::No; GradientType gradient_type { GradientType::Standard }; auto function_name = component_value.function().name(); @@ -2414,7 +2414,7 @@ RefPtr Parser::parse_linear_gradient_function(ComponentValue const& }); function_name = consume_if_starts_with(function_name, "repeating-"sv, [&] { - repeating_gradient = Repeating::Yes; + repeating_gradient = GradientRepeating::Yes; }); if (!function_name.equals_ignoring_case("linear-gradient"sv)) @@ -2541,8 +2541,15 @@ RefPtr Parser::parse_conic_gradient_function(ComponentValue const& c { if (!component_value.is_function()) return {}; + + GradientRepeating repeating_gradient = GradientRepeating::No; + auto function_name = component_value.function().name(); + function_name = consume_if_starts_with(function_name, "repeating-"sv, [&] { + repeating_gradient = GradientRepeating::Yes; + }); + if (!function_name.equals_ignoring_case("conic-gradient"sv)) return {}; @@ -2636,7 +2643,7 @@ RefPtr Parser::parse_conic_gradient_function(ComponentValue const& c if (!color_stops.has_value()) return {}; - return ConicGradientStyleValue::create(from_angle, at_position, move(*color_stops)); + return ConicGradientStyleValue::create(from_angle, at_position, move(*color_stops), repeating_gradient); } Optional Parser::parse_position(TokenStream& tokens) diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp index 5772cebccc..5e3ed8d9aa 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp @@ -1751,7 +1751,7 @@ String LinearGradientStyleValue::to_string() const if (m_gradient_type == GradientType::WebKit) builder.append("-webkit-"sv); - if (m_repeating == Repeating::Yes) + if (is_repeating()) builder.append("repeating-"sv); builder.append("linear-gradient("sv); m_direction.visit( @@ -1958,6 +1958,8 @@ bool PositionValue::operator==(PositionValue const& other) const String ConicGradientStyleValue::to_string() const { StringBuilder builder; + if (is_repeating()) + builder.append("repeating-"sv); builder.append("conic-gradient("sv); bool has_from_angle = false; bool has_at_position = false; diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index a454938273..f0b0bbbb6d 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -1190,12 +1190,17 @@ private: RefPtr m_bitmap; }; +enum class GradientRepeating { + Yes, + No +}; + class ConicGradientStyleValue final : public AbstractImageStyleValue { public: - static NonnullRefPtr create(Angle from_angle, PositionValue position, Vector color_stop_list) + static NonnullRefPtr create(Angle from_angle, PositionValue position, Vector color_stop_list, GradientRepeating repeating) { VERIFY(color_stop_list.size() >= 2); - return adopt_ref(*new ConicGradientStyleValue(from_angle, position, move(color_stop_list))); + return adopt_ref(*new ConicGradientStyleValue(from_angle, position, move(color_stop_list), repeating)); } virtual String to_string() const override; @@ -1219,12 +1224,15 @@ public: Gfx::FloatPoint resolve_position(Layout::Node const&, Gfx::FloatRect const&) const; + bool is_repeating() const { return m_repeating == GradientRepeating::Yes; } + private: - ConicGradientStyleValue(Angle from_angle, PositionValue position, Vector color_stop_list) + ConicGradientStyleValue(Angle from_angle, PositionValue position, Vector color_stop_list, GradientRepeating repeating) : AbstractImageStyleValue(Type::ConicGradient) , m_from_angle(from_angle) , m_position(position) , m_color_stop_list(move(color_stop_list)) + , m_repeating(repeating) { } @@ -1232,6 +1240,7 @@ private: Angle m_from_angle; PositionValue m_position; Vector m_color_stop_list; + GradientRepeating m_repeating; struct ResolvedData { Painting::ConicGradientData data; @@ -1250,12 +1259,7 @@ public: WebKit }; - enum class Repeating { - Yes, - No - }; - - static NonnullRefPtr create(GradientDirection direction, Vector color_stop_list, GradientType type, Repeating repeating) + static NonnullRefPtr create(GradientDirection direction, Vector color_stop_list, GradientType type, GradientRepeating repeating) { VERIFY(color_stop_list.size() >= 2); return adopt_ref(*new LinearGradientStyleValue(direction, move(color_stop_list), type, repeating)); @@ -1270,7 +1274,7 @@ public: return m_color_stop_list; } - bool is_repeating() const { return m_repeating == Repeating::Yes; } + bool is_repeating() const { return m_repeating == GradientRepeating::Yes; } float angle_degrees(Gfx::FloatSize const& gradient_size) const; @@ -1280,7 +1284,7 @@ public: void paint(PaintContext& context, Gfx::IntRect const& dest_rect, CSS::ImageRendering image_rendering) const override; private: - LinearGradientStyleValue(GradientDirection direction, Vector color_stop_list, GradientType type, Repeating repeating) + LinearGradientStyleValue(GradientDirection direction, Vector color_stop_list, GradientType type, GradientRepeating repeating) : AbstractImageStyleValue(Type::LinearGradient) , m_direction(direction) , m_color_stop_list(move(color_stop_list)) @@ -1292,7 +1296,7 @@ private: GradientDirection m_direction; Vector m_color_stop_list; GradientType m_gradient_type; - Repeating m_repeating; + GradientRepeating m_repeating; struct ResolvedData { Painting::LinearGradientData data;