From 3f13a50a209ceb88c1e77a434572a57f8fab4e7e Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Tue, 7 Nov 2023 00:22:33 +1300 Subject: [PATCH] LibWeb: Return FlyString from CSS::Parser::Token::ident Instead of a StringView. This allows us to preserve the nice O(1) string compare property of FlyString, and not needing to allocate when one is needed. Ideally all other places in Token should have similar changes done, but to prevent a huge amount of churn, just change ident for now. --- .../LibWeb/CSS/Parser/MediaParsing.cpp | 6 +++--- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 10 +++++----- .../LibWeb/CSS/Parser/SelectorParsing.cpp | 18 +++++++++--------- Userland/Libraries/LibWeb/CSS/Parser/Token.h | 4 ++-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp b/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp index 3ad57a575d..16373fdc3f 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/MediaParsing.cpp @@ -261,12 +261,12 @@ Optional Parser::parse_media_feature(TokenStream& return MediaFeatureName { MediaFeatureName::Type::Normal, id.value() }; } - if (allow_min_max_prefix && (name.starts_with("min-"sv, CaseSensitivity::CaseInsensitive) || name.starts_with("max-"sv, CaseSensitivity::CaseInsensitive))) { - auto adjusted_name = name.substring_view(4); + if (allow_min_max_prefix && (name.starts_with_bytes("min-"sv, CaseSensitivity::CaseInsensitive) || name.starts_with_bytes("max-"sv, CaseSensitivity::CaseInsensitive))) { + auto adjusted_name = name.bytes_as_string_view().substring_view(4); if (auto id = media_feature_id_from_string(adjusted_name); id.has_value() && media_feature_type_is_range(id.value())) { transaction.commit(); return MediaFeatureName { - name.starts_with("min-"sv, CaseSensitivity::CaseInsensitive) ? MediaFeatureName::Type::Min : MediaFeatureName::Type::Max, + name.starts_with_bytes("min-"sv, CaseSensitivity::CaseInsensitive) ? MediaFeatureName::Type::Min : MediaFeatureName::Type::Max, id.value() }; } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 421e83cb46..0136a9b3cd 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1574,7 +1574,7 @@ CSSRule* Parser::convert_to_rule(NonnullRefPtr rule) auto token = token_stream.next_token(); Optional prefix = {}; if (token.is(Token::Type::Ident)) { - prefix = token.token().ident(); + prefix = token.token().ident().bytes_as_string_view(); token_stream.skip_whitespace(); token = token_stream.next_token(); } @@ -2446,7 +2446,7 @@ Optional Parser::parse_color(ComponentValue const& component_value) else { if (!cv.is(Token::Type::Ident)) return {}; - serialization = cv.token().ident(); + serialization = cv.token().ident().bytes_as_string_view(); } // 4. If serialization does not consist of three or six characters, return an error. @@ -4178,7 +4178,7 @@ RefPtr Parser::parse_font_family_value(TokenStream& (void)tokens.next_token(); // Comma continue; } - current_name_parts.append(tokens.next_token().token().ident()); + current_name_parts.append(tokens.next_token().token().ident().bytes_as_string_view()); continue; } @@ -4270,7 +4270,7 @@ CSSRule* Parser::parse_font_face_rule(TokenStream& tokens) had_syntax_error = true; break; } - font_family_parts.append(part.token().ident()); + font_family_parts.append(part.token().ident().bytes_as_string_view()); continue; } @@ -6800,7 +6800,7 @@ bool Parser::expand_variables(DOM::Element& element, Optional Parser::parse_a_n_plus_b_patt if (!value.is(Token::Type::Ident)) return false; auto ident = value.token().ident(); - if (!ident.starts_with("n-"sv, CaseSensitivity::CaseInsensitive)) + if (!ident.starts_with_bytes("n-"sv, CaseSensitivity::CaseInsensitive)) return false; - for (size_t i = 2; i < ident.length(); ++i) { - if (!is_ascii_digit(ident[i])) + for (size_t i = 2; i < ident.bytes_as_string_view().length(); ++i) { + if (!is_ascii_digit(ident.bytes_as_string_view()[i])) return false; } return true; @@ -741,12 +741,12 @@ Optional Parser::parse_a_n_plus_b_patt if (!value.is(Token::Type::Ident)) return false; auto ident = value.token().ident(); - if (!ident.starts_with("-n-"sv, CaseSensitivity::CaseInsensitive)) + if (!ident.starts_with_bytes("-n-"sv, CaseSensitivity::CaseInsensitive)) return false; - if (ident.length() == 3) + if (ident.bytes_as_string_view().length() == 3) return false; - for (size_t i = 3; i < ident.length(); ++i) { - if (!is_ascii_digit(ident[i])) + for (size_t i = 3; i < ident.bytes_as_string_view().length(); ++i) { + if (!is_ascii_digit(ident.bytes_as_string_view()[i])) return false; } return true; @@ -844,7 +844,7 @@ Optional Parser::parse_a_n_plus_b_patt } // if (is_dashndashdigit_ident(first_value)) { - auto maybe_b = first_value.token().ident().substring_view(2).to_int(); + auto maybe_b = first_value.token().ident().bytes_as_string_view().substring_view(2).to_int(); if (maybe_b.has_value()) { transaction.commit(); return Selector::SimpleSelector::ANPlusBPattern { -1, maybe_b.value() }; @@ -957,7 +957,7 @@ Optional Parser::parse_a_n_plus_b_patt // '+'?† if (is_ndashdigit_ident(first_after_plus)) { - auto maybe_b = first_after_plus.token().ident().substring_view(1).to_int(); + auto maybe_b = first_after_plus.token().ident().bytes_as_string_view().substring_view(1).to_int(); if (maybe_b.has_value()) { transaction.commit(); return Selector::SimpleSelector::ANPlusBPattern { 1, maybe_b.value() }; diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Token.h b/Userland/Libraries/LibWeb/CSS/Parser/Token.h index f205b9ff39..426e36374f 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Token.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Token.h @@ -59,10 +59,10 @@ public: Type type() const { return m_type; } bool is(Type type) const { return m_type == type; } - StringView ident() const + FlyString const& ident() const { VERIFY(m_type == Type::Ident); - return m_value.bytes_as_string_view(); + return m_value; } StringView function() const