diff options
author | Sam Atkins <atkinssj@serenityos.org> | 2021-11-05 13:44:37 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-11-10 14:38:49 +0100 |
commit | 67214e0b61a6a9ced6b3ce2e3e990d8f059cc040 (patch) | |
tree | 13b6ae87160a45588ddf4a108bda00da526c434d /Userland/Libraries/LibWeb/CSS/Parser | |
parent | ae2a3bf185865b2e31e0cc4c630832053bb7db20 (diff) | |
download | serenity-67214e0b61a6a9ced6b3ce2e3e990d8f059cc040.zip |
LibWeb: Parse `background-size` property
Diffstat (limited to 'Userland/Libraries/LibWeb/CSS/Parser')
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 39 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 2 |
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&); |