2023-11-08 11:47:41 -07:00
/*
* Copyright ( c ) 2023 , Andrew Kaster < akaster @ serenityos . org >
2024-05-23 11:14:51 +01:00
* Copyright ( c ) 2024 , Tim Ledbetter < timledbetter @ gmail . com >
2023-11-08 11:47:41 -07:00
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# include <LibWeb/HTML/Scripting/WorkerEnvironmentSettingsObject.h>
# include <LibWeb/HTML/WorkerGlobalScope.h>
2024-07-04 11:06:54 -04:00
# include <LibWeb/HighResolutionTime/TimeOrigin.h>
# include <WebWorker/DedicatedWorkerHost.h>
2023-11-08 11:47:41 -07:00
namespace Web : : HTML {
2023-11-19 19:47:52 +01:00
JS_DEFINE_ALLOCATOR ( WorkerEnvironmentSettingsObject ) ;
2024-05-23 11:14:51 +01:00
// https://html.spec.whatwg.org/multipage/workers.html#set-up-a-worker-environment-settings-object
2024-07-04 11:06:54 -04:00
JS : : NonnullGCPtr < WorkerEnvironmentSettingsObject > WorkerEnvironmentSettingsObject : : setup ( JS : : NonnullGCPtr < Page > page , NonnullOwnPtr < JS : : ExecutionContext > execution_context , SerializedEnvironmentSettingsObject const & outside_settings , HighResolutionTime : : DOMHighResTimeStamp unsafe_worker_creation_time )
2023-11-08 11:47:41 -07:00
{
2024-07-04 11:06:54 -04:00
( void ) unsafe_worker_creation_time ;
// 1. Let inherited origin be outside settings's origin.
auto inherited_origin = outside_settings . origin ;
2024-05-23 11:14:51 +01:00
// 2. Let realm be the value of execution context's Realm component.
2023-11-08 11:47:41 -07:00
auto realm = execution_context - > realm ;
VERIFY ( realm ) ;
2024-05-23 11:14:51 +01:00
// 3. Let worker global scope be realm's global object.
2023-11-08 11:47:41 -07:00
auto & worker = verify_cast < HTML : : WorkerGlobalScope > ( realm - > global_object ( ) ) ;
2024-05-23 11:14:51 +01:00
// 4. Let settings object be a new environment settings object whose algorithms are defined as follows:
// NOTE: See the functions defined for this class.
2023-11-08 11:47:41 -07:00
auto settings_object = realm - > heap ( ) . allocate < WorkerEnvironmentSettingsObject > ( * realm , move ( execution_context ) , worker ) ;
settings_object - > target_browsing_context = nullptr ;
2024-07-04 11:06:54 -04:00
settings_object - > m_origin = move ( inherited_origin ) ;
2023-11-08 11:47:41 -07:00
2024-05-23 11:14:51 +01:00
// FIXME: 5. Set settings object's id to a new unique opaque string, creation URL to worker global scope's url, top-level creation URL to null, target browsing context to null, and active service worker to null.
2024-07-04 11:06:54 -04:00
// 6. If worker global scope is a DedicatedWorkerGlobalScope object, then set settings object's top-level origin to outside settings's top-level origin.
if ( is < WebWorker : : DedicatedWorkerHost > ( worker ) ) {
settings_object - > top_level_origin = outside_settings . top_level_origin ;
}
2024-05-23 11:14:51 +01:00
// FIXME: 7. Otherwise, set settings object's top-level origin to an implementation-defined value.
// 8. Set realm's [[HostDefined]] field to settings object.
2023-11-08 11:47:41 -07:00
auto intrinsics = realm - > heap ( ) . allocate < Bindings : : Intrinsics > ( * realm , * realm ) ;
2024-10-26 21:02:28 +13:00
auto host_defined = make < Bindings : : PrincipalHostDefined > ( settings_object , intrinsics , page ) ;
2023-11-08 11:47:41 -07:00
realm - > set_host_defined ( move ( host_defined ) ) ;
// Non-Standard: We cannot fully initialize worker object until *after* the we set up
// the realm's [[HostDefined]] internal slot as the internal slot contains the web platform intrinsics
worker . initialize_web_interfaces ( { } ) ;
2024-05-23 11:14:51 +01:00
// 9. Return settings object.
2023-11-08 11:47:41 -07:00
return settings_object ;
}
2024-05-23 11:46:41 +01:00
URL : : URL WorkerEnvironmentSettingsObject : : api_base_url ( )
{
// Return worker global scope's url.
return m_global_scope - > url ( ) ;
}
2024-10-05 15:33:34 +13:00
URL : : Origin WorkerEnvironmentSettingsObject : : origin ( )
2024-05-23 11:46:41 +01:00
{
// FIXME: Return a unique opaque origin if worker global scope's url's scheme is "data", and inherited origin otherwise.
return m_origin ;
}
PolicyContainer WorkerEnvironmentSettingsObject : : policy_container ( )
{
// Return worker global scope's policy container.
return m_global_scope - > policy_container ( ) ;
}
CanUseCrossOriginIsolatedAPIs WorkerEnvironmentSettingsObject : : cross_origin_isolated_capability ( )
{
// FIXME: Return worker global scope's cross-origin isolated capability.
return CanUseCrossOriginIsolatedAPIs : : No ;
}
2023-11-08 11:47:41 -07:00
void WorkerEnvironmentSettingsObject : : visit_edges ( JS : : Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
visitor . visit ( m_global_scope ) ;
}
}