From d2342caf426cecbeb3c28b77a7fa2e226228d385 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 19 Aug 2021 15:45:15 +0100 Subject: [PATCH] LibWeb: Parse CSS builtins before other values These are straightforward to parse, so doing them first saves potentially expensive calculations inside parse_foo_value() functions. --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 19 ++++++++++++++++--- Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index e6a3d1dff6..b901115d80 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1399,7 +1399,7 @@ Optional Parser::try_parse_float(StringView string) return is_negative ? -value : value; } -RefPtr Parser::parse_builtin_or_dynamic_value(ParsingContext const& context, StyleComponentValueRule const& component_value) +RefPtr Parser::parse_builtin_value(ParsingContext const&, StyleComponentValueRule const& component_value) { if (component_value.is(Token::Type::Ident)) { auto ident = component_value.token().ident(); @@ -1410,6 +1410,11 @@ RefPtr Parser::parse_builtin_or_dynamic_value(ParsingContext const& // FIXME: Implement `unset` keyword } + return {}; +} + +RefPtr Parser::parse_dynamic_value(ParsingContext const& context, StyleComponentValueRule const& component_value) +{ if (component_value.is_function()) { auto& function = component_value.function(); @@ -2766,6 +2771,11 @@ RefPtr Parser::parse_css_value(PropertyID property_id, TokenStream Parser::parse_css_value(ParsingContext const& context, Proper return LengthStyleValue::create(Length::make_px(strtof(string.characters(), nullptr))); } - if (auto builtin_or_dynamic = parse_builtin_or_dynamic_value(context, component_value)) - return builtin_or_dynamic; + if (auto builtin = parse_builtin_value(context, component_value)) + return builtin; + + if (auto dynamic = parse_dynamic_value(context, component_value)) + return dynamic; if (auto length = parse_length_value(context, component_value)) return length; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index f8d055410e..21fca4a7ac 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -168,7 +168,8 @@ private: static Optional parse_length(ParsingContext const&, StyleComponentValueRule const&); static Optional parse_url_function(ParsingContext const&, StyleComponentValueRule const&); - static RefPtr parse_builtin_or_dynamic_value(ParsingContext const&, StyleComponentValueRule const&); + static RefPtr parse_builtin_value(ParsingContext const&, StyleComponentValueRule const&); + static RefPtr parse_dynamic_value(ParsingContext const&, StyleComponentValueRule const&); static RefPtr parse_length_value(ParsingContext const&, StyleComponentValueRule const&); static RefPtr parse_numeric_value(ParsingContext const&, StyleComponentValueRule const&); static RefPtr parse_identifier_value(ParsingContext const&, StyleComponentValueRule const&);