diff --git a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp index 686eb1738a8..e22c0800f66 100644 --- a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp @@ -2710,7 +2710,6 @@ Optional Parser::parse_url_function(TokenStream& tokens) // = | // = url( * ) | // = src( * ) - // FIXME: Also parse src() function auto transaction = tokens.begin_transaction(); auto const& component_value = tokens.consume_a_token(); @@ -2721,7 +2720,17 @@ Optional Parser::parse_url_function(TokenStream& tokens) } // = url( * ) - if (component_value.is_function("url"sv)) { + // = src( * ) + if (component_value.is_function()) { + URL::Type function_type; + if (component_value.is_function("url"sv)) { + function_type = URL::Type::Url; + } else if (component_value.is_function("src"sv)) { + function_type = URL::Type::Src; + } else { + return {}; + } + auto const& function_values = component_value.function().value; TokenStream url_tokens { function_values }; @@ -2802,7 +2811,7 @@ Optional Parser::parse_url_function(TokenStream& tokens) }); transaction.commit(); - return URL { url_string.token().string().to_string(), move(request_url_modifiers) }; + return URL { url_string.token().string().to_string(), function_type, move(request_url_modifiers) }; } return {}; diff --git a/Libraries/LibWeb/CSS/URL.cpp b/Libraries/LibWeb/CSS/URL.cpp index 07276c65160..516f8422fab 100644 --- a/Libraries/LibWeb/CSS/URL.cpp +++ b/Libraries/LibWeb/CSS/URL.cpp @@ -10,8 +10,9 @@ namespace Web::CSS { -URL::URL(String url, Vector request_url_modifiers) - : m_url(move(url)) +URL::URL(String url, Type type, Vector request_url_modifiers) + : m_type(type) + , m_url(move(url)) , m_request_url_modifiers(move(request_url_modifiers)) { } @@ -19,9 +20,18 @@ URL::URL(String url, Vector request_url_modifiers) // https://drafts.csswg.org/cssom-1/#serialize-a-url String URL::to_string() const { - // To serialize a URL means to create a string represented by "url(", followed by the serialization of the URL as a string, followed by ")". + // To serialize a URL means to create a string represented by "url(", followed by the serialization of the URL as a + // string, followed by ")". + // AD-HOC: Serialize as src() if it was declared as that. StringBuilder builder; - builder.append("url("sv); + switch (m_type) { + case Type::Url: + builder.append("url("sv); + break; + case Type::Src: + builder.append("src("sv); + break; + } serialize_a_string(builder, m_url); // AD-HOC: Serialize the RequestURLModifiers diff --git a/Libraries/LibWeb/CSS/URL.h b/Libraries/LibWeb/CSS/URL.h index e5c7e3c1da2..8e2f67ee2b6 100644 --- a/Libraries/LibWeb/CSS/URL.h +++ b/Libraries/LibWeb/CSS/URL.h @@ -44,7 +44,12 @@ private: // https://drafts.csswg.org/css-values-4/#urls class URL { public: - URL(String url, Vector = {}); + enum class Type : u8 { + Url, + Src, + }; + + URL(String url, Type = Type::Url, Vector = {}); String const& url() const { return m_url; } Vector const& request_url_modifiers() const { return m_request_url_modifiers; } @@ -53,6 +58,7 @@ public: bool operator==(URL const&) const; private: + Type m_type; String m_url; Vector m_request_url_modifiers; }; diff --git a/Tests/LibWeb/Text/expected/css/src-function.txt b/Tests/LibWeb/Text/expected/css/src-function.txt new file mode 100644 index 00000000000..c1c4f9a6c86 --- /dev/null +++ b/Tests/LibWeb/Text/expected/css/src-function.txt @@ -0,0 +1,5 @@ +Before: none +Using url('cool.png'): url("cool.png") +Using url(var(--some-url)): none +Using src('cool.png'): src("cool.png") +Using src(var(--some-url)): src("awesome.png") diff --git a/Tests/LibWeb/Text/input/css/src-function.html b/Tests/LibWeb/Text/input/css/src-function.html new file mode 100644 index 00000000000..6759c32060d --- /dev/null +++ b/Tests/LibWeb/Text/input/css/src-function.html @@ -0,0 +1,25 @@ + + +
+