@@ -32,6 +32,7 @@ const CustomEvent = @import("custom_event.zig").CustomEvent;
3232const ProgressEvent = @import ("../xhr/progress_event.zig" ).ProgressEvent ;
3333const MouseEvent = @import ("mouse_event.zig" ).MouseEvent ;
3434const ErrorEvent = @import ("../html/error_event.zig" ).ErrorEvent ;
35+ const AbortSignal = @import ("../html/AbortController.zig" ).AbortSignal ;
3536
3637// Event interfaces
3738pub 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
265308const testing = @import ("../../testing.zig" );
0 commit comments