Compositor+LibWebView: Add debug action to crash Compositor

This is very useful for making sure Compositor process recovery works
correctly.
This commit is contained in:
Aliaksandr Kalenik 2026-05-31 20:02:05 +02:00 committed by Alexander Kalenik
parent 123d37b299
commit 538a1522dc
6 changed files with 22 additions and 0 deletions

View file

@ -654,6 +654,17 @@ void Application::notify_compositor_presented_bitmap_ready_to_paint(Web::Composi
m_compositor_client->async_presented_bitmap_ready_to_paint(context_id, bitmap_id);
}
void Application::crash_compositor_process()
{
if (!can_send_compositor_process_ipc(m_compositor_client)) {
warnln("Unable to crash Compositor process: process is not available");
return;
}
VERIFY(m_compositor_client);
m_compositor_client->async_crash();
}
ErrorOr<NonnullRefPtr<WebContentClient>> Application::launch_web_content_process(ViewImplementation& view)
{
if (m_spare_web_content_process) {
@ -1539,6 +1550,7 @@ void Application::initialize_actions()
m_debug_menu->add_action(Action::create("Collect Garbage"sv, ActionID::CollectGarbage, debug_request("collect-garbage"sv)));
m_debug_menu->add_action(Action::create("Crash Current Page"sv, ActionID::CrashCurrentPage, debug_request("crash-current-page"sv)));
m_debug_menu->add_action(Action::create("Crash Compositor Process"sv, ActionID::CrashCompositorProcess, [this]() { crash_compositor_process(); }));
m_debug_menu->add_separator();
auto spoof_user_agent_menu = Menu::create_group("Spoof User Agent"sv);

View file

@ -239,6 +239,7 @@ private:
ErrorOr<void> launch_compositor_process();
void handle_compositor_process_death();
void recover_compositor_process();
void crash_compositor_process();
ErrorOr<void> launch_request_server();
ErrorOr<void> launch_image_decoder_server();
ErrorOr<void> launch_devtools_server();

View file

@ -103,6 +103,7 @@ enum class ActionID {
ShowCaretHitTestDebugOverlay,
CollectGarbage,
CrashCurrentPage,
CrashCompositorProcess,
SpoofUserAgent,
NavigatorCompatibilityMode,
EnableScripting,

View file

@ -20,4 +20,5 @@ endpoint CompositorControlServer
dispatch_mouse_event_to_web_content(Web::Compositor::CompositorContextId context_id, Web::MouseEvent event) => (bool dispatched)
async_scroll_by(Web::Compositor::CompositorContextId context_id, Gfx::FloatPoint position, Gfx::FloatPoint delta_in_device_pixels) => (bool handled)
presented_bitmap_ready_to_paint(Web::Compositor::CompositorContextId context_id, i32 bitmap_id) =|
crash() =|
}

View file

@ -99,6 +99,12 @@ void ConnectionFromClient::presented_bitmap_ready_to_paint(Web::Compositor::Comp
m_compositor_state->presented_bitmap_ready_to_paint(context_id, bitmap_id);
}
void ConnectionFromClient::crash()
{
warnln("Crashing Compositor process by request from Browser");
VERIFY_NOT_REACHED();
}
ConnectionFromWebContent* ConnectionFromClient::web_content_connection(i32 web_content_connection_id)
{
auto it = m_web_content_connections.find(web_content_connection_id);

View file

@ -44,6 +44,7 @@ private:
virtual Messages::CompositorControlServer::DispatchMouseEventToWebContentResponse dispatch_mouse_event_to_web_content(Web::Compositor::CompositorContextId, Web::MouseEvent) override;
virtual Messages::CompositorControlServer::AsyncScrollByResponse async_scroll_by(Web::Compositor::CompositorContextId, Gfx::FloatPoint position, Gfx::FloatPoint delta_in_device_pixels) override;
virtual void presented_bitmap_ready_to_paint(Web::Compositor::CompositorContextId, i32 bitmap_id) override;
virtual void crash() override;
ConnectionFromWebContent* web_content_connection(i32 web_content_connection_id);