Skip to content

Commit eb0fb38

Browse files
trflynn89awesomekling
authored andcommitted
LibWeb: Support parsing some data: URLs in CSS
For now, data URLs are explicitly limited to expected MIME types. For example, image-related styles accept image MIME types.
1 parent 1e6afa9 commit eb0fb38

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,20 +1706,34 @@ Vector<Vector<StyleComponentValueRule>> Parser::parse_a_comma_separated_list_of_
17061706
return lists;
17071707
}
17081708

1709-
Optional<AK::URL> Parser::parse_url_function(ParsingContext const& context, StyleComponentValueRule const& component_value)
1709+
Optional<AK::URL> Parser::parse_url_function(ParsingContext const& context, StyleComponentValueRule const& component_value, AllowedDataUrlType allowed_data_url_type)
17101710
{
17111711
// FIXME: Handle list of media queries. https://www.w3.org/TR/css-cascade-3/#conditional-import
17121712
// FIXME: Handle data: urls (RFC2397)
17131713

1714-
auto is_data_url = [](StringView& url_string) -> bool {
1715-
return url_string.starts_with("data:", CaseSensitivity::CaseInsensitive);
1714+
auto convert_string_to_url = [&](StringView& url_string) -> Optional<AK::URL> {
1715+
if (url_string.starts_with("data:", CaseSensitivity::CaseInsensitive)) {
1716+
auto data_url = AK::URL(url_string);
1717+
1718+
switch (allowed_data_url_type) {
1719+
case AllowedDataUrlType::Image:
1720+
if (data_url.data_mime_type().starts_with("image"sv, CaseSensitivity::CaseInsensitive))
1721+
return data_url;
1722+
break;
1723+
1724+
default:
1725+
break;
1726+
}
1727+
1728+
return {};
1729+
}
1730+
1731+
return context.complete_url(url_string);
17161732
};
17171733

17181734
if (component_value.is(Token::Type::Url)) {
17191735
auto url_string = component_value.token().url();
1720-
if (is_data_url(url_string))
1721-
return {};
1722-
return context.complete_url(url_string);
1736+
return convert_string_to_url(url_string);
17231737
}
17241738
if (component_value.is_function() && component_value.function().name().equals_ignoring_case("url")) {
17251739
auto& function_values = component_value.function().values();
@@ -1730,9 +1744,7 @@ Optional<AK::URL> Parser::parse_url_function(ParsingContext const& context, Styl
17301744
continue;
17311745
if (value.is(Token::Type::String)) {
17321746
auto url_string = value.token().string();
1733-
if (is_data_url(url_string))
1734-
return {};
1735-
return context.complete_url(url_string);
1747+
return convert_string_to_url(url_string);
17361748
}
17371749
break;
17381750
}
@@ -2370,7 +2382,7 @@ RefPtr<StyleValue> Parser::parse_string_value(ParsingContext const&, StyleCompon
23702382

23712383
RefPtr<StyleValue> Parser::parse_image_value(ParsingContext const& context, StyleComponentValueRule const& component_value)
23722384
{
2373-
auto url = parse_url_function(context, component_value);
2385+
auto url = parse_url_function(context, component_value, AllowedDataUrlType::Image);
23742386
if (url.has_value())
23752387
return ImageStyleValue::create(url.value());
23762388
// FIXME: Handle gradients.

Userland/Libraries/LibWeb/CSS/Parser/Parser.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,12 @@ class Parser {
195195
static Optional<float> try_parse_float(StringView string);
196196
static Optional<Color> parse_color(ParsingContext const&, StyleComponentValueRule const&);
197197
static Optional<Length> parse_length(ParsingContext const&, StyleComponentValueRule const&);
198-
static Optional<AK::URL> parse_url_function(ParsingContext const&, StyleComponentValueRule const&);
198+
199+
enum class AllowedDataUrlType {
200+
None,
201+
Image,
202+
};
203+
static Optional<AK::URL> parse_url_function(ParsingContext const&, StyleComponentValueRule const&, AllowedDataUrlType = AllowedDataUrlType::None);
199204

200205
Result<NonnullRefPtr<StyleValue>, ParsingResult> parse_css_value(PropertyID, TokenStream<StyleComponentValueRule>&);
201206
static RefPtr<StyleValue> parse_css_value(ParsingContext const&, StyleComponentValueRule const&);

0 commit comments

Comments
 (0)