LibDevTools+LibWebView+WebContent: Report exceptions to DevTools

This commit is contained in:
Timothy Flynn 2025-03-27 08:48:14 -04:00 committed by Jelle Raaijmakers
commit 9eca5febd1
Notes: github-actions[bot] 2025-03-27 14:15:04 +00:00
4 changed files with 232 additions and 45 deletions

View file

@ -9,11 +9,72 @@
#include <LibWebView/ConsoleOutput.h>
template<>
ErrorOr<void> IPC::encode(Encoder& encoder, WebView::ConsoleOutput const& console_output)
ErrorOr<void> IPC::encode(Encoder& encoder, WebView::ConsoleLog const& log)
{
TRY(encoder.encode(console_output.level));
TRY(encoder.encode(console_output.timestamp));
TRY(encoder.encode(console_output.arguments));
TRY(encoder.encode(log.level));
TRY(encoder.encode(log.arguments));
return {};
}
template<>
ErrorOr<WebView::ConsoleLog> IPC::decode(Decoder& decoder)
{
auto level = TRY(decoder.decode<JS::Console::LogLevel>());
auto arguments = TRY(decoder.decode<Vector<JsonValue>>());
return WebView::ConsoleLog { level, move(arguments) };
}
template<>
ErrorOr<void> IPC::encode(Encoder& encoder, WebView::StackFrame const& frame)
{
TRY(encoder.encode(frame.function));
TRY(encoder.encode(frame.file));
TRY(encoder.encode(frame.line));
TRY(encoder.encode(frame.column));
return {};
}
template<>
ErrorOr<WebView::StackFrame> IPC::decode(Decoder& decoder)
{
auto function = TRY(decoder.decode<Optional<String>>());
auto file = TRY(decoder.decode<Optional<String>>());
auto line = TRY(decoder.decode<Optional<size_t>>());
auto column = TRY(decoder.decode<Optional<size_t>>());
return WebView::StackFrame { move(function), move(file), line, column };
}
template<>
ErrorOr<void> IPC::encode(Encoder& encoder, WebView::ConsoleError const& error)
{
TRY(encoder.encode(error.name));
TRY(encoder.encode(error.message));
TRY(encoder.encode(error.trace));
TRY(encoder.encode(error.inside_promise));
return {};
}
template<>
ErrorOr<WebView::ConsoleError> IPC::decode(Decoder& decoder)
{
auto name = TRY(decoder.decode<String>());
auto message = TRY(decoder.decode<String>());
auto trace = TRY(decoder.decode<Vector<WebView::StackFrame>>());
auto inside_promise = TRY(decoder.decode<bool>());
return WebView::ConsoleError { move(name), move(message), move(trace), inside_promise };
}
template<>
ErrorOr<void> IPC::encode(Encoder& encoder, WebView::ConsoleOutput const& output)
{
TRY(encoder.encode(output.timestamp));
TRY(encoder.encode(output.output));
return {};
}
@ -21,9 +82,8 @@ ErrorOr<void> IPC::encode(Encoder& encoder, WebView::ConsoleOutput const& consol
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>>());
auto output = TRY(decoder.decode<Variant<WebView::ConsoleLog, WebView::ConsoleError>>());
return WebView::ConsoleOutput { level, timestamp, move(arguments) };
return WebView::ConsoleOutput { timestamp, move(output) };
}

View file

@ -7,23 +7,61 @@
#pragma once
#include <AK/JsonValue.h>
#include <AK/String.h>
#include <AK/Time.h>
#include <AK/Variant.h>
#include <AK/Vector.h>
#include <LibIPC/Forward.h>
#include <LibJS/Console.h>
namespace WebView {
struct ConsoleOutput {
struct ConsoleLog {
JS::Console::LogLevel level;
UnixDateTime timestamp;
Vector<JsonValue> arguments;
};
struct StackFrame {
Optional<String> function;
Optional<String> file;
Optional<size_t> line;
Optional<size_t> column;
};
struct ConsoleError {
String name;
String message;
Vector<StackFrame> trace;
bool inside_promise { false };
};
struct ConsoleOutput {
UnixDateTime timestamp;
Variant<ConsoleLog, ConsoleError> output;
};
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder&, WebView::ConsoleLog const&);
template<>
ErrorOr<WebView::ConsoleLog> decode(Decoder&);
template<>
ErrorOr<void> encode(Encoder&, WebView::StackFrame const&);
template<>
ErrorOr<WebView::StackFrame> decode(Decoder&);
template<>
ErrorOr<void> encode(Encoder&, WebView::ConsoleError const&);
template<>
ErrorOr<WebView::ConsoleError> decode(Decoder&);
template<>
ErrorOr<void> encode(Encoder&, WebView::ConsoleOutput const&);