/* * Copyright (c) 2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include namespace WebView { template static ErrorOr> create_web_ui(WebContentClient& client, String host) { Array socket_fds { 0, 0 }; TRY(Core::System::socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fds.data())); auto client_socket = Core::LocalSocket::adopt_fd(socket_fds[0]); if (client_socket.is_error()) { close(socket_fds[0]); close(socket_fds[1]); return client_socket.release_error(); } auto web_ui = WebUIType::create(client, make(client_socket.release_value()), move(host)); client.async_connect_to_web_ui(0, IPC::File::adopt_fd(socket_fds[1])); return web_ui; } ErrorOr> WebUI::create(WebContentClient& client, String host) { RefPtr web_ui; if (host == "processes"sv) web_ui = TRY(create_web_ui(client, move(host))); else if (host == "settings"sv) web_ui = TRY(create_web_ui(client, move(host))); if (web_ui) web_ui->register_interfaces(); return web_ui; } WebUI::WebUI(WebContentClient& client, NonnullOwnPtr transport, String host) : IPC::ConnectionToServer(*this, move(transport)) , m_client(client) , m_host(move(host)) { } WebUI::~WebUI() = default; void WebUI::die() { m_client.web_ui_disconnected({}); } void WebUI::register_interface(StringView name, Interface interface) { auto result = m_interfaces.set(name, move(interface)); VERIFY(result == HashSetResult::InsertedNewEntry); } void WebUI::received_message(String name, JsonValue data) { auto interface = m_interfaces.get(name); if (!interface.has_value()) { warnln("Received message from WebUI for unrecognized interface: {}", name); return; } interface.value()(move(data)); } }