/* * Copyright (c) 2023, Andrew Kaster * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include namespace WebWorker { void ConnectionFromClient::die() { // FIXME: When handling multiple workers in the same process, // this logic needs to be smarter (only when all workers are dead, etc). Core::EventLoop::current().quit(0); } void ConnectionFromClient::request_file(Web::FileRequest request) { // FIXME: Route this to FSAS or Brower chrome as appropriate instead of allowing // the WebWorker process filesystem access auto path = request.path(); auto request_id = ++last_id; m_requested_files.set(request_id, move(request)); auto file = Core::File::open(path, Core::File::OpenMode::Read); if (file.is_error()) handle_file_return(file.error().code(), {}, request_id); else handle_file_return(0, IPC::File(*file.value()), request_id); } ConnectionFromClient::ConnectionFromClient(NonnullOwnPtr socket) : IPC::ConnectionFromClient(*this, move(socket), 1) , m_page_host(PageHost::create(Web::Bindings::main_thread_vm(), *this)) { } ConnectionFromClient::~ConnectionFromClient() = default; Web::Page& ConnectionFromClient::page() { return m_page_host->page(); } Web::Page const& ConnectionFromClient::page() const { return m_page_host->page(); } void ConnectionFromClient::start_dedicated_worker(URL const& url, String const& type, String const&, String const&, Web::HTML::TransferDataHolder const& implicit_port, Web::HTML::SerializedEnvironmentSettingsObject const& outside_settings) { m_worker_host = make_ref_counted(url, type); // FIXME: Yikes, const_cast to move? Feels like a LibIPC bug. // We should be able to move non-copyable types from a Message type. m_worker_host->run(page(), move(const_cast(implicit_port)), outside_settings); } void ConnectionFromClient::handle_file_return(i32 error, Optional const& file, i32 request_id) { auto file_request = m_requested_files.take(request_id); VERIFY(file_request.has_value()); VERIFY(file_request.value().on_file_request_finish); file_request.value().on_file_request_finish(error != 0 ? Error::from_errno(error) : ErrorOr { file->take_fd() }); } }