diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp index d1aad171fcc..93aeaa0ec57 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp +++ b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp @@ -33,10 +33,18 @@ EnvironmentSettingsObject::~EnvironmentSettingsObject() responsible_event_loop().unregister_environment_settings_object({}, *this); } +JS::ThrowCompletionOr EnvironmentSettingsObject::initialize(JS::Realm& realm) +{ + MUST_OR_THROW_OOM(Base::initialize(realm)); + m_module_map = realm.heap().allocate_without_realm(); + return {}; +} + void EnvironmentSettingsObject::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(target_browsing_context); + visitor.visit(m_module_map); visitor.ignore(m_outstanding_rejected_promises_weak_set); } @@ -48,7 +56,7 @@ JS::ExecutionContext& EnvironmentSettingsObject::realm_execution_context() ModuleMap& EnvironmentSettingsObject::module_map() { - return m_module_map; + return *m_module_map; } // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object%27s-realm diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h index d2a7bec3056..8652345dfb6 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h +++ b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h @@ -60,6 +60,7 @@ struct EnvironmentSettingsObject JS_CELL(EnvironmentSettingsObject, JS::Cell); virtual ~EnvironmentSettingsObject() override; + virtual JS::ThrowCompletionOr initialize(JS::Realm&) override; // https://html.spec.whatwg.org/multipage/webappapis.html#concept-environment-target-browsing-context JS::ExecutionContext& realm_execution_context(); @@ -124,7 +125,7 @@ protected: private: NonnullOwnPtr m_realm_execution_context; - ModuleMap m_module_map; + JS::GCPtr m_module_map; EventLoop* m_responsible_event_loop { nullptr }; diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.cpp b/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.cpp index db2642589d2..c3874207383 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.cpp +++ b/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.cpp @@ -8,6 +8,14 @@ namespace Web::HTML { +void ModuleMap::visit_edges(Visitor& visitor) +{ + Base::visit_edges(visitor); + for (auto& it : m_values) { + visitor.visit(it.value.module_script); + } +} + bool ModuleMap::is_fetching(AK::URL const& url, DeprecatedString const& type) const { return is(url, type, EntryType::Fetching); diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.h b/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.h index 12780e8692b..fef5b2a4291 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.h +++ b/Userland/Libraries/LibWeb/HTML/Scripting/ModuleMap.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include namespace Web::HTML { @@ -33,8 +34,8 @@ private: }; // https://html.spec.whatwg.org/multipage/webappapis.html#module-map -class ModuleMap { - AK_MAKE_NONCOPYABLE(ModuleMap); +class ModuleMap final : public JS::Cell { + JS_CELL(ModuleMap, Cell); public: ModuleMap() = default; @@ -63,6 +64,8 @@ public: void wait_for_change(AK::URL const& url, DeprecatedString const& type, Function callback); private: + virtual void visit_edges(JS::Cell::Visitor&) override; + HashMap m_values; HashMap>> m_callbacks; };