diff --git a/src/browser/js/Local.zig b/src/browser/js/Local.zig index e9d9d9d9..4c5d1fba 100644 --- a/src/browser/js/Local.zig +++ b/src/browser/js/Local.zig @@ -453,6 +453,13 @@ pub fn jsValueToZig(self: *const Local, comptime T: type, js_val: js.Value) !T { return js_val; } + if (comptime o.child == js.NullableString) { + if (js_val.isUndefined()) { + return null; + } + return .{ .value = try js_val.toStringSlice() }; + } + if (comptime o.child == js.Object) { return js.Object{ .local = self, diff --git a/src/browser/js/js.zig b/src/browser/js/js.zig index 112cc596..9415b717 100644 --- a/src/browser/js/js.zig +++ b/src/browser/js/js.zig @@ -168,6 +168,16 @@ pub fn ArrayBufferRef(comptime kind: ArrayType) type { }; } +// If a WebAPI takes a []const u8, then we'll coerce any JS value to that string +// so null -> "null". But if a WebAPI takes an optional string, ?[]const u8, +// how should we handle null? If the parameter _isn't_ passed, then it's obvious +// that it should be null, but what if `null` is passed? It's ambiguous, should +// that be null, or "null"? It could depend on the api. So, `null` passed to +// ?[]const u8 will be `null`. If you want it to be "null", use a `.js.NullableString`. +pub const NullableString = struct { + value: []const u8, +}; + pub const Exception = struct { local: *const Local, handle: *const v8.Value, diff --git a/src/browser/tests/cdata/comment.html b/src/browser/tests/cdata/comment.html index 453da384..e1e0e0a4 100644 --- a/src/browser/tests/cdata/comment.html +++ b/src/browser/tests/cdata/comment.html @@ -4,4 +4,6 @@ diff --git a/src/browser/tests/cdata/text/text.html b/src/browser/tests/cdata/text.html similarity index 81% rename from src/browser/tests/cdata/text/text.html rename to src/browser/tests/cdata/text.html index 9c5ac3d1..1278deb0 100644 --- a/src/browser/tests/cdata/text/text.html +++ b/src/browser/tests/cdata/text.html @@ -1,7 +1,7 @@ OK - + diff --git a/src/browser/tests/domimplementation.html b/src/browser/tests/domimplementation.html index 1d524e0d..302db88a 100644 --- a/src/browser/tests/domimplementation.html +++ b/src/browser/tests/domimplementation.html @@ -108,6 +108,20 @@ } + +