/* * 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) { auto paired = TRY(IPC::Transport::create_paired()); auto handle = move(paired.remote_handle); auto web_ui = WebUIType::create(client, move(paired.local), move(host)); client.async_connect_to_web_ui(0, move(handle)); 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)); } }