From 189d1e8291ceea553154d73085fc6f87ce94abac Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 1 Dec 2023 13:36:40 +0100 Subject: [PATCH] LibWeb: Port CSSNamespaceRule to FlyString This removes a performance problem where we'd convert the style sheet's default namespace from DeprecatedFlyString to FlyString once per rule during selector matching. The conversion now happens once, during CSS parse. It should eventually be removed from there as well, but one step at a time. :^) --- .../Libraries/LibWeb/CSS/CSSNamespaceRule.cpp | 10 +++++----- Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.h | 16 ++++++++-------- Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp | 6 +++--- Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 10 +++++----- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.cpp index aedb266894..f180736878 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.cpp @@ -16,16 +16,16 @@ namespace Web::CSS { JS_DEFINE_ALLOCATOR(CSSNamespaceRule); -CSSNamespaceRule::CSSNamespaceRule(JS::Realm& realm, Optional prefix, StringView namespace_uri) +CSSNamespaceRule::CSSNamespaceRule(JS::Realm& realm, Optional prefix, FlyString namespace_uri) : CSSRule(realm) - , m_namespace_uri(namespace_uri) - , m_prefix(prefix.value_or(""sv)) + , m_namespace_uri(move(namespace_uri)) + , m_prefix(prefix.value_or(""_fly_string)) { } -JS::NonnullGCPtr CSSNamespaceRule::create(JS::Realm& realm, Optional prefix, AK::StringView namespace_uri) +JS::NonnullGCPtr CSSNamespaceRule::create(JS::Realm& realm, Optional prefix, FlyString namespace_uri) { - return realm.heap().allocate(realm, realm, prefix, namespace_uri); + return realm.heap().allocate(realm, realm, move(prefix), move(namespace_uri)); } void CSSNamespaceRule::initialize(JS::Realm& realm) diff --git a/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.h b/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.h index 273f8a742a..cf41bef7b3 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSNamespaceRule.h @@ -15,24 +15,24 @@ class CSSNamespaceRule final : public CSSRule { JS_DECLARE_ALLOCATOR(CSSNamespaceRule); public: - [[nodiscard]] static JS::NonnullGCPtr create(JS::Realm&, Optional prefix, StringView namespace_uri); + [[nodiscard]] static JS::NonnullGCPtr create(JS::Realm&, Optional prefix, FlyString namespace_uri); virtual ~CSSNamespaceRule() = default; - void set_namespace_uri(DeprecatedString value) { m_namespace_uri = move(value); } - DeprecatedString namespace_uri() const { return m_namespace_uri; } - void set_prefix(DeprecatedString value) { m_prefix = move(value); } - DeprecatedString prefix() const { return m_prefix; } + void set_namespace_uri(FlyString value) { m_namespace_uri = move(value); } + FlyString const& namespace_uri() const { return m_namespace_uri; } + void set_prefix(FlyString value) { m_prefix = move(value); } + FlyString const& prefix() const { return m_prefix; } virtual Type type() const override { return Type::Namespace; } private: - CSSNamespaceRule(JS::Realm&, Optional prefix, StringView namespace_uri); + CSSNamespaceRule(JS::Realm&, Optional prefix, FlyString namespace_uri); virtual void initialize(JS::Realm&) override; virtual String serialized() const override; - DeprecatedString m_namespace_uri; - DeprecatedString m_prefix; + FlyString m_namespace_uri; + FlyString m_prefix; }; } diff --git a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp index 0af9dc79e2..2735778f1d 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSStyleSheet.cpp @@ -149,7 +149,7 @@ void CSSStyleSheet::set_style_sheet_list(Badge, StyleSheetList* Optional CSSStyleSheet::default_namespace() const { if (m_default_namespace_rule) - return MUST(FlyString::from_deprecated_fly_string(m_default_namespace_rule->namespace_uri())); + return m_default_namespace_rule->namespace_uri(); return {}; } @@ -158,7 +158,7 @@ Optional CSSStyleSheet::namespace_uri(StringView namespace_prefix) co { return m_namespace_rules.get(namespace_prefix) .map([](JS::GCPtr namespace_) { - return MUST(FlyString::from_deprecated_fly_string(namespace_->namespace_uri())); + return namespace_->namespace_uri(); }); } @@ -189,7 +189,7 @@ void CSSStyleSheet::recalculate_namespaces() if (!namespace_rule.namespace_uri().is_empty() && namespace_rule.prefix().is_empty()) m_default_namespace_rule = namespace_rule; - m_namespace_rules.set(FlyString::from_deprecated_fly_string(namespace_rule.prefix()).release_value_but_fixme_should_propagate_errors(), namespace_rule); + m_namespace_rules.set(namespace_rule.prefix(), namespace_rule); } } diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 80715887d4..c5305d6f53 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -1358,18 +1358,18 @@ CSSRule* Parser::convert_to_rule(NonnullRefPtr rule) token_stream.skip_whitespace(); auto token = token_stream.next_token(); - Optional prefix = {}; + Optional prefix = {}; if (token.is(Token::Type::Ident)) { - prefix = token.token().ident().bytes_as_string_view(); + prefix = token.token().ident(); token_stream.skip_whitespace(); token = token_stream.next_token(); } - DeprecatedString namespace_uri; + FlyString namespace_uri; if (token.is(Token::Type::String)) { - namespace_uri = token.token().string(); + namespace_uri = MUST(FlyString::from_utf8(token.token().string())); } else if (auto url = parse_url_function(token); url.has_value()) { - namespace_uri = url.value().to_deprecated_string(); + namespace_uri = MUST(FlyString::from_deprecated_fly_string(url.value().to_deprecated_string())); } else { dbgln_if(CSS_PARSER_DEBUG, "CSSParser: @namespace rule invalid; discarding."); return {};