summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/CSS/Parser
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2021-11-05 13:44:37 +0000
committerAndreas Kling <kling@serenityos.org>2021-11-10 14:38:49 +0100
commit67214e0b61a6a9ced6b3ce2e3e990d8f059cc040 (patch)
tree13b6ae87160a45588ddf4a108bda00da526c434d /Userland/Libraries/LibWeb/CSS/Parser
parentae2a3bf185865b2e31e0cc4c630832053bb7db20 (diff)
downloadserenity-67214e0b61a6a9ced6b3ce2e3e990d8f059cc040.zip
LibWeb: Parse `background-size` property
Diffstat (limited to 'Userland/Libraries/LibWeb/CSS/Parser')
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp39
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.h2
2 files changed, 41 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
index 01003415aa..cb528c7252 100644
--- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
+++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
@@ -2751,6 +2751,41 @@ RefPtr<StyleValue> Parser::parse_background_repeat_value(ParsingContext const& c
return parse_single_background_repeat_value(context, tokens);
}
+RefPtr<StyleValue> Parser::parse_single_background_size_value(ParsingContext const& context, TokenStream<StyleComponentValueRule>& tokens)
+{
+ auto start_position = tokens.position();
+ auto error = [&]() {
+ tokens.rewind_to_position(start_position);
+ return nullptr;
+ };
+
+ auto maybe_x_value = parse_css_value(context, tokens.next_token());
+ if (!maybe_x_value || !property_accepts_value(PropertyID::BackgroundSize, *maybe_x_value))
+ return error();
+ auto x_value = maybe_x_value.release_nonnull();
+
+ if (x_value->to_identifier() == ValueID::Cover || x_value->to_identifier() == ValueID::Contain)
+ return x_value;
+
+ auto maybe_y_value = parse_css_value(context, tokens.peek_token());
+ if (!maybe_y_value || !property_accepts_value(PropertyID::BackgroundSize, *maybe_y_value))
+ return BackgroundSizeStyleValue::create(x_value->to_length(), x_value->to_length());
+ tokens.next_token();
+ auto y_value = maybe_y_value.release_nonnull();
+
+ if (x_value->has_length() && y_value->has_length())
+ return BackgroundSizeStyleValue::create(x_value->to_length(), y_value->to_length());
+
+ return error();
+}
+
+RefPtr<StyleValue> Parser::parse_background_size_value(ParsingContext const& context, Vector<StyleComponentValueRule> const& component_values)
+{
+ auto tokens = TokenStream { component_values };
+ // FIXME: Handle multiple sets of comma-separated values.
+ return parse_single_background_size_value(context, tokens);
+}
+
RefPtr<StyleValue> Parser::parse_border_value(ParsingContext const& context, Vector<StyleComponentValueRule> const& component_values)
{
if (component_values.size() > 3)
@@ -3473,6 +3508,10 @@ Result<NonnullRefPtr<StyleValue>, Parser::ParsingResult> Parser::parse_css_value
if (auto parsed_value = parse_background_repeat_value(m_context, component_values))
return parsed_value.release_nonnull();
return ParsingResult::SyntaxError;
+ case PropertyID::BackgroundSize:
+ if (auto parsed_value = parse_background_size_value(m_context, component_values))
+ return parsed_value.release_nonnull();
+ return ParsingResult::SyntaxError;
case PropertyID::Border:
case PropertyID::BorderBottom:
case PropertyID::BorderLeft:
diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h
index a79f704a3d..6592e73dc4 100644
--- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h
+++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h
@@ -218,6 +218,8 @@ private:
static RefPtr<StyleValue> parse_background_position_value(ParsingContext const&, Vector<StyleComponentValueRule> const&);
static RefPtr<StyleValue> parse_single_background_repeat_value(ParsingContext const&, TokenStream<StyleComponentValueRule>&);
static RefPtr<StyleValue> parse_background_repeat_value(ParsingContext const&, Vector<StyleComponentValueRule> const&);
+ static RefPtr<StyleValue> parse_single_background_size_value(ParsingContext const&, TokenStream<StyleComponentValueRule>&);
+ static RefPtr<StyleValue> parse_background_size_value(ParsingContext const&, Vector<StyleComponentValueRule> const&);
static RefPtr<StyleValue> parse_border_value(ParsingContext const&, Vector<StyleComponentValueRule> const&);
static RefPtr<StyleValue> parse_border_radius_value(ParsingContext const&, Vector<StyleComponentValueRule> const&);
static RefPtr<StyleValue> parse_border_radius_shorthand_value(ParsingContext const&, Vector<StyleComponentValueRule> const&);