Serenity Operating System
1/*
2 * Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibWeb/Bindings/HostDefined.h>
8#include <LibWeb/Bindings/Intrinsics.h>
9#include <LibWeb/DOM/Document.h>
10#include <LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h>
11#include <LibWeb/HTML/Window.h>
12
13namespace Web::HTML {
14
15WindowEnvironmentSettingsObject::WindowEnvironmentSettingsObject(Window& window, NonnullOwnPtr<JS::ExecutionContext> execution_context)
16 : EnvironmentSettingsObject(move(execution_context))
17 , m_window(window)
18{
19}
20
21WindowEnvironmentSettingsObject::~WindowEnvironmentSettingsObject() = default;
22
23void WindowEnvironmentSettingsObject::visit_edges(JS::Cell::Visitor& visitor)
24{
25 EnvironmentSettingsObject::visit_edges(visitor);
26 visitor.visit(m_window.ptr());
27}
28
29// https://html.spec.whatwg.org/multipage/window-object.html#set-up-a-window-environment-settings-object
30WebIDL::ExceptionOr<void> WindowEnvironmentSettingsObject::setup(AK::URL const& creation_url, NonnullOwnPtr<JS::ExecutionContext> execution_context, Optional<Environment> reserved_environment, AK::URL top_level_creation_url, Origin top_level_origin)
31{
32 // 1. Let realm be the value of execution context's Realm component.
33 auto* realm = execution_context->realm;
34 VERIFY(realm);
35
36 // 2. Let window be realm's global object.
37 auto& window = verify_cast<HTML::Window>(realm->global_object());
38
39 // 3. Let settings object be a new environment settings object whose algorithms are defined as follows:
40 // NOTE: See the functions defined for this class.
41 auto settings_object = MUST_OR_THROW_OOM(realm->heap().allocate<WindowEnvironmentSettingsObject>(*realm, window, move(execution_context)));
42
43 // 4. If reservedEnvironment is non-null, then:
44 if (reserved_environment.has_value()) {
45 // FIXME: 1. Set settings object's id to reservedEnvironment's id,
46 // target browsing context to reservedEnvironment's target browsing context,
47 // and active service worker to reservedEnvironment's active service worker.
48 settings_object->id = reserved_environment->id;
49 settings_object->target_browsing_context = reserved_environment->target_browsing_context;
50
51 // 2. Set reservedEnvironment's id to the empty string.
52 reserved_environment->id = DeprecatedString::empty();
53 }
54
55 // 5. Otherwise, ...
56 else {
57 // FIXME: ...set settings object's id to a new unique opaque string,
58 // settings object's target browsing context to null,
59 // and settings object's active service worker to null.
60 static i64 next_id = 1;
61 settings_object->id = DeprecatedString::number(next_id++);
62 settings_object->target_browsing_context = nullptr;
63 }
64
65 // 6. Set settings object's creation URL to creationURL,
66 // settings object's top-level creation URL to topLevelCreationURL,
67 // and settings object's top-level origin to topLevelOrigin.
68 settings_object->creation_url = creation_url;
69 settings_object->top_level_creation_url = top_level_creation_url;
70 settings_object->top_level_origin = top_level_origin;
71
72 // 7. Set realm's [[HostDefined]] field to settings object.
73 // Non-Standard: We store the ESO next to the web intrinsics in a custom HostDefined object
74 auto intrinsics = MUST_OR_THROW_OOM(realm->heap().allocate<Bindings::Intrinsics>(*realm, *realm));
75 auto host_defined = make<Bindings::HostDefined>(settings_object, intrinsics);
76 realm->set_host_defined(move(host_defined));
77
78 // Non-Standard: We cannot fully initialize window object until *after* the we set up
79 // the realm's [[HostDefined]] internal slot as the internal slot contains the web platform intrinsics
80 TRY(window.initialize_web_interfaces({}));
81
82 return {};
83}
84
85// https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:responsible-document
86JS::GCPtr<DOM::Document> WindowEnvironmentSettingsObject::responsible_document()
87{
88 // Return window's associated Document.
89 return m_window->associated_document();
90}
91
92// https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:api-url-character-encoding
93DeprecatedString WindowEnvironmentSettingsObject::api_url_character_encoding()
94{
95 // Return the current character encoding of window's associated Document.
96 return m_window->associated_document().encoding_or_default();
97}
98
99// https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:api-base-url
100AK::URL WindowEnvironmentSettingsObject::api_base_url()
101{
102 // Return the current base URL of window's associated Document.
103 return m_window->associated_document().base_url();
104}
105
106// https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:concept-settings-object-origin
107Origin WindowEnvironmentSettingsObject::origin()
108{
109 // Return the origin of window's associated Document.
110 return m_window->associated_document().origin();
111}
112
113// https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:concept-settings-object-policy-container
114PolicyContainer WindowEnvironmentSettingsObject::policy_container()
115{
116 // Return the policy container of window's associated Document.
117 return m_window->associated_document().policy_container();
118}
119
120// https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:concept-settings-object-cross-origin-isolated-capability
121CanUseCrossOriginIsolatedAPIs WindowEnvironmentSettingsObject::cross_origin_isolated_capability()
122{
123 // FIXME: Return true if both of the following hold, and false otherwise:
124 // 1. realm's agent cluster's cross-origin-isolation mode is "concrete", and
125 // 2. window's associated Document is allowed to use the "cross-origin-isolated" feature.
126 return CanUseCrossOriginIsolatedAPIs::Yes;
127}
128
129}