xhr: defer event destroy

This commit is contained in:
Pierre Tachoire
2024-02-09 11:43:37 +01:00
parent e79933990d
commit 6aa182c131

View File

@@ -318,6 +318,10 @@ pub const XMLHttpRequest = struct {
const evt = parser.eventCreate() catch |e| { const evt = parser.eventCreate() catch |e| {
return log.err("dispatch event create: {any}", .{e}); return log.err("dispatch event create: {any}", .{e});
}; };
// We can we defer event destroy once the event is dispatched.
defer parser.eventDestroy(evt);
parser.eventInit(evt, typ, .{ .bubbles = true, .cancelable = true }) catch |e| { parser.eventInit(evt, typ, .{ .bubbles = true, .cancelable = true }) catch |e| {
return log.err("dispatch event init: {any}", .{e}); return log.err("dispatch event init: {any}", .{e});
}; };
@@ -331,24 +335,19 @@ pub const XMLHttpRequest = struct {
typ: []const u8, typ: []const u8,
opts: ProgressEvent.EventInit, opts: ProgressEvent.EventInit,
) void { ) void {
// TODO destroy struct var evt = ProgressEvent.constructor(typ, .{
const evt = self.alloc.create(ProgressEvent) catch |e| {
return log.err("allocate progress event: {any}", .{e});
};
evt.* = ProgressEvent.constructor(typ, .{
// https://xhr.spec.whatwg.org/#firing-events-using-the-progressevent-interface // https://xhr.spec.whatwg.org/#firing-events-using-the-progressevent-interface
.lengthComputable = opts.total > 0, .lengthComputable = opts.total > 0,
.total = opts.total, .total = opts.total,
.loaded = opts.loaded, .loaded = opts.loaded,
}) catch |e| { }) catch |e| {
self.alloc.destroy(evt);
return log.err("construct progress event: {any}", .{e}); return log.err("construct progress event: {any}", .{e});
}; };
_ = parser.eventTargetDispatchEvent( _ = parser.eventTargetDispatchEvent(
@as(*parser.EventTarget, @ptrCast(self)), @as(*parser.EventTarget, @ptrCast(self)),
@as(*parser.Event, @ptrCast(evt)), @as(*parser.Event, @ptrCast(&evt)),
) catch |e| { ) catch |e| {
self.alloc.destroy(evt);
return log.err("dispatch progress event: {any}", .{e}); return log.err("dispatch progress event: {any}", .{e});
}; };
} }