LibWeb+LibWebView+WebContent: Convert about:processes to a WebUI

This commit is contained in:
Timothy Flynn 2025-03-24 09:50:12 -04:00 committed by Tim Flynn
commit c75e40180c
Notes: github-actions[bot] 2025-03-28 11:32:11 +00:00
22 changed files with 96 additions and 140 deletions

View file

@ -324,19 +324,6 @@ Optional<Process&> Application::find_process(pid_t pid)
return m_process_manager.find_process(pid);
}
void Application::send_updated_process_statistics_to_view(ViewImplementation& view)
{
m_process_manager.update_all_process_statistics();
auto statistics = m_process_manager.serialize_json();
StringBuilder builder;
builder.append("processes.loadProcessStatistics(\""sv);
builder.append_escaped_for_json(statistics);
builder.append("\");"sv);
view.run_javascript(MUST(builder.to_string()));
}
void Application::send_current_settings_to_view(ViewImplementation& view)
{
auto settings = m_settings.serialize_json();

View file

@ -46,6 +46,8 @@ public:
static CookieJar& cookie_jar() { return *the().m_cookie_jar; }
static ProcessManager& process_manager() { return the().m_process_manager; }
Core::EventLoop& event_loop() { return m_event_loop; }
ErrorOr<NonnullRefPtr<WebContentClient>> launch_web_content_process(ViewImplementation&);
@ -59,8 +61,6 @@ public:
#endif
Optional<Process&> find_process(pid_t);
void send_updated_process_statistics_to_view(ViewImplementation&);
void send_current_settings_to_view(ViewImplementation&);
void send_available_search_engines_to_view(ViewImplementation&);

View file

@ -25,6 +25,7 @@ set(SOURCES
ViewImplementation.cpp
WebContentClient.cpp
WebUI.cpp
WebUI/ProcessesUI.cpp
)
if (APPLE)

View file

@ -4,8 +4,8 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/JsonArraySerializer.h>
#include <AK/JsonObjectSerializer.h>
#include <AK/JsonArray.h>
#include <AK/JsonObject.h>
#include <AK/String.h>
#include <LibCore/EventLoop.h>
#include <LibCore/System.h>
@ -126,12 +126,10 @@ void ProcessManager::update_all_process_statistics()
(void)update_process_statistics(m_statistics);
}
String ProcessManager::serialize_json()
JsonValue ProcessManager::serialize_json()
{
Threading::MutexLocker locker { m_lock };
StringBuilder builder;
auto serializer = MUST(JsonArraySerializer<>::try_create(builder));
JsonArray serialized;
m_statistics.for_each_process([&](auto const& process) {
auto& process_handle = find_process(process.pid).value();
@ -143,16 +141,15 @@ String ProcessManager::serialize_json()
? MUST(String::formatted("{} - {}", type, *title))
: String::from_utf8_without_validation(type.bytes());
auto object = MUST(serializer.add_object());
MUST(object.add("name"sv, move(process_name)));
MUST(object.add("pid"sv, process.pid));
MUST(object.add("cpu"sv, process.cpu_percent));
MUST(object.add("memory"sv, process.memory_usage_bytes));
MUST(object.finish());
JsonObject object;
object.set("name"sv, move(process_name));
object.set("pid"sv, process.pid);
object.set("cpu"sv, process.cpu_percent);
object.set("memory"sv, process.memory_usage_bytes);
serialized.must_append(move(object));
});
MUST(serializer.finish());
return MUST(builder.to_string());
return serialized;
}
}

View file

@ -6,6 +6,7 @@
#pragma once
#include <AK/JsonValue.h>
#include <AK/Types.h>
#include <LibCore/Platform/ProcessStatistics.h>
#include <LibThreading/Mutex.h>
@ -34,7 +35,7 @@ public:
#endif
void update_all_process_statistics();
String serialize_json();
JsonValue serialize_json();
Function<void(Process&&)> on_process_exited;

View file

@ -669,12 +669,6 @@ Messages::WebContentClient::RequestWorkerAgentResponse WebContentClient::request
return IPC::File {};
}
void WebContentClient::update_process_statistics(u64 page_id)
{
if (auto view = view_for_page_id(page_id); view.has_value())
WebView::Application::the().send_updated_process_statistics_to_view(*view);
}
void WebContentClient::request_current_settings(u64 page_id)
{
if (auto view = view_for_page_id(page_id); view.has_value())

View file

@ -130,7 +130,6 @@ private:
virtual void did_update_navigation_buttons_state(u64 page_id, bool back_enabled, bool forward_enabled) override;
virtual void did_allocate_backing_stores(u64 page_id, i32 front_bitmap_id, Gfx::ShareableBitmap, i32 back_bitmap_id, Gfx::ShareableBitmap) override;
virtual Messages::WebContentClient::RequestWorkerAgentResponse request_worker_agent(u64 page_id) override;
virtual void update_process_statistics(u64 page_id) override;
virtual void request_current_settings(u64 page_id) override;
virtual void restore_default_settings(u64 page_id) override;
virtual void set_new_tab_page_url(u64 page_id, URL::URL new_tab_page_url) override;

View file

@ -8,6 +8,7 @@
#include <LibCore/System.h>
#include <LibWebView/WebContentClient.h>
#include <LibWebView/WebUI.h>
#include <LibWebView/WebUI/ProcessesUI.h>
namespace WebView {
@ -31,10 +32,13 @@ static ErrorOr<NonnullRefPtr<WebUIType>> create_web_ui(WebContentClient& client,
return web_ui;
}
ErrorOr<RefPtr<WebUI>> WebUI::create(WebContentClient&, String)
ErrorOr<RefPtr<WebUI>> WebUI::create(WebContentClient& client, String host)
{
RefPtr<WebUI> web_ui;
if (host == "processes"sv)
web_ui = TRY(create_web_ui<ProcessesUI>(client, move(host)));
if (web_ui)
web_ui->register_interfaces();

View file

@ -0,0 +1,28 @@
/*
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWebView/Application.h>
#include <LibWebView/ProcessManager.h>
#include <LibWebView/WebUI/ProcessesUI.h>
namespace WebView {
void ProcessesUI::register_interfaces()
{
register_interface("updateProcessStatistics"sv, [this](auto const&) {
update_process_statistics();
});
}
void ProcessesUI::update_process_statistics()
{
auto& process_manager = Application::process_manager();
process_manager.update_all_process_statistics();
async_send_message("loadProcessStatistics"sv, process_manager.serialize_json());
}
}

View file

@ -0,0 +1,22 @@
/*
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWebView/WebUI.h>
namespace WebView {
class ProcessesUI : public WebUI {
WEB_UI(ProcessesUI);
private:
virtual void register_interfaces() override;
void update_process_statistics();
};
}