From 1033bf5cd2c7f3893d0f4d5d7972ed94e77c3b64 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Tue, 8 Apr 2025 16:50:51 +0100 Subject: [PATCH] LibWeb/CSS: Allow CSSImportRule's document to be null on construction It's possible to parse an `@import` rule that isn't attached to a document. We only actually need it to have one when fetching the linked style sheet, and that should only happen when the CSSImportRule is attached to a document. So, we can just accept a null pointer when constructing it. We relied on that Document to get the Realm, so pass that in as a separate parameter. --- Libraries/LibWeb/CSS/CSSImportRule.cpp | 11 +++++------ Libraries/LibWeb/CSS/CSSImportRule.h | 4 ++-- Libraries/LibWeb/CSS/Parser/RuleParsing.cpp | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Libraries/LibWeb/CSS/CSSImportRule.cpp b/Libraries/LibWeb/CSS/CSSImportRule.cpp index 7e20b09ea3c..adac6310417 100644 --- a/Libraries/LibWeb/CSS/CSSImportRule.cpp +++ b/Libraries/LibWeb/CSS/CSSImportRule.cpp @@ -23,17 +23,16 @@ namespace Web::CSS { GC_DEFINE_ALLOCATOR(CSSImportRule); -GC::Ref CSSImportRule::create(::URL::URL url, DOM::Document& document, RefPtr supports, Vector> media_query_list) +GC::Ref CSSImportRule::create(JS::Realm& realm, ::URL::URL url, GC::Ptr document, RefPtr supports, Vector> media_query_list) { - auto& realm = document.realm(); - return realm.create(move(url), document, supports, move(media_query_list)); + return realm.create(realm, move(url), document, move(supports), move(media_query_list)); } -CSSImportRule::CSSImportRule(::URL::URL url, DOM::Document& document, RefPtr supports, Vector> media_query_list) - : CSSRule(document.realm(), Type::Import) +CSSImportRule::CSSImportRule(JS::Realm& realm, ::URL::URL url, GC::Ptr document, RefPtr supports, Vector> media_query_list) + : CSSRule(realm, Type::Import) , m_url(move(url)) , m_document(document) - , m_supports(supports) + , m_supports(move(supports)) , m_media_query_list(move(media_query_list)) { } diff --git a/Libraries/LibWeb/CSS/CSSImportRule.h b/Libraries/LibWeb/CSS/CSSImportRule.h index 4426b156787..72df3a1d2cb 100644 --- a/Libraries/LibWeb/CSS/CSSImportRule.h +++ b/Libraries/LibWeb/CSS/CSSImportRule.h @@ -21,7 +21,7 @@ class CSSImportRule final GC_DECLARE_ALLOCATOR(CSSImportRule); public: - [[nodiscard]] static GC::Ref create(::URL::URL, DOM::Document&, RefPtr, Vector>); + [[nodiscard]] static GC::Ref create(JS::Realm&, ::URL::URL, GC::Ptr, RefPtr, Vector>); virtual ~CSSImportRule() = default; @@ -37,7 +37,7 @@ public: Optional supports_text() const; private: - CSSImportRule(::URL::URL, DOM::Document&, RefPtr, Vector>); + CSSImportRule(JS::Realm&, ::URL::URL, GC::Ptr, RefPtr, Vector>); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; diff --git a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp index 4f511e1ade5..aed7a88923b 100644 --- a/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/RuleParsing.cpp @@ -198,7 +198,7 @@ GC::Ptr Parser::convert_to_import_rule(AtRule const& rule) return {}; } - return CSSImportRule::create(resolved_url.release_value(), const_cast(*document()), supports, move(media_query_list)); + return CSSImportRule::create(realm(), resolved_url.release_value(), const_cast(m_document.ptr()), supports, move(media_query_list)); } Optional Parser::parse_layer_name(TokenStream& tokens, AllowBlankLayerName allow_blank_layer_name)