diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 76e66d0633..47579402a5 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1761,16 +1761,17 @@ static inline bool is_background_repeat(StyleValue const& value) } } +static inline bool is_background_image(StyleValue const& value) +{ + if (value.is_image()) + return true; + if (value.to_identifier() == ValueID::None) + return true; + return false; +} + RefPtr Parser::parse_background_value(ParsingContext const& context, Vector const& component_values) { - auto is_background_image = [](StyleValue const& value) -> bool { - if (value.is_image()) - return true; - if (value.to_identifier() == ValueID::None) - return true; - return false; - }; - RefPtr background_color; RefPtr background_image; RefPtr repeat_x; @@ -1849,6 +1850,23 @@ RefPtr Parser::parse_background_value(ParsingContext const& context, return BackgroundStyleValue::create(background_color.release_nonnull(), background_image.release_nonnull(), repeat_x.release_nonnull(), repeat_y.release_nonnull()); } +RefPtr Parser::parse_background_image_value(ParsingContext const& context, Vector const& component_values) +{ + if (component_values.size() == 1) { + auto maybe_value = parse_css_value(context, PropertyID::BackgroundImage, component_values.first()); + if (!maybe_value) + return nullptr; + auto value = maybe_value.release_nonnull(); + if (is_background_image(*value)) + return value; + return nullptr; + } + + // FIXME: Handle multiple sets of comma-separated values. + dbgln("CSS Parser does not yet support multiple comma-separated values for background-image."); + return nullptr; +} + RefPtr Parser::parse_background_repeat_value(ParsingContext const& context, Vector const& component_values) { auto is_directional_repeat = [](StyleValue const& value) -> bool { @@ -2697,6 +2715,10 @@ RefPtr Parser::parse_css_value(PropertyID property_id, TokenStream parse_string_value(ParsingContext const&, StyleComponentValueRule const&); static RefPtr parse_image_value(ParsingContext const&, StyleComponentValueRule const&); static RefPtr parse_background_value(ParsingContext const&, Vector const&); + static RefPtr parse_background_image_value(ParsingContext const&, Vector const&); static RefPtr parse_background_repeat_value(ParsingContext const&, Vector const&); static RefPtr parse_border_value(ParsingContext const&, PropertyID, Vector const&); static RefPtr parse_border_radius_value(ParsingContext const&, Vector const&); diff --git a/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp b/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp index 07d3fd5f11..edb5902525 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleResolver.cpp @@ -392,37 +392,19 @@ static void set_property_expanding_shorthands(StyleProperties& style, CSS::Prope } if (property_id == CSS::PropertyID::BackgroundImage) { - // FIXME: Remove string parsing once DeprecatedCSSParser is gone. - if (value.is_string()) { - return; - auto string = value.to_string(); - if (!string.starts_with("url(")) - return; - if (!string.ends_with(')')) - return; - auto url = string.substring_view(4, string.length() - 5); - if (url.length() >= 2 && url.starts_with('"') && url.ends_with('"')) - url = url.substring_view(1, url.length() - 2); - else if (url.length() >= 2 && url.starts_with('\'') && url.ends_with('\'')) - url = url.substring_view(1, url.length() - 2); - - auto background_image_value = ImageStyleValue::create(document.complete_url(url), document); - style.set_property(CSS::PropertyID::BackgroundImage, move(background_image_value)); - return; - } - - if (value.is_component_value_list()) { - auto parts = static_cast(value).values(); + if (value.is_value_list()) { + auto& background_image_list = static_cast(value).values(); // FIXME: Handle multiple backgrounds. - if (!parts.is_empty()) { - auto first_value = Parser::parse_css_value(context, property_id, parts[0]); - if (first_value) - style.set_property(CSS::PropertyID::BackgroundImage, *first_value); + if (!background_image_list.is_empty()) { + auto& background_image = background_image_list.first(); + style.set_property(CSS::PropertyID::BackgroundImage, background_image); } return; } - - style.set_property(CSS::PropertyID::BackgroundImage, value); + if (value.is_builtin() || value.is_image() || value.to_identifier() == ValueID::None) { + style.set_property(CSS::PropertyID::BackgroundImage, value); + return; + } return; }