2023-11-08 11:47:41 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								/*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 *  Copyright  ( c )  2023 ,  Andrew  Kaster  < akaster @ serenityos . org > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 *  SPDX - License - Identifier :  BSD - 2 - Clause 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-26 21:02:28 +13:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Bindings/PrincipalHostDefined.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-17 08:46:48 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/MessagePort.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2025-04-24 14:08:39 +12:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/HTML/WorkerAgentParent.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 13:13:59 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Page/Page.h> 
 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-08 11:47:41 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								# include  <LibWeb/Worker/WebWorkerClient.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								namespace  Web : : HTML  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-04-24 14:08:39 +12:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								GC_DEFINE_ALLOCATOR ( WorkerAgentParent ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-19 19:47:52 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-05-18 14:10:01 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								WorkerAgentParent : : WorkerAgentParent ( URL : : URL  url ,  WorkerOptions  const &  options ,  GC : : Ptr < MessagePort >  outside_port ,  GC : : Ref < EnvironmentSettingsObject >  outside_settings ,  Bindings : : AgentType  agent_type ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-08 11:47:41 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    :  m_worker_options ( options ) 
							 
						 
					
						
							
								
									
										
										
										
											2025-05-18 14:10:01 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ,  m_agent_type ( agent_type ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-08 11:47:41 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    ,  m_url ( move ( url ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-20 13:47:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ,  m_outside_port ( outside_port ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-05 09:42:10 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ,  m_outside_settings ( outside_settings ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-08 11:47:41 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-20 13:47:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-04-24 14:08:39 +12:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  WorkerAgentParent : : initialize ( JS : : Realm &  realm ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-20 13:47:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Base : : initialize ( realm ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    m_message_port  =  MessagePort : : create ( realm ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    m_message_port - > entangle_with ( * m_outside_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    TransferDataHolder  data_holder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    MUST ( m_message_port - > transfer_steps ( data_holder ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-22 09:57:22 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-06-07 23:57:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // FIXME: Specification says this supposed to happen in step 11 of onComplete handler defined in https://html.spec.whatwg.org/multipage/workers.html#run-a-worker
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //        but that would require introducing a new IPC message type to communicate this from WebWorker to WebContent process,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //        so let's do it here for now.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    m_outside_port - > start ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 13:13:59 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // NOTE: This blocking IPC call may launch another process.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    //    If spinning the event loop for this can cause other javascript to execute, we're in trouble.
 
							 
						 
					
						
							
								
									
										
										
										
											2025-05-18 14:10:01 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  worker_socket_file  =  Bindings : : principal_host_defined_page ( realm ) . client ( ) . request_worker_agent ( m_agent_type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-22 15:47:33 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-17 18:44:39 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  worker_socket  =  MUST ( Core : : LocalSocket : : adopt_fd ( worker_socket_file . take_fd ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 13:13:59 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    MUST ( worker_socket - > set_blocking ( true ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-22 15:47:33 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-21 10:03:51 +05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // TODO: Mach IPC
 
							 
						 
					
						
							
								
									
										
										
										
											2025-04-08 22:01:46 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    auto  transport  =  make < IPC : : Transport > ( move ( worker_socket ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 13:13:59 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-22 15:47:33 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_worker_ipc  =  make_ref_counted < WebWorkerClient > ( move ( transport ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 13:13:59 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-05-18 14:10:01 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    m_worker_ipc - > async_start_worker ( m_url ,  m_worker_options . type ,  m_worker_options . credentials ,  m_worker_options . name ,  move ( data_holder ) ,  m_outside_settings - > serialize ( ) ,  m_agent_type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-20 13:47:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-08 11:47:41 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-04-24 14:08:39 +12:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  WorkerAgentParent : : visit_edges ( Cell : : Visitor &  visitor ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-20 13:47:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    Base : : visit_edges ( visitor ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_message_port ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_outside_port ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-05 09:42:10 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    visitor . visit ( m_outside_settings ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-08 11:47:41 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}