WebWorker control connections can transfer handles from the browser process to the worker process, including RequestServer and ImageDecoder transport handles sent during worker startup. On Windows, serializing those attachments needs the destination process id so DuplicateHandle and WSADuplicateSocketW can target the peer process. WebWorker was excluded from the generic helper-process InitTransport handshake, leaving the transport without a peer pid before any attachment-bearing message was sent. Add InitTransport to the WebWorker server endpoint, implement the server-side peer pid exchange, expose the message type through WebWorkerClient, and let the shared helper launcher perform the handshake for workers as it does for other Windows IPC clients.
71 lines
2.8 KiB
C++
71 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/HashMap.h>
|
|
#include <LibGC/Root.h>
|
|
#include <LibIPC/ConnectionFromClient.h>
|
|
#include <LibJS/Forward.h>
|
|
#include <LibWeb/Forward.h>
|
|
#include <LibWeb/HTML/BroadcastChannelMessage.h>
|
|
#include <LibWeb/HTML/WorkerAgentTypes.h>
|
|
#include <LibWeb/Loader/FileRequest.h>
|
|
#include <LibWeb/Worker/WebWorkerClientEndpoint.h>
|
|
#include <LibWeb/Worker/WebWorkerServerEndpoint.h>
|
|
#include <WebWorker/Forward.h>
|
|
#include <WebWorker/PageHost.h>
|
|
|
|
namespace WebWorker {
|
|
|
|
class ConnectionFromClient final
|
|
: public IPC::ConnectionFromClient<WebWorkerClientEndpoint, WebWorkerServerEndpoint> {
|
|
C_OBJECT(ConnectionFromClient);
|
|
|
|
public:
|
|
virtual ~ConnectionFromClient() override;
|
|
|
|
virtual void die() override;
|
|
|
|
virtual Messages::WebWorkerServer::InitTransportResponse init_transport(int peer_pid) override;
|
|
virtual void close_worker() override;
|
|
|
|
void request_file(Web::FileRequest);
|
|
|
|
PageHost& page_host() { return *m_page_host; }
|
|
PageHost const& page_host() const { return *m_page_host; }
|
|
|
|
Function<void(IPC::TransportHandle const&)> on_request_server_connection;
|
|
Function<void(IPC::TransportHandle const&)> on_image_decoder_connection;
|
|
|
|
private:
|
|
explicit ConnectionFromClient(NonnullOwnPtr<IPC::Transport>);
|
|
|
|
Web::Page& page();
|
|
Web::Page const& page() const;
|
|
|
|
virtual void connect_to_request_server(IPC::TransportHandle handle) override;
|
|
virtual void connect_to_image_decoder(IPC::TransportHandle handle) override;
|
|
virtual void start_worker(URL::URL url, Web::Bindings::WorkerType type, Web::Bindings::RequestCredentials credentials, String name, Web::HTML::TransferDataEncoder, Web::HTML::SerializedEnvironmentSettingsObject, Web::Bindings::AgentType) override;
|
|
virtual void connect_shared_worker(Web::HTML::TransferDataEncoder, Web::HTML::SerializedEnvironmentSettingsObject) override;
|
|
virtual void handle_file_return(i32 error, Optional<IPC::File> file, i32 request_id) override;
|
|
virtual void did_worker_agent_finish_loading_script(Web::HTML::WorkerAgentOwnerToken owner_token) override;
|
|
virtual void did_worker_agent_fail_loading_script(Web::HTML::WorkerAgentOwnerToken owner_token) override;
|
|
virtual void did_worker_agent_report_exception(Web::HTML::WorkerAgentOwnerToken owner_token, String message, String filename, u32 lineno, u32 colno) override;
|
|
virtual void did_worker_agent_close(Web::HTML::WorkerAgentOwnerToken owner_token) override;
|
|
virtual void broadcast_channel_message(Web::HTML::BroadcastChannelMessage message) override;
|
|
|
|
GC::Root<PageHost> m_page_host;
|
|
|
|
// FIXME: Route console messages to the Browser UI using a ConsoleClient
|
|
|
|
HashMap<int, Web::FileRequest> m_requested_files {};
|
|
int last_id { 0 };
|
|
|
|
RefPtr<WorkerHost> m_worker_host;
|
|
};
|
|
|
|
}
|