From 903168b3a64f81bfe7e22e924d5ac88422736693 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Wed, 14 May 2025 18:23:26 +0800 Subject: [PATCH] Support the capture field of the addEventListener option addEventListener can take a boolean (capture, already supported) or an object of options. This adds union support for the two, but only supports the `capture` field of the options object. The other fields are not supported by netsurf. --- src/browser/dom/event_target.zig | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/browser/dom/event_target.zig b/src/browser/dom/event_target.zig index d768937a..7a8d21b5 100644 --- a/src/browser/dom/event_target.zig +++ b/src/browser/dom/event_target.zig @@ -42,20 +42,38 @@ pub const EventTarget = struct { // JS funcs // -------- + const AddEventListenerOpts = union(enum) { + opts: Opts, + capture: bool, + + const Opts = struct { + capture: ?bool, + once: ?bool, // currently does nothing + passive: ?bool, // currently does nothing + signal: ?bool, // currently does nothing + }; + }; + pub fn _addEventListener( self: *parser.EventTarget, typ: []const u8, cbk: Env.Callback, - capture: ?bool, + opts_: ?AddEventListenerOpts, state: *SessionState, - // TODO: hanle EventListenerOptions - // see #https://github.com/lightpanda-io/jsruntime-lib/issues/114 ) !void { + var capture = false; + if (opts_) |opts| { + switch (opts) { + .capture => |c| capture = c, + .opts => |o| capture = o.capture orelse false, + } + } + // check if event target has already this listener const lst = try parser.eventTargetHasListener( self, typ, - capture orelse false, + capture, cbk.id, ); if (lst != null) { @@ -68,7 +86,7 @@ pub const EventTarget = struct { self, typ, &eh.node, - capture orelse false, + capture, ); } @@ -172,7 +190,7 @@ test "Browser.DOM.EventTarget" { try runner.testCases(&.{ .{ "nb = 0", "0" }, - .{ "content.removeEventListener('basic', cbk, true)", "undefined" }, + .{ "content.removeEventListener('basic', cbk, {capture: true})", "undefined" }, .{ "content.dispatchEvent(new Event('basic'))", "true" }, .{ "nb", "0" }, }, .{});