diff --git a/Userland/Libraries/LibJS/Runtime/Realm.h b/Userland/Libraries/LibJS/Runtime/Realm.h index ff492777380..2ea3728e30d 100644 --- a/Userland/Libraries/LibJS/Runtime/Realm.h +++ b/Userland/Libraries/LibJS/Runtime/Realm.h @@ -48,6 +48,8 @@ public: } HostDefined* host_defined() { return m_host_defined; } + HostDefined const* host_defined() const { return m_host_defined; } + void set_host_defined(OwnPtr host_defined) { m_host_defined = move(host_defined); } void define_builtin(Bytecode::Builtin builtin, NonnullGCPtr value) diff --git a/Userland/Libraries/LibWeb/Bindings/HostDefined.h b/Userland/Libraries/LibWeb/Bindings/HostDefined.h index 54f49ffe4ce..911df1b09c4 100644 --- a/Userland/Libraries/LibWeb/Bindings/HostDefined.h +++ b/Userland/Libraries/LibWeb/Bindings/HostDefined.h @@ -33,6 +33,11 @@ struct HostDefined : public JS::Realm::HostDefined { return *verify_cast(realm.host_defined())->environment_settings_object; } +[[nodiscard]] inline HTML::EnvironmentSettingsObject const& host_defined_environment_settings_object(JS::Realm const& realm) +{ + return *verify_cast(realm.host_defined())->environment_settings_object; +} + [[nodiscard]] inline Page& host_defined_page(JS::Realm& realm) { return *verify_cast(realm.host_defined())->page; diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp index eebfc7678dc..6d38fffaa8c 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp +++ b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.cpp @@ -65,6 +65,12 @@ JS::ExecutionContext& EnvironmentSettingsObject::realm_execution_context() return *m_realm_execution_context; } +JS::ExecutionContext const& EnvironmentSettingsObject::realm_execution_context() const +{ + // NOTE: All environment settings objects are created with a realm execution context, so it's stored and returned here in the base class. + return *m_realm_execution_context; +} + ModuleMap& EnvironmentSettingsObject::module_map() { return *m_module_map; @@ -124,6 +130,15 @@ void EnvironmentSettingsObject::prepare_to_run_script() // FIXME: 2. Add settings to the currently running task's script evaluation environment settings object set. } +// https://whatpr.org/html/9893/b8ea975...df5706b/webappapis.html#concept-realm-execution-context +JS::ExecutionContext const& execution_context_of_realm(JS::Realm const& realm) +{ + // FIXME: 1. If realm is a principal realm, then return the realm execution context of the environment settings object of realm. + // FIXME: 2. Assert: realm is a synthetic realm. + // FIXME: 3. Return the execution context of the synthetic realm settings object of realm. + return Bindings::host_defined_environment_settings_object(realm).realm_execution_context(); +} + // https://html.spec.whatwg.org/multipage/webappapis.html#clean-up-after-running-script void EnvironmentSettingsObject::clean_up_after_running_script() { diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h index 7723f0637e9..dfbbe9d97fe 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h +++ b/Userland/Libraries/LibWeb/HTML/Scripting/Environments.h @@ -63,6 +63,7 @@ public: // https://html.spec.whatwg.org/multipage/webappapis.html#concept-environment-target-browsing-context JS::ExecutionContext& realm_execution_context(); + JS::ExecutionContext const& realm_execution_context() const; // https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-module-map ModuleMap& module_map(); @@ -135,6 +136,8 @@ private: bool m_discarded { false }; }; +JS::ExecutionContext const& execution_context_of_realm(JS::Realm const&); + RunScriptDecision can_run_script(JS::Realm const&); bool is_scripting_enabled(JS::Realm const&); bool is_scripting_disabled(JS::Realm const&);