@@ -1706,20 +1706,34 @@ Vector<Vector<StyleComponentValueRule>> Parser::parse_a_comma_separated_list_of_
1706
1706
return lists;
1707
1707
}
1708
1708
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 )
1710
1710
{
1711
1711
// FIXME: Handle list of media queries. https://www.w3.org/TR/css-cascade-3/#conditional-import
1712
1712
// FIXME: Handle data: urls (RFC2397)
1713
1713
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);
1716
1732
};
1717
1733
1718
1734
if (component_value.is (Token::Type::Url)) {
1719
1735
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);
1723
1737
}
1724
1738
if (component_value.is_function () && component_value.function ().name ().equals_ignoring_case (" url" )) {
1725
1739
auto & function_values = component_value.function ().values ();
@@ -1730,9 +1744,7 @@ Optional<AK::URL> Parser::parse_url_function(ParsingContext const& context, Styl
1730
1744
continue ;
1731
1745
if (value.is (Token::Type::String)) {
1732
1746
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);
1736
1748
}
1737
1749
break ;
1738
1750
}
@@ -2370,7 +2382,7 @@ RefPtr<StyleValue> Parser::parse_string_value(ParsingContext const&, StyleCompon
2370
2382
2371
2383
RefPtr<StyleValue> Parser::parse_image_value (ParsingContext const & context, StyleComponentValueRule const & component_value)
2372
2384
{
2373
- auto url = parse_url_function (context, component_value);
2385
+ auto url = parse_url_function (context, component_value, AllowedDataUrlType::Image );
2374
2386
if (url.has_value ())
2375
2387
return ImageStyleValue::create (url.value ());
2376
2388
// FIXME: Handle gradients.
0 commit comments