From cdf0cdd0ea60899a63dbfad0023264d136726b76 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 9 Jan 2026 14:27:00 +0800 Subject: [PATCH 1/2] Don't require handleEvent function to be on object event listener When registering an object as an event listener, the handleEvent function doesn't have to be defined then and there. The handleEvent function can be added at any point in the future. --- src/browser/webapi/EventTarget.zig | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/browser/webapi/EventTarget.zig b/src/browser/webapi/EventTarget.zig index 16c48466..ff3d060a 100644 --- a/src/browser/webapi/EventTarget.zig +++ b/src/browser/webapi/EventTarget.zig @@ -67,12 +67,6 @@ pub const EventListenerCallback = union(enum) { pub fn addEventListener(self: *EventTarget, typ: []const u8, callback_: ?EventListenerCallback, opts_: ?AddEventListenerOptions, page: *Page) !void { const callback = callback_ orelse return; - if (callback == .object) { - if (try callback.object.getFunction("handleEvent") == null) { - return; - } - } - const em_callback = switch (callback) { .function => |func| EventManager.Callback{ .function = func }, .object => |obj| EventManager.Callback{ .object = try obj.persist() }, From e5f2fbdcb2b473997ec79a8486b7af5e90d644ef Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 9 Jan 2026 14:37:34 +0800 Subject: [PATCH 2/2] clear isTrusted on redispatch and prevent redispatching while dispatching --- src/browser/webapi/EventTarget.zig | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/browser/webapi/EventTarget.zig b/src/browser/webapi/EventTarget.zig index ff3d060a..1c75b0f0 100644 --- a/src/browser/webapi/EventTarget.zig +++ b/src/browser/webapi/EventTarget.zig @@ -51,6 +51,10 @@ pub fn init(page: *Page) !*EventTarget { } pub fn dispatchEvent(self: *EventTarget, event: *Event, page: *Page) !bool { + if (event._event_phase != .none) { + return error.InvalidStateError; + } + event._isTrusted = false; try page._event_manager.dispatch(self, event); return !event._cancelable or !event._prevent_default; } @@ -158,7 +162,7 @@ pub const JsApi = struct { }; pub const constructor = bridge.constructor(EventTarget.init, .{}); - pub const dispatchEvent = bridge.function(EventTarget.dispatchEvent, .{}); + pub const dispatchEvent = bridge.function(EventTarget.dispatchEvent, .{ .dom_exception = true }); pub const addEventListener = bridge.function(EventTarget.addEventListener, .{}); pub const removeEventListener = bridge.function(EventTarget.removeEventListener, .{}); };