diff --git a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp index 91c269c46cd..69658f73123 100644 --- a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp +++ b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Andreas Kling + * Copyright (c) 2021-2022, Andreas Kling * Copyright (c) 2021, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause @@ -307,12 +307,27 @@ JS::VM& main_thread_vm() // NOTE: We push a dummy execution context onto the JS execution context stack, // just to make sure that it's never empty. auto& custom_data = *verify_cast(vm->custom_data()); - custom_data.root_execution_context = make(vm->heap()); + custom_data.root_execution_context = MUST(JS::Realm::initialize_host_defined_realm( + *vm, [&](JS::Realm& realm) -> JS::GlobalObject* { + auto internal_window = HTML::Window::create(); + custom_data.internal_window_object = JS::make_handle(vm->heap().allocate(realm, realm, internal_window)); + return custom_data.internal_window_object.cell(); }, + [](JS::Realm&) -> JS::GlobalObject* { + return nullptr; + })); + vm->push_execution_context(*custom_data.root_execution_context); } return *vm; } +Bindings::WindowObject& main_thread_internal_window_object() +{ + auto& vm = main_thread_vm(); + auto& custom_data = verify_cast(*vm.custom_data()); + return *custom_data.internal_window_object; +} + // https://dom.spec.whatwg.org/#queue-a-mutation-observer-compound-microtask void queue_mutation_observer_microtask(DOM::Document& document) { diff --git a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h index 83a15a414de..88a473e7713 100644 --- a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h +++ b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Andreas Kling + * Copyright (c) 2021-2022, Andreas Kling * Copyright (c) 2021, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,10 @@ struct WebEngineCustomData final : public JS::VM::CustomData { NonnullRefPtrVector mutation_observers; OwnPtr root_execution_context; + + // This object is used as the global object for GC-allocated objects that don't + // belong to a web-facing global object. + JS::Handle internal_window_object; }; struct WebEngineCustomJobCallbackData final : public JS::JobCallback::CustomData { @@ -48,6 +53,7 @@ struct WebEngineCustomJobCallbackData final : public JS::JobCallback::CustomData HTML::ClassicScript* active_script(); JS::VM& main_thread_vm(); +Bindings::WindowObject& main_thread_internal_window_object(); void queue_mutation_observer_microtask(DOM::Document&); NonnullOwnPtr create_a_new_javascript_realm(JS::VM&, Function create_global_object, Function create_global_this_value);