2020-01-18 09:38:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
									
										
										
										
											2024-10-04 13:19:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  Copyright  ( c )  2018 - 2022 ,  Andreas  Kling  < andreas @ ladybird . 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> 
  
						 
					
						
							
								
									
										
										
										
											2024-11-08 04:03:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <LibWeb/Bindings/PrincipalHostDefined.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> 
  
						 
					
						
							
								
									
										
										
										
											2024-09-18 19:48:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <LibWeb/HTML/CrossOrigin/OpenerPolicy.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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GC_DEFINE_ALLOCATOR ( BrowsingContext ) ;  
						 
					
						
							
								
									
										
										
										
											2023-11-19 19:47:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-05 15:14:00 +12:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        & &  url . paths ( ) . size ( )  = =  1  & &  url . paths ( ) [ 0 ]  = =  " blank " sv 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-04 22:02:02 +12:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        & &  url . username ( ) . is_empty ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        & &  url . password ( ) . is_empty ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-27 12:48:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        & &  ! url . host ( ) . has_value ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											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 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-05 15:14:00 +12:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        & &  url . paths ( ) . size ( )  = =  1  & &  url . paths ( ) [ 0 ]  = =  " srcdoc " sv 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-04 03:41:07 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        & &  ! url . query ( ) . has_value ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-04 22:02:02 +12:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        & &  url . username ( ) . is_empty ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        & &  url . password ( ) . is_empty ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-27 12:48:28 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        & &  ! url . host ( ) . has_value ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-04 03:41:07 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 17:36:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// https://html.spec.whatwg.org/multipage/document-sequences.html#determining-the-origin
  
						 
					
						
							
								
									
										
										
										
											2024-11-15 09:17:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								URL : : Origin  determine_the_origin ( Optional < URL : : URL  const & >  url ,  SandboxingFlagSet  sandbox_flags ,  Optional < URL : : 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 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-05 15:33:34 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  URL : : Origin  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 17:36:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-26 07:44:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // 2. If url is null, then return a new opaque origin.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! url . has_value ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-05 15:33:34 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  URL : : Origin  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-26 07:44:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 17:36:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 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.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-26 07:44:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( url_matches_about_blank ( * url )  & &  source_origin . has_value ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 17:36:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  source_origin . release_value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 5. Return url's origin.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-05 17:03:51 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  url - > origin ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											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
  
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								WebIDL : : ExceptionOr < BrowsingContext : : BrowsingContextAndDocument >  BrowsingContext : : create_a_new_auxiliary_browsing_context_and_document ( GC : : Ref < Page >  page ,  GC : : Ref < 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-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  populate_with_html_head_body ( GC : : Ref < DOM : : Document >  document )  
						 
					
						
							
								
									
										
										
										
											2024-04-26 18:27:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    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
  
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								WebIDL : : ExceptionOr < BrowsingContext : : BrowsingContextAndDocument >  BrowsingContext : : create_a_new_browsing_context_and_document ( GC : : Ref < Page >  page ,  GC : : Ptr < DOM : : Document >  creator ,  GC : : Ptr < DOM : : Element >  embedder ,  GC : : Ref < BrowsingContextGroup >  group )  
						 
					
						
							
								
									
										
										
										
											2023-04-23 19:31:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto &  vm  =  group - > vm ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 1. Let browsingContext be a new browsing context.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    GC : : Ref < BrowsingContext >  browsing_context  =  * vm . heap ( ) . allocate < 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.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-05 15:33:34 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Optional < URL : : Origin >  creator_origin  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-23 19:31:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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-11-25 17:06:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // FIXME: 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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    GC : : Ptr < Window >  window ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-23 19:31:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 *  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-14 05:50:17 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            auto  window_proxy  =  realm . create < WindowProxy > ( 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 , 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-21 09:12:05 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        as < WindowEnvironmentSettingsObject > ( Bindings : : principal_host_defined_environment_settings_object ( window - > realm ( ) ) ) . cross_origin_isolated_capability ( )  = =  CanUseCrossOriginIsolatedAPIs : : Yes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-23 19:31:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-25 17:06:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // active sandboxing flag set: sandboxFlags
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    document - > set_active_sandboxing_flag_set ( sandbox_flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-23 19:31:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 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-06-25 09:41:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // allow declarative shadow roots: true
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    document - > set_allow_declarative_shadow_roots ( true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-03 22:31:33 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        document - > set_referrer ( 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 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 19:48:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // then set document's opener policy to creator's browsing context's top-level browsing context's active document's opener policy.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-23 19:31:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            VERIFY ( creator - > browsing_context ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-04 15:33:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            VERIFY ( creator - > browsing_context ( ) - > top_level_browsing_context ( ) - > active_document ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 19:48:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            document - > set_opener_policy ( creator - > browsing_context ( ) - > top_level_browsing_context ( ) - > active_document ( ) - > 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-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								BrowsingContext : : BrowsingContext ( GC : : Ref < 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_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
  
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GC : : Ref < HTML : : TraversableNavigable >  BrowsingContext : : top_level_traversable ( )  const  
						 
					
						
							
								
									
										
										
										
											2022-12-17 13:35:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 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  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2024-08-10 15:26:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // FIXME: Remove this. The active document's navigable is sometimes null when it shouldn't be, failing assertions.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // A top-level browsing context is a browsing context whose active document's node navigable is a traversable navigable.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  active_document ( )  ! =  nullptr  & &  active_document ( ) - > navigable ( )  ! =  nullptr  & &  active_document ( ) - > navigable ( ) - > is_traversable ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-01 21:17:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GC : : Ptr < BrowsingContext >  BrowsingContext : : top_level_browsing_context ( )  const  
						 
					
						
							
								
									
										
										
										
											2023-09-04 15:33:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  BrowsingContext : : set_window_proxy ( GC : : Ptr < WindowProxy >  window_proxy )  
						 
					
						
							
								
									
										
										
										
											2023-04-23 19:31:46 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    m_window_proxy  =  move ( window_proxy ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-19 12:28:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								BrowsingContextGroup *  BrowsingContext : : group ( )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  m_group ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-24 13:23:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								BrowsingContextGroup  const *  BrowsingContext : : group ( )  const  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  m_group ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-19 12:28:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								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.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    GC : : Ref < 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 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GC : : Ptr < BrowsingContext >  BrowsingContext : : first_child ( )  const  
						 
					
						
							
								
									
										
										
										
											2022-10-17 11:06:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  m_first_child ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GC : : Ptr < BrowsingContext >  BrowsingContext : : next_sibling ( )  const  
						 
					
						
							
								
									
										
										
										
											2022-10-17 11:06:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  m_next_sibling ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 15:26:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// https://html.spec.whatwg.org/multipage/document-sequences.html#ancestor-browsing-context
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  BrowsingContext : : is_ancestor_of ( BrowsingContext  const &  potential_descendant )  const  
						 
					
						
							
								
									
										
										
										
											2022-10-17 11:06:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2024-08-10 15:26:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // A browsing context potentialDescendant is said to be an ancestor of a browsing context potentialAncestor if the following algorithm returns true:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 1. Let potentialDescendantDocument be potentialDescendant's active document.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const *  potential_descendant_document  =  potential_descendant . active_document ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 2. If potentialDescendantDocument is not fully active, then return false.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! potential_descendant_document - > is_fully_active ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 3. Let ancestorBCs be the list obtained by taking the browsing context of the active document of each member of potentialDescendantDocument's ancestor navigables.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( auto  const &  ancestor  :  potential_descendant_document - > ancestor_navigables ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  ancestor_browsing_context  =  ancestor - > active_browsing_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // 4. If ancestorBCs contains potentialAncestor, then return true.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ancestor_browsing_context  = =  this ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-17 11:06:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 15:26:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 5. Return false.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-17 11:06:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    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.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 15:26:59 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // If B's active document is not fully active then it cannot have ancestor browsing context
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! B . active_document ( ) - > is_fully_active ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( auto  const &  ancestor  :  B . active_document ( ) - > ancestor_navigables ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-28 08:36:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        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
  
						 
					
						
							
								
									
										
										
										
											2024-11-15 04:01:23 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SandboxingFlagSet  determine_the_creation_sandboxing_flags ( BrowsingContext  const & ,  GC : : Ptr < DOM : : Element > )  
						 
					
						
							
								
									
										
										
										
											2023-08-28 17:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // 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 ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-05 18:40:04 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ! navigable  | |  navigable - > has_been_destroyed ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-05 12:34:29 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-07 10:27:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}