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
}
}