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.
This commit is contained in:
Karl Seguin
2025-05-14 18:23:26 +08:00
parent b2605dd30c
commit 903168b3a6

View File

@@ -42,20 +42,38 @@ pub const EventTarget = struct {
// JS funcs // 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( pub fn _addEventListener(
self: *parser.EventTarget, self: *parser.EventTarget,
typ: []const u8, typ: []const u8,
cbk: Env.Callback, cbk: Env.Callback,
capture: ?bool, opts_: ?AddEventListenerOpts,
state: *SessionState, state: *SessionState,
// TODO: hanle EventListenerOptions
// see #https://github.com/lightpanda-io/jsruntime-lib/issues/114
) !void { ) !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 // check if event target has already this listener
const lst = try parser.eventTargetHasListener( const lst = try parser.eventTargetHasListener(
self, self,
typ, typ,
capture orelse false, capture,
cbk.id, cbk.id,
); );
if (lst != null) { if (lst != null) {
@@ -68,7 +86,7 @@ pub const EventTarget = struct {
self, self,
typ, typ,
&eh.node, &eh.node,
capture orelse false, capture,
); );
} }
@@ -172,7 +190,7 @@ test "Browser.DOM.EventTarget" {
try runner.testCases(&.{ try runner.testCases(&.{
.{ "nb = 0", "0" }, .{ "nb = 0", "0" },
.{ "content.removeEventListener('basic', cbk, true)", "undefined" }, .{ "content.removeEventListener('basic', cbk, {capture: true})", "undefined" },
.{ "content.dispatchEvent(new Event('basic'))", "true" }, .{ "content.dispatchEvent(new Event('basic'))", "true" },
.{ "nb", "0" }, .{ "nb", "0" },
}, .{}); }, .{});