ladybird/Libraries/LibWebView/WebUI.cpp
Timothy Flynn 496c88d0c9 LibWebView: Add about:history to view, query and mangage browser history
This adds a WebUI to view the local browsing history, with controls to
search and delete entries. The APIs used to search history are paginated
to prevent excessive query sizes.
2026-06-10 20:27:36 +02:00

85 lines
2.4 KiB
C++

/*
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibIPC/Transport.h>
#include <LibIPC/TransportHandle.h>
#include <LibWebView/WebContentClient.h>
#include <LibWebView/WebUI.h>
#include <LibWebView/WebUI/BookmarksUI.h>
#include <LibWebView/WebUI/HistoryUI.h>
#include <LibWebView/WebUI/ProcessesUI.h>
#include <LibWebView/WebUI/SettingsUI.h>
#include <LibWebView/WebUI/VersionUI.h>
namespace WebView {
template<typename WebUIType>
static ErrorOr<NonnullRefPtr<WebUIType>> create_web_ui(WebContentClient& client, u64 page_id, String host)
{
VERIFY(page_id > 0);
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(page_id, move(handle));
return web_ui;
}
ErrorOr<RefPtr<WebUI>> WebUI::create(WebContentClient& client, u64 page_id, String host)
{
RefPtr<WebUI> web_ui;
if (host == "bookmarks"sv)
web_ui = TRY(create_web_ui<BookmarksUI>(client, page_id, move(host)));
else if (host == "history"sv)
web_ui = TRY(create_web_ui<HistoryUI>(client, page_id, move(host)));
else if (host == "processes"sv)
web_ui = TRY(create_web_ui<ProcessesUI>(client, page_id, move(host)));
else if (host == "settings"sv)
web_ui = TRY(create_web_ui<SettingsUI>(client, page_id, move(host)));
else if (host == "version"sv)
web_ui = TRY(create_web_ui<VersionUI>(client, page_id, move(host)));
if (web_ui)
web_ui->register_interfaces();
return web_ui;
}
WebUI::WebUI(WebContentClient& client, NonnullOwnPtr<IPC::Transport> transport, String host)
: 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));
}
}