diff --git a/Userland/Libraries/LibWeb/Bindings/HostDefined.cpp b/Userland/Libraries/LibWeb/Bindings/HostDefined.cpp new file mode 100644 index 00000000000..95487e8c11b --- /dev/null +++ b/Userland/Libraries/LibWeb/Bindings/HostDefined.cpp @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::Bindings { + +void HostDefined::visit_edges(JS::Cell::Visitor& visitor) +{ + JS::Realm::HostDefined::visit_edges(visitor); + visitor.visit(intrinsics); +} + +} diff --git a/Userland/Libraries/LibWeb/Bindings/HostDefined.h b/Userland/Libraries/LibWeb/Bindings/HostDefined.h new file mode 100644 index 00000000000..89c564418ea --- /dev/null +++ b/Userland/Libraries/LibWeb/Bindings/HostDefined.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024, Shannon Booth + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::Bindings { + +struct HostDefined : public JS::Realm::HostDefined { + explicit HostDefined(JS::NonnullGCPtr intrinsics) + : intrinsics(intrinsics) + { + } + virtual ~HostDefined() override = default; + virtual void visit_edges(JS::Cell::Visitor& visitor) override; + + JS::NonnullGCPtr intrinsics; +}; + +} diff --git a/Userland/Libraries/LibWeb/Bindings/Intrinsics.cpp b/Userland/Libraries/LibWeb/Bindings/Intrinsics.cpp index 21f0d8aaa62..61fc83d386d 100644 --- a/Userland/Libraries/LibWeb/Bindings/Intrinsics.cpp +++ b/Userland/Libraries/LibWeb/Bindings/Intrinsics.cpp @@ -10,6 +10,7 @@ #include #include #include +#include namespace Web::Bindings { @@ -32,7 +33,7 @@ bool Intrinsics::is_exposed(StringView name) const Intrinsics& host_defined_intrinsics(JS::Realm& realm) { VERIFY(realm.host_defined()); - return verify_cast(*realm.host_defined()).intrinsics; + return verify_cast(*realm.host_defined()).intrinsics; } } diff --git a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp index 5d3a54d7e41..964e9053002 100644 --- a/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp +++ b/Userland/Libraries/LibWeb/Bindings/MainThreadVM.cpp @@ -589,13 +589,13 @@ ErrorOr initialize_main_thread_vm(HTML::EventLoop::Type type) }; // 8. Set realm.[[HostDefined]] to settings. - realm.set_host_defined(make(move(settings))); + realm.set_host_defined(make(move(settings), realm.heap().allocate(realm, realm))); // 9. Set realm.[[GlobalObject]] to globalObject. realm.set_global_object(global_object); // 10. Set realm.[[GlobalEnv]] to NewGlobalEnvironment(globalObject, globalObject). - realm.set_global_environment(realm.vm().heap().allocate_without_realm(global_object, global_object)); + realm.set_global_environment(realm.heap().allocate_without_realm(global_object, global_object)); // 11. Perform ? SetDefaultGlobalBindings(realm). set_default_global_bindings(realm); diff --git a/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.cpp b/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.cpp index a5c2c60a51d..d76bc51deeb 100644 --- a/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.cpp +++ b/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.cpp @@ -15,9 +15,8 @@ namespace Web::Bindings { void PrincipalHostDefined::visit_edges(JS::Cell::Visitor& visitor) { - JS::Realm::HostDefined::visit_edges(visitor); + HostDefined::visit_edges(visitor); visitor.visit(environment_settings_object); - visitor.visit(intrinsics); visitor.visit(page); } diff --git a/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.h b/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.h index d0d465a0aba..c1f9df16564 100644 --- a/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.h +++ b/Userland/Libraries/LibWeb/Bindings/PrincipalHostDefined.h @@ -9,14 +9,15 @@ #include #include #include +#include #include namespace Web::Bindings { -struct PrincipalHostDefined : public JS::Realm::HostDefined { +struct PrincipalHostDefined : public HostDefined { PrincipalHostDefined(JS::NonnullGCPtr eso, JS::NonnullGCPtr intrinsics, JS::NonnullGCPtr page) - : environment_settings_object(eso) - , intrinsics(intrinsics) + : HostDefined(intrinsics) + , environment_settings_object(eso) , page(page) { } @@ -24,7 +25,6 @@ struct PrincipalHostDefined : public JS::Realm::HostDefined { virtual void visit_edges(JS::Cell::Visitor& visitor) override; JS::NonnullGCPtr environment_settings_object; - JS::NonnullGCPtr intrinsics; JS::NonnullGCPtr page; }; diff --git a/Userland/Libraries/LibWeb/Bindings/SyntheticHostDefined.h b/Userland/Libraries/LibWeb/Bindings/SyntheticHostDefined.h index f404dacb0fb..157298801c1 100644 --- a/Userland/Libraries/LibWeb/Bindings/SyntheticHostDefined.h +++ b/Userland/Libraries/LibWeb/Bindings/SyntheticHostDefined.h @@ -7,14 +7,16 @@ #pragma once #include +#include #include #include namespace Web::Bindings { -struct SyntheticHostDefined : public JS::Realm::HostDefined { - SyntheticHostDefined(HTML::SyntheticRealmSettings synthetic_realm_settings) - : synthetic_realm_settings(move(synthetic_realm_settings)) +struct SyntheticHostDefined : public HostDefined { + SyntheticHostDefined(HTML::SyntheticRealmSettings synthetic_realm_settings, JS::NonnullGCPtr intrinsics) + : HostDefined(intrinsics) + , synthetic_realm_settings(move(synthetic_realm_settings)) { } diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 1aa0ccba80f..62308100330 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -23,6 +23,7 @@ set(SOURCES Bindings/MainThreadVM.cpp Bindings/OptionConstructor.cpp Bindings/PlatformObject.cpp + Bindings/HostDefined.cpp Bindings/PrincipalHostDefined.cpp Bindings/SyntheticHostDefined.cpp Clipboard/Clipboard.cpp