From 93e2babc64d75c813c9e0fcd023ff335d33dd628 Mon Sep 17 00:00:00 2001 From: Gingeh <39150378+Gingeh@users.noreply.github.com> Date: Thu, 27 Feb 2025 16:11:29 +1100 Subject: [PATCH] LibWeb: Prevent crash when loading module in worker The import map is defined for all global objects, not just the window. --- Libraries/LibWeb/HTML/Scripting/Fetching.cpp | 2 +- Libraries/LibWeb/HTML/UniversalGlobalScope.h | 8 ++++++++ Libraries/LibWeb/HTML/Window.h | 8 -------- Tests/LibWeb/Text/input/Worker/worker.mjs | 2 ++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Libraries/LibWeb/HTML/Scripting/Fetching.cpp b/Libraries/LibWeb/HTML/Scripting/Fetching.cpp index 6cb7b3ea70e..c1ce4bfda09 100644 --- a/Libraries/LibWeb/HTML/Scripting/Fetching.cpp +++ b/Libraries/LibWeb/HTML/Scripting/Fetching.cpp @@ -317,7 +317,7 @@ ScriptFetchOptions get_descendant_script_fetch_options(ScriptFetchOptions const& String resolve_a_module_integrity_metadata(const URL::URL& url, EnvironmentSettingsObject& settings_object) { // 1. Let map be settingsObject's global object's import map. - auto map = as(settings_object.global_object()).import_map(); + auto map = as(settings_object.global_object()).import_map(); // 2. If map's integrity[url] does not exist, then return the empty string. // 3. Return map's integrity[url]. diff --git a/Libraries/LibWeb/HTML/UniversalGlobalScope.h b/Libraries/LibWeb/HTML/UniversalGlobalScope.h index df860fe1744..d7e8dd015d9 100644 --- a/Libraries/LibWeb/HTML/UniversalGlobalScope.h +++ b/Libraries/LibWeb/HTML/UniversalGlobalScope.h @@ -45,6 +45,10 @@ public: void notify_about_rejected_promises(Badge); + ImportMap& import_map() { return m_import_map; } + ImportMap const& import_map() const { return m_import_map; } + void set_import_map(ImportMap const& import_map) { m_import_map = import_map; } + protected: void visit_edges(GC::Cell::Visitor&); @@ -61,6 +65,10 @@ private: // https://html.spec.whatwg.org/multipage/webappapis.html#outstanding-rejected-promises-weak-set // The outstanding rejected promises weak set must not create strong references to any of its members, and implementations are free to limit its size, e.g. by removing old entries from it when new ones are added. Vector> m_outstanding_rejected_promises_weak_set; + + // https://html.spec.whatwg.org/multipage/webappapis.html#concept-global-import-map + // A global object has an import map, initially an empty import map. + ImportMap m_import_map; }; } diff --git a/Libraries/LibWeb/HTML/Window.h b/Libraries/LibWeb/HTML/Window.h index 87f36ba038b..cc3b2c93ace 100644 --- a/Libraries/LibWeb/HTML/Window.h +++ b/Libraries/LibWeb/HTML/Window.h @@ -114,10 +114,6 @@ public: GC::Ptr navigable() const; - ImportMap& import_map() { return m_import_map; } - ImportMap const& import_map() const { return m_import_map; } - void set_import_map(ImportMap const& import_map) { m_import_map = import_map; } - void append_resolved_module(SpecifierResolution resolution) { m_resolved_module_set.append(move(resolution)); } Vector const& resolved_module_set() const { return m_resolved_module_set; } @@ -288,10 +284,6 @@ private: GC::Ptr m_current_event; - // https://html.spec.whatwg.org/multipage/webappapis.html#concept-global-import-map - // A global object has an import map, initially an empty import map. - ImportMap m_import_map; - // https://html.spec.whatwg.org/multipage/webappapis.html#resolved-module-set // A global object has a resolved module set, a set of specifier resolution records, initially empty. // diff --git a/Tests/LibWeb/Text/input/Worker/worker.mjs b/Tests/LibWeb/Text/input/Worker/worker.mjs index 6086d143b60..c18a2e7da0a 100644 --- a/Tests/LibWeb/Text/input/Worker/worker.mjs +++ b/Tests/LibWeb/Text/input/Worker/worker.mjs @@ -1,3 +1,5 @@ +import "./worker.mjs"; + self.onmessage = ({ data }) => { self.postMessage(`Worker responding to: ${data}`); };