2025-03-24 09:27:36 -04:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
*/
|
|
|
|
|
|
2026-03-11 13:05:09 +01:00
|
|
|
#include <LibIPC/Transport.h>
|
2026-03-11 20:10:08 +01:00
|
|
|
#include <LibIPC/TransportHandle.h>
|
2025-03-24 09:27:36 -04:00
|
|
|
#include <LibWebView/WebContentClient.h>
|
|
|
|
|
#include <LibWebView/WebUI.h>
|
2025-03-24 09:50:12 -04:00
|
|
|
#include <LibWebView/WebUI/ProcessesUI.h>
|
2025-03-24 10:22:38 -04:00
|
|
|
#include <LibWebView/WebUI/SettingsUI.h>
|
2025-03-24 09:27:36 -04:00
|
|
|
|
|
|
|
|
namespace WebView {
|
|
|
|
|
|
|
|
|
|
template<typename WebUIType>
|
|
|
|
|
static ErrorOr<NonnullRefPtr<WebUIType>> create_web_ui(WebContentClient& client, String host)
|
|
|
|
|
{
|
2026-03-11 13:05:09 +01:00
|
|
|
auto paired = TRY(IPC::Transport::create_paired());
|
2026-03-14 17:34:46 +01:00
|
|
|
auto handle = move(paired.remote_handle);
|
2025-03-24 09:27:36 -04:00
|
|
|
|
2026-03-11 13:05:09 +01:00
|
|
|
auto web_ui = WebUIType::create(client, move(paired.local), move(host));
|
2026-03-11 20:10:08 +01:00
|
|
|
client.async_connect_to_web_ui(0, move(handle));
|
2025-03-24 09:27:36 -04:00
|
|
|
|
|
|
|
|
return web_ui;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-24 09:50:12 -04:00
|
|
|
ErrorOr<RefPtr<WebUI>> WebUI::create(WebContentClient& client, String host)
|
2025-03-24 09:27:36 -04:00
|
|
|
{
|
|
|
|
|
RefPtr<WebUI> web_ui;
|
|
|
|
|
|
2025-03-24 09:50:12 -04:00
|
|
|
if (host == "processes"sv)
|
|
|
|
|
web_ui = TRY(create_web_ui<ProcessesUI>(client, move(host)));
|
2025-03-24 10:22:38 -04:00
|
|
|
else if (host == "settings"sv)
|
|
|
|
|
web_ui = TRY(create_web_ui<SettingsUI>(client, move(host)));
|
2025-03-24 09:50:12 -04:00
|
|
|
|
2025-03-24 09:27:36 -04:00
|
|
|
if (web_ui)
|
|
|
|
|
web_ui->register_interfaces();
|
|
|
|
|
|
|
|
|
|
return web_ui;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-08 22:01:46 +02:00
|
|
|
WebUI::WebUI(WebContentClient& client, NonnullOwnPtr<IPC::Transport> transport, String host)
|
2025-03-24 09:27:36 -04:00
|
|
|
: IPC::ConnectionToServer<WebUIClientEndpoint, WebUIServerEndpoint>(*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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|