Przeglądaj źródła

LibWeb: Introduce a SyntheticHostDefined class

This class is the host defined field of a synthetic realm created as
part of a shadow realm.
Shannon Booth 8 miesięcy temu
rodzic
commit
b105c06824

+ 20 - 0
Userland/Libraries/LibWeb/Bindings/SyntheticHostDefined.cpp

@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibJS/Heap/Cell.h>
+#include <LibJS/Runtime/Realm.h>
+#include <LibWeb/Bindings/SyntheticHostDefined.h>
+#include <LibWeb/HTML/Scripting/Environments.h>
+
+namespace Web::Bindings {
+
+void SyntheticHostDefined::visit_edges(JS::Cell::Visitor& visitor)
+{
+    JS::Realm::HostDefined::visit_edges(visitor);
+    synthetic_realm_settings.visit_edges(visitor);
+}
+
+}

+ 27 - 0
Userland/Libraries/LibWeb/Bindings/SyntheticHostDefined.h

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Runtime/Realm.h>
+#include <LibWeb/Forward.h>
+#include <LibWeb/HTML/Scripting/SyntheticRealmSettings.h>
+
+namespace Web::Bindings {
+
+struct SyntheticHostDefined : public JS::Realm::HostDefined {
+    SyntheticHostDefined(HTML::SyntheticRealmSettings synthetic_realm_settings)
+        : synthetic_realm_settings(move(synthetic_realm_settings))
+    {
+    }
+
+    virtual ~SyntheticHostDefined() override = default;
+    virtual void visit_edges(JS::Cell::Visitor& visitor) override;
+
+    HTML::SyntheticRealmSettings synthetic_realm_settings;
+};
+
+}

+ 2 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -23,6 +23,7 @@ set(SOURCES
     Bindings/OptionConstructor.cpp
     Bindings/OptionConstructor.cpp
     Bindings/PlatformObject.cpp
     Bindings/PlatformObject.cpp
     Bindings/PrincipalHostDefined.cpp
     Bindings/PrincipalHostDefined.cpp
+    Bindings/SyntheticHostDefined.cpp
     Clipboard/Clipboard.cpp
     Clipboard/Clipboard.cpp
     Clipboard/ClipboardEvent.cpp
     Clipboard/ClipboardEvent.cpp
     Crypto/Crypto.cpp
     Crypto/Crypto.cpp
@@ -449,6 +450,7 @@ set(SOURCES
     HTML/Scripting/ModuleMap.cpp
     HTML/Scripting/ModuleMap.cpp
     HTML/Scripting/ModuleScript.cpp
     HTML/Scripting/ModuleScript.cpp
     HTML/Scripting/Script.cpp
     HTML/Scripting/Script.cpp
+    HTML/Scripting/SyntheticRealmSettings.cpp
     HTML/Scripting/TemporaryExecutionContext.cpp
     HTML/Scripting/TemporaryExecutionContext.cpp
     HTML/Scripting/WindowEnvironmentSettingsObject.cpp
     HTML/Scripting/WindowEnvironmentSettingsObject.cpp
     HTML/Scripting/WorkerEnvironmentSettingsObject.cpp
     HTML/Scripting/WorkerEnvironmentSettingsObject.cpp

+ 2 - 0
Userland/Libraries/LibWeb/Forward.h

@@ -491,6 +491,7 @@ class MessageEvent;
 class MessagePort;
 class MessagePort;
 class MimeType;
 class MimeType;
 class MimeTypeArray;
 class MimeTypeArray;
+class ModuleMap;
 class Navigable;
 class Navigable;
 class NavigableContainer;
 class NavigableContainer;
 class NavigateEvent;
 class NavigateEvent;
@@ -555,6 +556,7 @@ struct ScrollOptions;
 struct ScrollToOptions;
 struct ScrollToOptions;
 struct SerializedFormData;
 struct SerializedFormData;
 struct StructuredSerializeOptions;
 struct StructuredSerializeOptions;
+struct SyntheticRealmSettings;
 struct ToggleTaskTracker;
 struct ToggleTaskTracker;
 struct TransferDataHolder;
 struct TransferDataHolder;
 }
 }

+ 20 - 0
Userland/Libraries/LibWeb/HTML/Scripting/SyntheticRealmSettings.cpp

@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/HTML/Scripting/ModuleMap.h>
+#include <LibWeb/HTML/Scripting/SyntheticRealmSettings.h>
+
+namespace Web::HTML {
+
+void SyntheticRealmSettings::visit_edges(JS::Cell::Visitor& visitor)
+{
+    execution_context->visit_edges(visitor);
+    visitor.visit(principal_realm);
+    visitor.visit(underlying_realm);
+    visitor.visit(module_map);
+}
+
+}

+ 37 - 0
Userland/Libraries/LibWeb/HTML/Scripting/SyntheticRealmSettings.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2024, Shannon Booth <shannon@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Forward.h>
+#include <LibJS/Heap/GCPtr.h>
+#include <LibWeb/Forward.h>
+
+namespace Web::HTML {
+
+// https://whatpr.org/html/9893/webappapis.html#synthetic-realm-settings-objects
+// Each synthetic realm has an associated synthetic realm settings object with the following fields:
+struct SyntheticRealmSettings {
+    // An execution context
+    // The JavaScript execution context for the scripts within this realm.
+    NonnullOwnPtr<JS::ExecutionContext> execution_context;
+
+    // A principal realm
+    // The principal realm which this synthetic realm exists within.
+    JS::NonnullGCPtr<JS::Realm> principal_realm;
+
+    // An underlying realm
+    // The synthetic realm which this settings object represents.
+    JS::NonnullGCPtr<JS::Realm> underlying_realm;
+
+    // A module map
+    // A module map that is used when importing JavaScript modules.
+    JS::NonnullGCPtr<ModuleMap> module_map;
+
+    void visit_edges(JS::Cell::Visitor&);
+};
+
+}