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 aedb2668942..f180736878f 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 273f8a742ae..cf41bef7b30 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 0af9dc79e27..2735778f1d2 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 80715887d4e..c5305d6f53d 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 {};