LibWebView+WebContent: Implement basic DevTools console support

This commit is contained in:
Timothy Flynn 2025-03-04 08:48:20 -05:00 committed by Tim Flynn
commit ffdce78b7b
Notes: github-actions[bot] 2025-03-04 20:34:44 +00:00
13 changed files with 128 additions and 4 deletions

View file

@ -433,4 +433,34 @@ void Application::evaluate_javascript(DevTools::TabDescription const& descriptio
view->js_console_input(move(script));
}
void Application::listen_for_console_messages(DevTools::TabDescription const& description, OnConsoleMessageAvailable on_console_message_available, OnReceivedConsoleMessages on_received_console_output) const
{
auto view = ViewImplementation::find_view_by_id(description.id);
if (!view.has_value())
return;
view->on_console_message_available = move(on_console_message_available);
view->on_received_unstyled_console_messages = move(on_received_console_output);
view->js_console_request_messages(0);
}
void Application::stop_listening_for_console_messages(DevTools::TabDescription const& description) const
{
auto view = ViewImplementation::find_view_by_id(description.id);
if (!view.has_value())
return;
view->on_console_message_available = nullptr;
view->on_received_unstyled_console_messages = nullptr;
}
void Application::request_console_messages(DevTools::TabDescription const& description, i32 start_index) const
{
auto view = ViewImplementation::find_view_by_id(description.id);
if (!view.has_value())
return;
view->js_console_request_messages(start_index);
}
}

View file

@ -97,6 +97,9 @@ private:
virtual void highlight_dom_node(DevTools::TabDescription const&, Web::UniqueNodeID, Optional<Web::CSS::Selector::PseudoElement::Type>) const override;
virtual void clear_highlighted_dom_node(DevTools::TabDescription const&) const override;
virtual void evaluate_javascript(DevTools::TabDescription const&, String, OnScriptEvaluationComplete) const override;
virtual void listen_for_console_messages(DevTools::TabDescription const&, OnConsoleMessageAvailable, OnReceivedConsoleMessages) const override;
virtual void stop_listening_for_console_messages(DevTools::TabDescription const&) const override;
virtual void request_console_messages(DevTools::TabDescription const&, i32) const override;
static Application* s_the;

View file

@ -4,6 +4,7 @@ set(SOURCES
Application.cpp
Attribute.cpp
ChromeProcess.cpp
ConsoleOutput.cpp
CookieJar.cpp
Database.cpp
HelperProcess.cpp

View file

@ -0,0 +1,29 @@
/*
* Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibIPC/Decoder.h>
#include <LibIPC/Encoder.h>
#include <LibWebView/ConsoleOutput.h>
template<>
ErrorOr<void> IPC::encode(Encoder& encoder, WebView::ConsoleOutput const& console_output)
{
TRY(encoder.encode(console_output.level));
TRY(encoder.encode(console_output.timestamp));
TRY(encoder.encode(console_output.arguments));
return {};
}
template<>
ErrorOr<WebView::ConsoleOutput> IPC::decode(Decoder& decoder)
{
auto level = TRY(decoder.decode<JS::Console::LogLevel>());
auto timestamp = TRY(decoder.decode<UnixDateTime>());
auto arguments = TRY(decoder.decode<Vector<JsonValue>>());
return WebView::ConsoleOutput { level, timestamp, move(arguments) };
}

View file

@ -9,6 +9,7 @@
#include <AK/JsonValue.h>
#include <AK/Time.h>
#include <AK/Vector.h>
#include <LibIPC/Forward.h>
#include <LibJS/Console.h>
namespace WebView {
@ -20,3 +21,13 @@ struct ConsoleOutput {
};
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder&, WebView::ConsoleOutput const&);
template<>
ErrorOr<WebView::ConsoleOutput> decode(Decoder&);
}

View file

@ -218,6 +218,7 @@ public:
Function<void(JsonValue)> on_received_js_console_result;
Function<void(i32 message_id)> on_console_message_available;
Function<void(i32 start_index, Vector<String> const& message_types, Vector<String> const& messages)> on_received_styled_console_messages;
Function<void(i32 start_index, Vector<ConsoleOutput>)> on_received_unstyled_console_messages;
Function<void(i32 count_waiting)> on_resource_status_change;
Function<void()> on_restore_window;
Function<void(Gfx::IntPoint)> on_reposition_window;

View file

@ -385,6 +385,14 @@ void WebContentClient::did_get_styled_js_console_messages(u64 page_id, i32 start
}
}
void WebContentClient::did_get_unstyled_js_console_messages(u64 page_id, i32 start_index, Vector<ConsoleOutput> const& console_output)
{
if (auto view = view_for_page_id(page_id); view.has_value()) {
if (view->on_received_unstyled_console_messages)
view->on_received_unstyled_console_messages(start_index, move(const_cast<Vector<ConsoleOutput>&>(console_output)));
}
}
void WebContentClient::did_request_alert(u64 page_id, String const& message)
{
if (auto view = view_for_page_id(page_id); view.has_value()) {

View file

@ -82,6 +82,7 @@ private:
virtual void did_execute_js_console_input(u64 page_id, JsonValue const&) override;
virtual void did_output_js_console_message(u64 page_id, i32 message_index) override;
virtual void did_get_styled_js_console_messages(u64 page_id, i32 start_index, Vector<String> const& message_types, Vector<String> const& messages) override;
virtual void did_get_unstyled_js_console_messages(u64 page_id, i32 start_index, Vector<ConsoleOutput> const&) override;
virtual void did_change_favicon(u64 page_id, Gfx::ShareableBitmap const&) override;
virtual void did_request_alert(u64 page_id, String const&) override;
virtual void did_request_confirm(u64 page_id, String const&) override;