Skip to content

Commit 6a30ab7

Browse files
authored
Merge pull request #1156 from lightpanda-io/report_error
add window.reportError
2 parents 758f7de + a9739bf commit 6a30ab7

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

src/browser/events/event.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub const Event = struct {
7474
.custom_event => .{ .CustomEvent = @as(*CustomEvent, @ptrCast(evt)).* },
7575
.progress_event => .{ .ProgressEvent = @as(*ProgressEvent, @ptrCast(evt)).* },
7676
.mouse_event => .{ .MouseEvent = @as(*parser.MouseEvent, @ptrCast(evt)) },
77-
.error_event => .{ .ErrorEvent = @as(*ErrorEvent, @ptrCast(evt)).* },
77+
.error_event => .{ .ErrorEvent = (@as(*ErrorEvent, @fieldParentPtr("proto", evt))).* },
7878
.message_event => .{ .MessageEvent = @as(*MessageEvent, @ptrCast(evt)).* },
7979
.keyboard_event => .{ .KeyboardEvent = @as(*parser.KeyboardEvent, @ptrCast(evt)) },
8080
.pop_state => .{ .PopStateEvent = @as(*PopStateEvent, @ptrCast(evt)).* },

src/browser/html/error_event.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub const ErrorEvent = struct {
4242
const event = try parser.eventCreate();
4343
defer parser.eventDestroy(event);
4444
try parser.eventInit(event, event_type, .{});
45-
parser.eventSetInternalType(event, .event);
45+
parser.eventSetInternalType(event, .error_event);
4646

4747
const o = opts orelse ErrorEventInit{};
4848

src/browser/html/window.zig

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const Request = @import("../fetch/Request.zig");
4141
const fetchFn = @import("../fetch/fetch.zig").fetch;
4242

4343
const storage = @import("../storage/storage.zig");
44+
const ErrorEvent = @import("error_event.zig").ErrorEvent;
4445

4546
// https://dom.spec.whatwg.org/#interface-window-extensions
4647
// https://html.spec.whatwg.org/multipage/nav-history-apis.html#window
@@ -281,6 +282,25 @@ pub const Window = struct {
281282
return out;
282283
}
283284

285+
pub fn _reportError(self: *Window, err: js.Object, page: *Page) !void {
286+
var error_event = try ErrorEvent.constructor("error", .{
287+
.@"error" = err,
288+
});
289+
_ = try parser.eventTargetDispatchEvent(
290+
parser.toEventTarget(Window, self),
291+
@as(*parser.Event, &error_event.proto),
292+
);
293+
294+
if (parser.eventDefaultPrevented(&error_event.proto) == false) {
295+
const err_string = err.toString() catch "Unknown error";
296+
log.info(.user_script, "error", .{
297+
.err = err_string,
298+
.stack = page.stackTrace() catch "???",
299+
.source = "window.reportError",
300+
});
301+
}
302+
}
303+
284304
const CreateTimeoutOpts = struct {
285305
name: []const u8,
286306
args: []js.Object = &.{},

src/tests/window/window.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,19 @@
149149

150150
testing.eventually(() => testing.expectEqual(true, isWindowTarget));
151151
</script>
152+
153+
<script id=reportError>
154+
let errorEventFired = false;
155+
let capturedError = null;
156+
157+
window.addEventListener('error', (e) => {
158+
errorEventFired = true;
159+
capturedError = e.error;
160+
});
161+
162+
const testError = new Error('Test error message');
163+
window.reportError(testError);
164+
165+
testing.expectEqual(true, errorEventFired);
166+
testing.expectEqual(testError, capturedError);
167+
</script>

0 commit comments

Comments
 (0)