Serenity Operating System
at master 129 lines 6.0 kB view raw
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}