Skip to content

Commit 9461b89

Browse files
committed
Signal option for EventHandler
1 parent f5a58c1 commit 9461b89

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

src/browser/events/event.zig

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const CustomEvent = @import("custom_event.zig").CustomEvent;
3232
const ProgressEvent = @import("../xhr/progress_event.zig").ProgressEvent;
3333
const MouseEvent = @import("mouse_event.zig").MouseEvent;
3434
const ErrorEvent = @import("../html/error_event.zig").ErrorEvent;
35+
const AbortSignal = @import("../html/AbortController.zig").AbortSignal;
3536

3637
// Event interfaces
3738
pub const Interfaces = .{ Event, CustomEvent, ProgressEvent, MouseEvent, ErrorEvent };
@@ -144,6 +145,10 @@ pub const EventHandler = struct {
144145
callback: Function,
145146
node: parser.EventNode,
146147
listener: *parser.EventListener,
148+
target: *parser.EventTarget,
149+
typ: []const u8,
150+
abort_node: parser.EventNode,
151+
abort_listener: *parser.EventListener,
147152

148153
const Env = @import("../env.zig").Env;
149154
const Function = Env.Function;
@@ -175,7 +180,7 @@ pub const EventHandler = struct {
175180
// that the listener won't call preventDefault() and thus can safely
176181
// run the default as needed).
177182
passive: ?bool,
178-
signal: ?bool, // currently does nothing
183+
signal: ?*AbortSignal,
179184
};
180185
};
181186

@@ -188,6 +193,7 @@ pub const EventHandler = struct {
188193
) !?*EventHandler {
189194
var once = false;
190195
var capture = false;
196+
var abort_signal: ?*AbortSignal = null;
191197
if (opts_) |opts| {
192198
switch (opts) {
193199
.capture => |c| capture = c,
@@ -198,7 +204,7 @@ pub const EventHandler = struct {
198204
// error. If we don't error, this function call would succeed
199205
// but the behavior might be wrong. At this point, it's
200206
// better to be explicit and error.
201-
if (f.signal orelse false) return error.NotImplemented;
207+
abort_signal = f.signal;
202208
once = f.once orelse false;
203209
capture = f.capture orelse false;
204210
},
@@ -222,6 +228,12 @@ pub const EventHandler = struct {
222228
.func = handle,
223229
},
224230
.listener = undefined,
231+
.target = target,
232+
.typ = typ,
233+
.abort_node = .{
234+
.func = handle_abort,
235+
},
236+
.abort_listener = undefined,
225237
};
226238

227239
eh.listener = try parser.eventTargetAddEventListener(
@@ -230,6 +242,16 @@ pub const EventHandler = struct {
230242
&eh.node,
231243
capture,
232244
);
245+
246+
if (abort_signal) |signal| {
247+
eh.abort_listener = try parser.eventTargetAddEventListener(
248+
parser.toEventTarget(AbortSignal, signal),
249+
"abort",
250+
&eh.abort_node,
251+
false,
252+
);
253+
}
254+
233255
return eh;
234256
}
235257

@@ -260,6 +282,27 @@ pub const EventHandler = struct {
260282
) catch {};
261283
}
262284
}
285+
fn handle_abort(node: *parser.EventNode, event: *parser.Event) void {
286+
const self: *EventHandler = @fieldParentPtr("abort_node", node);
287+
288+
// Remove the event listener from the target
289+
parser.eventTargetRemoveEventListener(
290+
self.target,
291+
self.typ,
292+
self.listener,
293+
self.capture,
294+
) catch {};
295+
296+
// Also remove the abort listener since we can't abort twice anyway
297+
const target_abort = (parser.eventTarget(event) catch return).?;
298+
const typ_abort = parser.eventType(event) catch return;
299+
parser.eventTargetRemoveEventListener(
300+
target_abort,
301+
typ_abort,
302+
self.abort_listener,
303+
false,
304+
) catch {};
305+
}
263306
};
264307

265308
const testing = @import("../../testing.zig");

0 commit comments

Comments
 (0)