2020-01-18 09:38:21 +01:00
/*
2022-03-16 12:33:51 +01:00
* Copyright ( c ) 2018 - 2022 , Andreas Kling < kling @ serenityos . org >
2020-01-18 09:38:21 +01:00
*
2021-04-22 01:24:48 -07:00
* SPDX - License - Identifier : BSD - 2 - Clause
2020-01-18 09:38:21 +01:00
*/
2022-08-05 10:55:47 +02:00
# include <LibWeb/Bindings/MainThreadVM.h>
2020-03-07 10:32:51 +01:00
# include <LibWeb/DOM/Document.h>
2023-03-29 23:46:18 +01:00
# include <LibWeb/DOM/ElementFactory.h>
2022-09-19 17:46:34 +02:00
# include <LibWeb/DOM/Event.h>
2021-04-22 21:11:20 +02:00
# include <LibWeb/DOM/HTMLCollection.h>
2023-01-11 19:47:38 +01:00
# include <LibWeb/DOM/Range.h>
2024-02-11 19:48:56 +13:00
# include <LibWeb/DOMURL/DOMURL.h>
2021-11-18 15:01:28 +01:00
# include <LibWeb/HTML/BrowsingContext.h>
2022-09-19 12:28:46 +02:00
# include <LibWeb/HTML/BrowsingContextGroup.h>
2022-08-05 10:55:47 +02:00
# include <LibWeb/HTML/CrossOrigin/CrossOriginOpenerPolicy.h>
2023-01-01 18:25:01 +01:00
# include <LibWeb/HTML/DocumentState.h>
2020-07-26 15:08:16 +02:00
# include <LibWeb/HTML/HTMLAnchorElement.h>
2023-06-21 13:53:09 +02:00
# include <LibWeb/HTML/HTMLDocument.h>
2022-02-17 12:59:32 +01:00
# include <LibWeb/HTML/HTMLInputElement.h>
2022-12-12 12:20:02 +01:00
# include <LibWeb/HTML/NavigableContainer.h>
2022-08-05 10:55:47 +02:00
# include <LibWeb/HTML/SandboxingFlagSet.h>
# include <LibWeb/HTML/Scripting/WindowEnvironmentSettingsObject.h>
2022-12-17 13:35:20 +01:00
# include <LibWeb/HTML/TraversableNavigable.h>
2022-03-07 23:08:26 +01:00
# include <LibWeb/HTML/Window.h>
2022-10-15 23:10:56 +02:00
# include <LibWeb/HTML/WindowProxy.h>
2022-10-04 21:30:29 +01:00
# include <LibWeb/HighResolutionTime/TimeOrigin.h>
2020-11-22 15:53:01 +01:00
# include <LibWeb/Layout/BreakNode.h>
2023-02-25 11:04:29 +01:00
# include <LibWeb/Layout/Viewport.h>
2023-03-29 23:46:18 +01:00
# include <LibWeb/Namespace.h>
2021-08-24 16:28:08 +02:00
# include <LibWeb/Page/Page.h>
2024-01-14 11:14:20 +01:00
# include <LibWeb/Painting/Paintable.h>
2019-10-04 15:50:04 +02:00
2021-11-18 15:01:28 +01:00
namespace Web : : HTML {
2020-03-07 10:27:02 +01:00
2023-11-19 19:47:52 +01:00
JS_DEFINE_ALLOCATOR ( BrowsingContext ) ;
2022-08-05 10:55:47 +02:00
// https://html.spec.whatwg.org/multipage/urls-and-fetching.html#matches-about:blank
2024-03-18 16:22:27 +13:00
bool url_matches_about_blank ( URL : : URL const & url )
2022-08-05 10:55:47 +02:00
{
// A URL matches about:blank if its scheme is "about", its path contains a single string "blank", its username and password are the empty string, and its host is null.
return url . scheme ( ) = = " about " sv
2023-04-14 20:12:03 +01:00
& & url . serialize_path ( ) = = " blank " sv
2023-08-12 16:52:38 +12:00
& & url . raw_username ( ) . is_empty ( )
& & url . raw_password ( ) . is_empty ( )
2023-07-27 21:40:41 +12:00
& & url . host ( ) . has < Empty > ( ) ;
2022-08-05 10:55:47 +02:00
}
2024-02-04 03:41:07 -07:00
// https://html.spec.whatwg.org/multipage/urls-and-fetching.html#matches-about:srcdoc
2024-03-18 16:22:27 +13:00
bool url_matches_about_srcdoc ( URL : : URL const & url )
2024-02-04 03:41:07 -07:00
{
// A URL matches about:srcdoc if its scheme is "about", its path contains a single string "srcdoc", its query is null, its username and password are the empty string, and its host is null.
return url . scheme ( ) = = " about " sv
& & url . serialize_path ( ) = = " srcdoc " sv
& & ! url . query ( ) . has_value ( )
& & url . raw_username ( ) . is_empty ( )
& & url . raw_password ( ) . is_empty ( )
& & url . host ( ) . has < Empty > ( ) ;
}
2022-12-12 17:36:20 +01:00
// https://html.spec.whatwg.org/multipage/document-sequences.html#determining-the-origin
2024-03-18 16:22:27 +13:00
HTML : : Origin determine_the_origin ( URL : : URL const & url , SandboxingFlagSet sandbox_flags , Optional < HTML : : Origin > source_origin )
2022-12-12 17:36:20 +01:00
{
// 1. If sandboxFlags has its sandboxed origin browsing context flag set, then return a new opaque origin.
2023-08-28 11:57:21 +02:00
if ( has_flag ( sandbox_flags , SandboxingFlagSet : : SandboxedOrigin ) ) {
2022-12-12 17:36:20 +01:00
return HTML : : Origin { } ;
}
// FIXME: 2. If url is null, then return a new opaque origin.
// FIXME: There appears to be no way to get a null URL here, so it might be a spec bug.
// 3. If url is about:srcdoc, then:
if ( url = = " about:srcdoc " sv ) {
2023-09-17 17:11:34 +02:00
// 1. Assert: sourceOrigin is non-null.
VERIFY ( source_origin . has_value ( ) ) ;
2022-12-12 17:36:20 +01:00
2023-09-17 17:11:34 +02:00
// 2. Return sourceOrigin.
return source_origin . release_value ( ) ;
2022-12-12 17:36:20 +01:00
}
// 4. If url matches about:blank and sourceOrigin is non-null, then return sourceOrigin.
if ( url_matches_about_blank ( url ) & & source_origin . has_value ( ) )
return source_origin . release_value ( ) ;
// 5. Return url's origin.
2024-02-11 19:48:56 +13:00
return DOMURL : : url_origin ( url ) ;
2022-12-12 17:36:20 +01:00
}
2023-04-23 19:31:46 +03:00
// https://html.spec.whatwg.org/multipage/document-sequences.html#creating-a-new-auxiliary-browsing-context
2023-06-26 06:58:10 +02:00
WebIDL : : ExceptionOr < BrowsingContext : : BrowsingContextAndDocument > BrowsingContext : : create_a_new_auxiliary_browsing_context_and_document ( JS : : NonnullGCPtr < Page > page , JS : : NonnullGCPtr < HTML : : BrowsingContext > opener )
2023-04-23 19:31:46 +03:00
{
// 1. Let openerTopLevelBrowsingContext be opener's top-level traversable's active browsing context.
auto opener_top_level_browsing_context = opener - > top_level_traversable ( ) - > active_browsing_context ( ) ;
// 2. Let group be openerTopLevelBrowsingContext's group.
auto group = opener_top_level_browsing_context - > group ( ) ;
// 3. Assert: group is non-null, as navigating invokes this directly.
VERIFY ( group ) ;
// 4. Set browsingContext and document be the result of creating a new browsing context and document with opener's active document, null, and group.
auto [ browsing_context , document ] = TRY ( create_a_new_browsing_context_and_document ( page , opener - > active_document ( ) , nullptr , * group ) ) ;
2024-04-26 18:10:05 +02:00
// 5. Set browsingContext's is auxiliary to true.
browsing_context - > m_is_auxiliary = true ;
2023-04-23 19:31:46 +03:00
// 6. Append browsingContext to group.
group - > append ( browsing_context ) ;
// 7. Set browsingContext's opener browsing context to opener.
browsing_context - > set_opener_browsing_context ( opener ) ;
2024-04-26 18:10:05 +02:00
// 8. Set browsingContext's virtual browsing context group ID to openerTopLevelBrowsingContext's virtual browsing context group ID.
browsing_context - > m_virtual_browsing_context_group_id = opener_top_level_browsing_context - > m_virtual_browsing_context_group_id ;
2023-04-23 19:31:46 +03:00
2024-04-26 18:10:05 +02:00
// 9. Set browsingContext's opener origin at creation to opener's active document's origin.
browsing_context - > m_opener_origin_at_creation = opener - > active_document ( ) - > origin ( ) ;
2023-04-23 19:31:46 +03:00
// 10. Return browsingContext and document.
return BrowsingContext : : BrowsingContextAndDocument { browsing_context , document } ;
}
2024-04-26 18:27:44 +02:00
static void populate_with_html_head_body ( JS : : NonnullGCPtr < DOM : : Document > document )
{
auto html_node = MUST ( DOM : : create_element ( document , HTML : : TagNames : : html , Namespace : : HTML ) ) ;
auto head_element = MUST ( DOM : : create_element ( document , HTML : : TagNames : : head , Namespace : : HTML ) ) ;
MUST ( html_node - > append_child ( head_element ) ) ;
auto body_element = MUST ( DOM : : create_element ( document , HTML : : TagNames : : body , Namespace : : HTML ) ) ;
MUST ( html_node - > append_child ( body_element ) ) ;
MUST ( document - > append_child ( html_node ) ) ;
}
2023-04-23 19:31:46 +03:00
// https://html.spec.whatwg.org/multipage/document-sequences.html#creating-a-new-browsing-context
2023-06-26 06:58:10 +02:00
WebIDL : : ExceptionOr < BrowsingContext : : BrowsingContextAndDocument > BrowsingContext : : create_a_new_browsing_context_and_document ( JS : : NonnullGCPtr < Page > page , JS : : GCPtr < DOM : : Document > creator , JS : : GCPtr < DOM : : Element > embedder , JS : : NonnullGCPtr < BrowsingContextGroup > group )
2023-04-23 19:31:46 +03:00
{
auto & vm = group - > vm ( ) ;
// 1. Let browsingContext be a new browsing context.
2024-02-04 03:56:00 -07:00
JS : : NonnullGCPtr < BrowsingContext > browsing_context = * vm . heap ( ) . allocate_without_realm < BrowsingContext > ( page ) ;
2023-04-23 19:31:46 +03:00
// 2. Let unsafeContextCreationTime be the unsafe shared current time.
[[maybe_unused]] auto unsafe_context_creation_time = HighResolutionTime : : unsafe_shared_current_time ( ) ;
// 3. Let creatorOrigin be null.
Optional < Origin > creator_origin = { } ;
2024-04-26 18:27:44 +02:00
// 4. Let creatorBaseURL be null.
2024-03-18 16:22:27 +13:00
Optional < URL : : URL > creator_base_url = { } ;
2023-09-22 17:31:25 -06:00
2024-04-26 18:27:44 +02:00
// 5. If creator is non-null, then:
2023-04-23 19:31:46 +03:00
if ( creator ) {
// 1. Set creatorOrigin to creator's origin.
creator_origin = creator - > origin ( ) ;
2024-04-26 18:27:44 +02:00
// 2. Set creatorBaseURL to creator's document base URL.
2023-09-22 17:31:25 -06:00
creator_base_url = creator - > base_url ( ) ;
2024-04-26 18:27:44 +02:00
// 3. Set browsingContext's virtual browsing context group ID to creator's browsing context's top-level browsing context's virtual browsing context group ID.
VERIFY ( creator - > browsing_context ( ) ) ;
browsing_context - > m_virtual_browsing_context_group_id = creator - > browsing_context ( ) - > top_level_browsing_context ( ) - > m_virtual_browsing_context_group_id ;
2023-04-23 19:31:46 +03:00
}
2024-04-26 18:27:44 +02:00
// 6. Let sandboxFlags be the result of determining the creation sandboxing flags given browsingContext and embedder.
2023-08-28 11:57:21 +02:00
SandboxingFlagSet sandbox_flags = { } ;
2023-04-23 19:31:46 +03:00
2024-04-26 18:27:44 +02:00
// 7. Let origin be the result of determining the origin given about:blank, sandboxFlags, and creatorOrigin.
2024-03-18 16:22:27 +13:00
auto origin = determine_the_origin ( URL : : URL ( " about:blank " sv ) , sandbox_flags , creator_origin ) ;
2023-04-23 19:31:46 +03:00
2024-04-26 18:27:44 +02:00
// FIXME: 8. Let permissionsPolicy be the result of creating a permissions policy given embedder and origin. [PERMISSIONSPOLICY]
2023-04-23 19:31:46 +03:00
2024-04-26 18:27:44 +02:00
// FIXME: 9. Let agent be the result of obtaining a similar-origin window agent given origin, group, and false.
2023-04-23 19:31:46 +03:00
JS : : GCPtr < Window > window ;
2024-04-26 18:27:44 +02:00
// 10. Let realm execution context be the result of creating a new JavaScript realm given agent and the following customizations:
2023-04-23 19:31:46 +03:00
auto realm_execution_context = Bindings : : create_a_new_javascript_realm (
Bindings : : main_thread_vm ( ) ,
[ & ] ( JS : : Realm & realm ) - > JS : : Object * {
auto window_proxy = realm . heap ( ) . allocate < WindowProxy > ( realm , realm ) ;
2023-08-13 13:05:26 +02:00
browsing_context - > set_window_proxy ( window_proxy ) ;
2023-04-23 19:31:46 +03:00
// - For the global object, create a new Window object.
2023-08-13 13:05:26 +02:00
window = Window : : create ( realm ) ;
2023-04-23 19:31:46 +03:00
return window . ptr ( ) ;
} ,
[ & ] ( JS : : Realm & ) - > JS : : Object * {
// - For the global this binding, use browsingContext's WindowProxy object.
return browsing_context - > window_proxy ( ) ;
} ) ;
2024-04-26 18:27:44 +02:00
// 11. Let topLevelCreationURL be about:blank if embedder is null; otherwise embedder's relevant settings object's top-level creation URL.
2024-03-18 16:22:27 +13:00
auto top_level_creation_url = ! embedder ? URL : : URL ( " about:blank " ) : relevant_settings_object ( * embedder ) . top_level_creation_url ;
2023-04-23 19:31:46 +03:00
2024-04-26 18:27:44 +02:00
// 12. Let topLevelOrigin be origin if embedder is null; otherwise embedder's relevant settings object's top-level origin.
2023-04-23 19:31:46 +03:00
auto top_level_origin = ! embedder ? origin : relevant_settings_object ( * embedder ) . origin ( ) ;
2024-04-26 18:27:44 +02:00
// 13. Set up a window environment settings object with about:blank, realm execution context, null, topLevelCreationURL, and topLevelOrigin.
2023-08-13 13:05:26 +02:00
WindowEnvironmentSettingsObject : : setup (
2023-12-15 13:43:39 +01:00
page ,
2024-03-18 16:22:27 +13:00
URL : : URL ( " about:blank " ) ,
2023-04-23 19:31:46 +03:00
move ( realm_execution_context ) ,
{ } ,
top_level_creation_url ,
2023-08-13 13:05:26 +02:00
top_level_origin ) ;
2023-04-23 19:31:46 +03:00
2024-04-26 18:27:44 +02:00
// 14. Let loadTimingInfo be a new document load timing info with its navigation start time set to the result of calling
2023-04-23 19:31:46 +03:00
// coarsen time with unsafeContextCreationTime and the new environment settings object's cross-origin isolated capability.
auto load_timing_info = DOM : : DocumentLoadTimingInfo ( ) ;
load_timing_info . navigation_start_time = HighResolutionTime : : coarsen_time (
unsafe_context_creation_time ,
verify_cast < WindowEnvironmentSettingsObject > ( Bindings : : host_defined_environment_settings_object ( window - > realm ( ) ) ) . cross_origin_isolated_capability ( ) = = CanUseCrossOriginIsolatedAPIs : : Yes ) ;
2024-04-26 18:27:44 +02:00
// 15. Let document be a new Document, with:
2023-08-13 13:05:26 +02:00
auto document = HTML : : HTMLDocument : : create ( window - > realm ( ) ) ;
2023-04-23 19:31:46 +03:00
// Non-standard
window - > set_associated_document ( * document ) ;
// type: "html"
document - > set_document_type ( DOM : : Document : : Type : : HTML ) ;
// content type: "text/html"
2023-09-15 21:46:58 +12:00
document - > set_content_type ( " text/html " _string ) ;
2023-04-23 19:31:46 +03:00
// mode: "quirks"
document - > set_quirks_mode ( DOM : : QuirksMode : : Yes ) ;
// origin: origin
document - > set_origin ( origin ) ;
// browsing context: browsingContext
document - > set_browsing_context ( browsing_context ) ;
// FIXME: permissions policy: permissionsPolicy
// FIXME: active sandboxing flag set: sandboxFlags
// load timing info: loadTimingInfo
document - > set_load_timing_info ( load_timing_info ) ;
// is initial about:blank: true
document - > set_is_initial_about_blank ( true ) ;
2024-04-11 17:27:11 +02:00
// Spec issue: https://github.com/whatwg/html/issues/10261
document - > set_ready_to_run_scripts ( ) ;
2023-04-23 19:31:46 +03:00
2023-09-22 17:31:25 -06:00
// about base URL: creatorBaseURL
document - > set_about_base_url ( creator_base_url ) ;
2024-04-26 18:27:44 +02:00
// 16. If creator is non-null, then:
2023-04-23 19:31:46 +03:00
if ( creator ) {
// 1. Set document's referrer to the serialization of creator's URL.
2023-12-16 17:49:34 +03:30
document - > set_referrer ( MUST ( String : : from_byte_string ( creator - > url ( ) . serialize ( ) ) ) ) ;
2023-04-23 19:31:46 +03:00
2024-04-26 18:27:44 +02:00
// 2. Set document's policy container to a clone of creator's policy container.
document - > set_policy_container ( creator - > policy_container ( ) ) ;
2023-04-23 19:31:46 +03:00
// 3. If creator's origin is same origin with creator's relevant settings object's top-level origin,
if ( creator - > origin ( ) . is_same_origin ( creator - > relevant_settings_object ( ) . top_level_origin ) ) {
// then set document's cross-origin opener policy to creator's browsing context's top-level browsing context's active document's cross-origin opener policy.
VERIFY ( creator - > browsing_context ( ) ) ;
2023-09-04 15:33:08 +02:00
VERIFY ( creator - > browsing_context ( ) - > top_level_browsing_context ( ) - > active_document ( ) ) ;
document - > set_cross_origin_opener_policy ( creator - > browsing_context ( ) - > top_level_browsing_context ( ) - > active_document ( ) - > cross_origin_opener_policy ( ) ) ;
2023-04-23 19:31:46 +03:00
}
}
2024-04-26 18:27:44 +02:00
// 17. Assert: document's URL and document's relevant settings object's creation URL are about:blank.
2023-04-23 19:31:46 +03:00
VERIFY ( document - > url ( ) = = " about:blank " sv ) ;
VERIFY ( document - > relevant_settings_object ( ) . creation_url = = " about:blank " sv ) ;
2024-04-26 18:27:44 +02:00
// 18. Mark document as ready for post-load tasks.
2023-04-23 19:31:46 +03:00
document - > set_ready_for_post_load_tasks ( true ) ;
2024-04-26 18:27:44 +02:00
// 19. Populate with html/head/body given document.
populate_with_html_head_body ( * document ) ;
2023-04-23 19:31:46 +03:00
2024-04-26 18:27:44 +02:00
// 20. Make active document.
2023-04-23 19:31:46 +03:00
document - > make_active ( ) ;
2024-04-26 18:27:44 +02:00
// 21. Completely finish loading document.
2023-04-23 19:31:46 +03:00
document - > completely_finish_loading ( ) ;
2024-04-26 18:27:44 +02:00
// 22. Return browsingContext and document.
2023-04-23 19:31:46 +03:00
return BrowsingContext : : BrowsingContextAndDocument { browsing_context , document } ;
}
2024-02-04 03:56:00 -07:00
BrowsingContext : : BrowsingContext ( JS : : NonnullGCPtr < Page > page )
2021-09-08 02:07:39 +02:00
: m_page ( page )
2020-06-05 23:36:02 +02:00
{
}
2022-03-14 13:21:51 -06:00
BrowsingContext : : ~ BrowsingContext ( ) = default ;
2020-08-02 11:52:35 +02:00
2022-10-17 11:06:50 +02:00
void BrowsingContext : : visit_edges ( Cell : : Visitor & visitor )
{
Base : : visit_edges ( visitor ) ;
2023-06-26 06:58:10 +02:00
visitor . visit ( m_page ) ;
2022-10-17 11:06:50 +02:00
visitor . visit ( m_window_proxy ) ;
visitor . visit ( m_group ) ;
visitor . visit ( m_parent ) ;
visitor . visit ( m_first_child ) ;
visitor . visit ( m_last_child ) ;
visitor . visit ( m_next_sibling ) ;
visitor . visit ( m_previous_sibling ) ;
2024-02-04 03:56:00 -07:00
visitor . visit ( m_opener_browsing_context ) ;
2022-10-17 11:06:50 +02:00
}
2022-12-17 13:35:20 +01:00
// https://html.spec.whatwg.org/multipage/document-sequences.html#bc-traversable
JS : : NonnullGCPtr < HTML : : TraversableNavigable > BrowsingContext : : top_level_traversable ( ) const
{
// A browsing context's top-level traversable is its active document's node navigable's top-level traversable.
auto traversable = active_document ( ) - > navigable ( ) - > top_level_traversable ( ) ;
VERIFY ( traversable ) ;
VERIFY ( traversable - > is_top_level_traversable ( ) ) ;
return * traversable ;
}
2022-03-01 21:17:53 +00:00
// https://html.spec.whatwg.org/multipage/browsers.html#top-level-browsing-context
bool BrowsingContext : : is_top_level ( ) const
{
// A browsing context that has no parent browsing context is the top-level browsing context for itself and all of the browsing contexts for which it is an ancestor browsing context.
return ! parent ( ) ;
}
2023-09-04 15:33:08 +02:00
JS : : GCPtr < BrowsingContext > BrowsingContext : : top_level_browsing_context ( ) const
{
auto const * start = this ;
// 1. If start's active document is not fully active, then return null.
if ( ! start - > active_document ( ) - > is_fully_active ( ) ) {
return nullptr ;
}
// 2. Let navigable be start's active document's node navigable.
auto navigable = start - > active_document ( ) - > navigable ( ) ;
// 3. While navigable's parent is not null, set navigable to navigable's parent.
while ( navigable - > parent ( ) ) {
navigable = navigable - > parent ( ) ;
}
// 4. Return navigable's active browsing context.
return navigable - > active_browsing_context ( ) ;
}
2022-08-28 13:42:07 +02:00
DOM : : Document const * BrowsingContext : : active_document ( ) const
{
2022-10-15 23:10:56 +02:00
auto * window = active_window ( ) ;
if ( ! window )
2022-09-20 21:44:42 +02:00
return nullptr ;
2022-10-15 23:10:56 +02:00
return & window - > associated_document ( ) ;
2022-08-28 13:42:07 +02:00
}
DOM : : Document * BrowsingContext : : active_document ( )
{
2022-10-15 23:10:56 +02:00
auto * window = active_window ( ) ;
if ( ! window )
2022-09-20 21:44:42 +02:00
return nullptr ;
2022-10-15 23:10:56 +02:00
return & window - > associated_document ( ) ;
2022-08-28 13:42:07 +02:00
}
2022-10-15 23:10:56 +02:00
// https://html.spec.whatwg.org/multipage/browsers.html#active-window
2022-09-19 17:46:34 +02:00
HTML : : Window * BrowsingContext : : active_window ( )
{
2022-10-15 23:10:56 +02:00
return m_window_proxy - > window ( ) ;
2022-09-19 17:46:34 +02:00
}
2022-10-15 23:10:56 +02:00
// https://html.spec.whatwg.org/multipage/browsers.html#active-window
2022-09-19 17:46:34 +02:00
HTML : : Window const * BrowsingContext : : active_window ( ) const
{
2022-10-15 23:10:56 +02:00
return m_window_proxy - > window ( ) ;
}
HTML : : WindowProxy * BrowsingContext : : window_proxy ( )
{
return m_window_proxy . ptr ( ) ;
}
HTML : : WindowProxy const * BrowsingContext : : window_proxy ( ) const
{
return m_window_proxy . ptr ( ) ;
2022-09-19 17:46:34 +02:00
}
2023-04-23 19:31:46 +03:00
void BrowsingContext : : set_window_proxy ( JS : : GCPtr < WindowProxy > window_proxy )
{
m_window_proxy = move ( window_proxy ) ;
}
2022-09-19 12:28:46 +02:00
BrowsingContextGroup * BrowsingContext : : group ( )
{
return m_group ;
}
void BrowsingContext : : set_group ( BrowsingContextGroup * group )
{
m_group = group ;
}
// https://html.spec.whatwg.org/multipage/browsers.html#bcg-remove
void BrowsingContext : : remove ( )
{
// 1. Assert: browsingContext's group is non-null, because a browsing context only gets discarded once.
VERIFY ( group ( ) ) ;
// 2. Let group be browsingContext's group.
2022-10-17 11:06:50 +02:00
JS : : NonnullGCPtr < BrowsingContextGroup > group = * this - > group ( ) ;
2022-09-19 12:28:46 +02:00
// 3. Set browsingContext's group to null.
set_group ( nullptr ) ;
// 4. Remove browsingContext from group's browsing context set.
2023-04-20 16:44:54 +01:00
group - > browsing_context_set ( ) . remove ( * this ) ;
2022-09-19 12:28:46 +02:00
// 5. If group's browsing context set is empty, then remove group from the user agent's browsing context group set.
// NOTE: This is done by ~BrowsingContextGroup() when the refcount reaches 0.
}
2022-09-19 17:46:34 +02:00
// https://html.spec.whatwg.org/multipage/origin.html#one-permitted-sandboxed-navigator
BrowsingContext const * BrowsingContext : : the_one_permitted_sandboxed_navigator ( ) const
{
// FIXME: Implement this.
return nullptr ;
}
2022-10-17 11:06:50 +02:00
JS : : GCPtr < BrowsingContext > BrowsingContext : : first_child ( ) const
{
return m_first_child ;
}
JS : : GCPtr < BrowsingContext > BrowsingContext : : next_sibling ( ) const
{
return m_next_sibling ;
}
bool BrowsingContext : : is_ancestor_of ( BrowsingContext const & other ) const
{
for ( auto ancestor = other . parent ( ) ; ancestor ; ancestor = ancestor - > parent ( ) ) {
if ( ancestor = = this )
return true ;
}
return false ;
}
2023-11-28 08:36:09 -07:00
// https://html.spec.whatwg.org/multipage/document-sequences.html#familiar-with
bool BrowsingContext : : is_familiar_with ( BrowsingContext const & other ) const
{
// A browsing context A is familiar with a second browsing context B if the following algorithm returns true:
auto const & A = * this ;
auto const & B = other ;
// 1. If A's active document's origin is same origin with B's active document's origin, then return true.
if ( A . active_document ( ) - > origin ( ) . is_same_origin ( B . active_document ( ) - > origin ( ) ) )
return true ;
// 2. If A's top-level browsing context is B, then return true.
if ( A . top_level_browsing_context ( ) = = & B )
return true ;
// 3. If B is an auxiliary browsing context and A is familiar with B's opener browsing context, then return true.
if ( B . opener_browsing_context ( ) ! = nullptr & & A . is_familiar_with ( * B . opener_browsing_context ( ) ) )
return true ;
// 4. If there exists an ancestor browsing context of B whose active document has the same origin as the active document of A, then return true.
// NOTE: This includes the case where A is an ancestor browsing context of B.
for ( auto ancestor = B . parent ( ) ; ancestor ; ancestor = ancestor - > parent ( ) ) {
if ( ancestor - > active_document ( ) - > origin ( ) . is_same_origin ( A . active_document ( ) - > origin ( ) ) )
return true ;
}
// 5. Return false.
return false ;
}
2023-08-28 17:44:50 +02:00
// https://html.spec.whatwg.org/multipage/browsing-the-web.html#snapshotting-target-snapshot-params
SandboxingFlagSet determine_the_creation_sandboxing_flags ( BrowsingContext const & , JS : : GCPtr < DOM : : Element > )
{
// FIXME: Populate this once we have the proper flag sets on BrowsingContext
return { } ;
}
2024-02-05 12:34:29 -05:00
bool BrowsingContext : : has_navigable_been_destroyed ( ) const
{
auto navigable = active_document ( ) - > navigable ( ) ;
return navigable & & navigable - > has_been_destroyed ( ) ;
}
2020-03-07 10:27:02 +01:00
}