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 @@
}
+
+