diff --git a/src/browser/events/event.zig b/src/browser/events/event.zig index 17d192ff..be9a472a 100644 --- a/src/browser/events/event.zig +++ b/src/browser/events/event.zig @@ -72,7 +72,7 @@ pub const Event = struct { .custom_event => .{ .CustomEvent = @as(*CustomEvent, @ptrCast(evt)).* }, .progress_event => .{ .ProgressEvent = @as(*ProgressEvent, @ptrCast(evt)).* }, .mouse_event => .{ .MouseEvent = @as(*parser.MouseEvent, @ptrCast(evt)) }, - .error_event => .{ .ErrorEvent = @as(*ErrorEvent, @ptrCast(evt)).* }, + .error_event => .{ .ErrorEvent = (@as(*ErrorEvent, @fieldParentPtr("proto", evt))).* }, .message_event => .{ .MessageEvent = @as(*MessageEvent, @ptrCast(evt)).* }, .keyboard_event => .{ .KeyboardEvent = @as(*parser.KeyboardEvent, @ptrCast(evt)) }, .pop_state => .{ .PopStateEvent = @as(*PopStateEvent, @ptrCast(evt)).* }, diff --git a/src/browser/html/error_event.zig b/src/browser/html/error_event.zig index 3fc14de7..391d884b 100644 --- a/src/browser/html/error_event.zig +++ b/src/browser/html/error_event.zig @@ -42,7 +42,7 @@ pub const ErrorEvent = struct { const event = try parser.eventCreate(); defer parser.eventDestroy(event); try parser.eventInit(event, event_type, .{}); - parser.eventSetInternalType(event, .event); + parser.eventSetInternalType(event, .error_event); const o = opts orelse ErrorEventInit{}; diff --git a/src/browser/html/window.zig b/src/browser/html/window.zig index 5e03c022..ef015492 100644 --- a/src/browser/html/window.zig +++ b/src/browser/html/window.zig @@ -41,6 +41,7 @@ const Request = @import("../fetch/Request.zig"); const fetchFn = @import("../fetch/fetch.zig").fetch; const storage = @import("../storage/storage.zig"); +const ErrorEvent = @import("error_event.zig").ErrorEvent; // https://dom.spec.whatwg.org/#interface-window-extensions // https://html.spec.whatwg.org/multipage/nav-history-apis.html#window @@ -281,6 +282,25 @@ pub const Window = struct { return out; } + pub fn _reportError(self: *Window, err: js.Object, page: *Page) !void { + var error_event = try ErrorEvent.constructor("error", .{ + .@"error" = err, + }); + _ = try parser.eventTargetDispatchEvent( + parser.toEventTarget(Window, self), + @as(*parser.Event, &error_event.proto), + ); + + if (parser.eventDefaultPrevented(&error_event.proto) == false) { + const err_string = err.toString() catch "Unknown error"; + log.info(.user_script, "error", .{ + .err = err_string, + .stack = page.stackTrace() catch "???", + .source = "window.reportError", + }); + } + } + const CreateTimeoutOpts = struct { name: []const u8, args: []js.Object = &.{}, diff --git a/src/tests/window/window.html b/src/tests/window/window.html index cbe67f5f..918d812f 100644 --- a/src/tests/window/window.html +++ b/src/tests/window/window.html @@ -149,3 +149,19 @@ testing.eventually(() => testing.expectEqual(true, isWindowTarget)); + +