diff --git a/src/browser/webapi/AbortController.zig b/src/browser/webapi/AbortController.zig index 3d6a30040..67d3d0453 100644 --- a/src/browser/webapi/AbortController.zig +++ b/src/browser/webapi/AbortController.zig @@ -37,8 +37,8 @@ pub fn getSignal(self: *const AbortController) *AbortSignal { return self._signal; } -pub fn abort(self: *AbortController, reason_: ?js.Value.Global, exec: *const Execution) !void { - try self._signal.abort(if (reason_) |r| .{ .js_val = r } else null, exec); +pub fn abort(self: *AbortController, reason_: ?js.Value, exec: *const Execution) !void { + try self._signal.abort(try AbortSignal.reasonFromJs(reason_), exec); } pub const JsApi = struct { diff --git a/src/browser/webapi/AbortSignal.zig b/src/browser/webapi/AbortSignal.zig index 75d8e69b3..64cbd2752 100644 --- a/src/browser/webapi/AbortSignal.zig +++ b/src/browser/webapi/AbortSignal.zig @@ -149,10 +149,21 @@ fn dispatchAbortEvent(self: *AbortSignal, exec: *const Execution) !void { } } +// Converts an abort(reason) JS argument to a Reason. Per spec, only a +// missing or undefined reason falls back to the default "AbortError" +// DOMException: an explicit null (or any other value) is kept as-is. +pub fn reasonFromJs(reason_: ?js.Value) !?Reason { + const reason = reason_ orelse return null; + if (reason.isUndefined()) { + return null; + } + return .{ .js_val = try reason.persist() }; +} + // Static method to create an already-aborted signal -pub fn createAborted(reason_: ?js.Value.Global, exec: *const Execution) !*AbortSignal { +pub fn createAborted(reason_: ?js.Value, exec: *const Execution) !*AbortSignal { const signal = try init(exec); - try signal.abort(if (reason_) |r| .{ .js_val = r } else null, exec); + try signal.abort(try reasonFromJs(reason_), exec); return signal; }