From bd25d0b1b424abb6b50978f94fd05f8f619ba067 Mon Sep 17 00:00:00 2001
From: Gingeh <39150378+Gingeh@users.noreply.github.com>
Date: Wed, 30 Oct 2024 21:36:57 +1100
Subject: [PATCH] LibWeb: Parse drop-shadow filter with missing or starting
color
---
.../Screenshot/css-filter-drop-shadow.html | 22 ++++++++++++++++++
.../images/css-filter-drop-shadow-ref.png | Bin 0 -> 6700 bytes
.../reference/css-filter-drop-shadow-ref.html | 10 ++++++++
.../Libraries/LibWeb/CSS/Parser/Parser.cpp | 7 +++++-
4 files changed, 38 insertions(+), 1 deletion(-)
create mode 100644 Tests/LibWeb/Screenshot/css-filter-drop-shadow.html
create mode 100644 Tests/LibWeb/Screenshot/images/css-filter-drop-shadow-ref.png
create mode 100644 Tests/LibWeb/Screenshot/reference/css-filter-drop-shadow-ref.html
diff --git a/Tests/LibWeb/Screenshot/css-filter-drop-shadow.html b/Tests/LibWeb/Screenshot/css-filter-drop-shadow.html
new file mode 100644
index 00000000000..84a285d8eb7
--- /dev/null
+++ b/Tests/LibWeb/Screenshot/css-filter-drop-shadow.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Tests/LibWeb/Screenshot/images/css-filter-drop-shadow-ref.png b/Tests/LibWeb/Screenshot/images/css-filter-drop-shadow-ref.png
new file mode 100644
index 0000000000000000000000000000000000000000..991ddf9c9cbbfd29047fe8edcf29b9018efa8a82
GIT binary patch
literal 6700
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
+ * {
+ margin: 0;
+ }
+
+ body {
+ background-color: white;
+ }
+
+
diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
index a945d2318df..8af7a1069b8 100644
--- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
+++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
@@ -5455,6 +5455,7 @@ RefPtr Parser::parse_filter_value_list_value(TokenStream maybe_radius = {};
auto maybe_color = parse_color_value(tokens);
+ tokens.discard_whitespace();
auto x_offset = parse_length(tokens);
tokens.discard_whitespace();
if (!x_offset.has_value() || !tokens.has_next_token())
@@ -5476,8 +5477,12 @@ RefPtr Parser::parse_filter_value_list_value(TokenStream color = {};
+ if (maybe_color)
+ color = maybe_color->to_color({});
+
// FIXME: Support calculated offsets and radius
- return if_no_more_tokens_return(FilterOperation::DropShadow { x_offset->value(), y_offset->value(), maybe_radius.map([](auto& it) { return it.value(); }), maybe_color->to_color({}) });
+ return if_no_more_tokens_return(FilterOperation::DropShadow { x_offset->value(), y_offset->value(), maybe_radius.map([](auto& it) { return it.value(); }), color });
} else if (filter_token == FilterToken::HueRotate) {
// hue-rotate( [ | ]? )
if (!tokens.has_next_token())