| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, Luke Wilde <lukew@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-24 15:39:23 -06:00
										 |  |  | #include <LibWeb/Bindings/HostDefined.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/Intrinsics.h>
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | #include <LibWeb/DOM/Document.h>
 | 
					
						
							|  |  |  | #include <LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h>
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  | #include <LibWeb/HTML/Window.h>
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Web::HTML { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 21:30:33 +02:00
										 |  |  | WindowEnvironmentSettingsObject::WindowEnvironmentSettingsObject(Window& window, NonnullOwnPtr<JS::ExecutionContext> execution_context) | 
					
						
							|  |  |  |     : EnvironmentSettingsObject(move(execution_context)) | 
					
						
							| 
									
										
										
										
											2022-09-01 12:14:28 +02:00
										 |  |  |     , m_window(window) | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-01 21:22:02 +02:00
										 |  |  | WindowEnvironmentSettingsObject::~WindowEnvironmentSettingsObject() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WindowEnvironmentSettingsObject::visit_edges(JS::Cell::Visitor& visitor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     EnvironmentSettingsObject::visit_edges(visitor); | 
					
						
							|  |  |  |     visitor.visit(m_window.ptr()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | // https://html.spec.whatwg.org/multipage/window-object.html#set-up-a-window-environment-settings-object
 | 
					
						
							| 
									
										
										
										
											2023-02-19 17:58:42 +01:00
										 |  |  | WebIDL::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) | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     // 1. Let realm be the value of execution context's Realm component.
 | 
					
						
							| 
									
										
										
										
											2023-02-26 16:09:02 -07:00
										 |  |  |     auto realm = execution_context->realm; | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  |     VERIFY(realm); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 2. Let window be realm's global object.
 | 
					
						
							| 
									
										
										
										
											2022-09-21 10:53:20 +02:00
										 |  |  |     auto& window = verify_cast<HTML::Window>(realm->global_object()); | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // 3. Let settings object be a new environment settings object whose algorithms are defined as follows:
 | 
					
						
							|  |  |  |     // NOTE: See the functions defined for this class.
 | 
					
						
							| 
									
										
										
										
											2023-02-19 17:58:42 +01:00
										 |  |  |     auto settings_object = MUST_OR_THROW_OOM(realm->heap().allocate<WindowEnvironmentSettingsObject>(*realm, window, move(execution_context))); | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 21:30:33 +02:00
										 |  |  |     // 4. If reservedEnvironment is non-null, then:
 | 
					
						
							|  |  |  |     if (reserved_environment.has_value()) { | 
					
						
							|  |  |  |         // FIXME:    1. Set settings object's id to reservedEnvironment's id,
 | 
					
						
							|  |  |  |         //              target browsing context to reservedEnvironment's target browsing context,
 | 
					
						
							|  |  |  |         //              and active service worker to reservedEnvironment's active service worker.
 | 
					
						
							| 
									
										
										
										
											2022-09-21 10:57:32 +02:00
										 |  |  |         settings_object->id = reserved_environment->id; | 
					
						
							| 
									
										
										
										
											2022-08-04 21:30:33 +02:00
										 |  |  |         settings_object->target_browsing_context = reserved_environment->target_browsing_context; | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-21 10:57:32 +02:00
										 |  |  |         // 2. Set reservedEnvironment's id to the empty string.
 | 
					
						
							| 
									
										
										
										
											2022-12-04 18:02:33 +00:00
										 |  |  |         reserved_environment->id = DeprecatedString::empty(); | 
					
						
							| 
									
										
										
										
											2022-08-04 21:30:33 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-04 21:30:33 +02:00
										 |  |  |     // 5. Otherwise, ...
 | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         // FIXME: ...set settings object's id to a new unique opaque string,
 | 
					
						
							|  |  |  |         //        settings object's target browsing context to null,
 | 
					
						
							|  |  |  |         //        and settings object's active service worker to null.
 | 
					
						
							| 
									
										
										
										
											2022-09-21 10:57:32 +02:00
										 |  |  |         static i64 next_id = 1; | 
					
						
							| 
									
										
										
										
											2022-12-04 18:02:33 +00:00
										 |  |  |         settings_object->id = DeprecatedString::number(next_id++); | 
					
						
							| 
									
										
										
										
											2022-08-04 21:30:33 +02:00
										 |  |  |         settings_object->target_browsing_context = nullptr; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // 6. Set settings object's creation URL to creationURL,
 | 
					
						
							|  |  |  |     //    settings object's top-level creation URL to topLevelCreationURL,
 | 
					
						
							|  |  |  |     //    and settings object's top-level origin to topLevelOrigin.
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  |     settings_object->creation_url = creation_url; | 
					
						
							| 
									
										
										
										
											2022-08-04 21:30:33 +02:00
										 |  |  |     settings_object->top_level_creation_url = top_level_creation_url; | 
					
						
							|  |  |  |     settings_object->top_level_origin = top_level_origin; | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // 7. Set realm's [[HostDefined]] field to settings object.
 | 
					
						
							| 
									
										
										
										
											2022-09-24 15:39:23 -06:00
										 |  |  |     // Non-Standard: We store the ESO next to the web intrinsics in a custom HostDefined object
 | 
					
						
							| 
									
										
										
										
											2023-02-19 17:58:42 +01:00
										 |  |  |     auto intrinsics = MUST_OR_THROW_OOM(realm->heap().allocate<Bindings::Intrinsics>(*realm, *realm)); | 
					
						
							| 
									
										
										
										
											2022-12-14 17:40:33 +00:00
										 |  |  |     auto host_defined = make<Bindings::HostDefined>(settings_object, intrinsics); | 
					
						
							| 
									
										
										
										
											2022-09-24 15:39:23 -06:00
										 |  |  |     realm->set_host_defined(move(host_defined)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Non-Standard: We cannot fully initialize window object until *after* the we set up
 | 
					
						
							|  |  |  |     //    the realm's [[HostDefined]] internal slot as the internal slot contains the web platform intrinsics
 | 
					
						
							| 
									
										
										
										
											2023-03-05 21:22:34 +00:00
										 |  |  |     TRY(window.initialize_web_interfaces({})); | 
					
						
							| 
									
										
										
										
											2023-02-19 17:58:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return {}; | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:responsible-document
 | 
					
						
							| 
									
										
										
										
											2022-08-28 13:42:07 +02:00
										 |  |  | JS::GCPtr<DOM::Document> WindowEnvironmentSettingsObject::responsible_document() | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     // Return window's associated Document.
 | 
					
						
							|  |  |  |     return m_window->associated_document(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:api-url-character-encoding
 | 
					
						
							| 
									
										
										
										
											2022-12-04 18:02:33 +00:00
										 |  |  | DeprecatedString WindowEnvironmentSettingsObject::api_url_character_encoding() | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     // Return the current character encoding of window's associated Document.
 | 
					
						
							|  |  |  |     return m_window->associated_document().encoding_or_default(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:api-base-url
 | 
					
						
							|  |  |  | AK::URL WindowEnvironmentSettingsObject::api_base_url() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-06-19 16:02:48 +01:00
										 |  |  |     // Return the current base URL of window's associated Document.
 | 
					
						
							|  |  |  |     return m_window->associated_document().base_url(); | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:concept-settings-object-origin
 | 
					
						
							|  |  |  | Origin WindowEnvironmentSettingsObject::origin() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Return the origin of window's associated Document.
 | 
					
						
							|  |  |  |     return m_window->associated_document().origin(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-13 18:22:11 +02:00
										 |  |  | // https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:concept-settings-object-policy-container
 | 
					
						
							|  |  |  | PolicyContainer WindowEnvironmentSettingsObject::policy_container() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Return the policy container of window's associated Document.
 | 
					
						
							|  |  |  |     return m_window->associated_document().policy_container(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | // https://html.spec.whatwg.org/multipage/window-object.html#script-settings-for-window-objects:concept-settings-object-cross-origin-isolated-capability
 | 
					
						
							|  |  |  | CanUseCrossOriginIsolatedAPIs WindowEnvironmentSettingsObject::cross_origin_isolated_capability() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // FIXME: Return true if both of the following hold, and false otherwise:
 | 
					
						
							|  |  |  |     //          1. realm's agent cluster's cross-origin-isolation mode is "concrete", and
 | 
					
						
							|  |  |  |     //          2. window's associated Document is allowed to use the "cross-origin-isolated" feature.
 | 
					
						
							| 
									
										
										
										
											2022-09-21 01:21:37 +02:00
										 |  |  |     return CanUseCrossOriginIsolatedAPIs::Yes; | 
					
						
							| 
									
										
										
										
											2021-10-14 16:12:53 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |