diff --git a/src/browser/webapi/navigation/NavigationEventTarget.zig b/src/browser/webapi/navigation/NavigationEventTarget.zig
index 581e06cc..44355ae1 100644
--- a/src/browser/webapi/navigation/NavigationEventTarget.zig
+++ b/src/browser/webapi/navigation/NavigationEventTarget.zig
@@ -17,9 +17,13 @@
// along with this program. If not, see .
const std = @import("std");
+const log = @import("../../../log.zig");
+
const js = @import("../../js/js.zig");
const Page = @import("../../Page.zig");
+const IS_DEBUG = @import("builtin").mode == .Debug;
+
const EventTarget = @import("../EventTarget.zig");
const NavigationCurrentEntryChangeEvent = @import("../event/NavigationCurrentEntryChangeEvent.zig");
@@ -43,10 +47,23 @@ pub fn dispatch(self: *NavigationEventTarget, event_type: DispatchType, page: *P
};
};
+ if (comptime IS_DEBUG) {
+ if (page.js.local == null) {
+ log.fatal(.bug, "null context scope", .{.src = "NavigationEventTarget.dispatch", .url = page.url});
+ std.debug.assert(page.js.local != null);
+ }
+ }
+
+ const func = @field(self, field) orelse return;
+
+ var ls: js.Local.Scope = undefined;
+ page.js.localScope(&ls);
+ defer ls.deinit();
+
return page._event_manager.dispatchWithFunction(
self.asEventTarget(),
event,
- page.js.toLocal(@field(self, field)),
+ ls.toLocal(func),
.{ .context = "Navigation" },
);
}
diff --git a/src/browser/webapi/streams/ReadableStream.zig b/src/browser/webapi/streams/ReadableStream.zig
index dbb118b2..bdb88ae3 100644
--- a/src/browser/webapi/streams/ReadableStream.zig
+++ b/src/browser/webapi/streams/ReadableStream.zig
@@ -17,12 +17,16 @@
// along with this program. If not, see .
const std = @import("std");
-const js = @import("../../js/js.zig");
+const log = @import("../../../log.zig");
+const js = @import("../../js/js.zig");
const Page = @import("../../Page.zig");
+
const ReadableStreamDefaultReader = @import("ReadableStreamDefaultReader.zig");
const ReadableStreamDefaultController = @import("ReadableStreamDefaultController.zig");
+const IS_DEBUG = @import("builtin").mode == .Debug;
+
pub fn registerTypes() []const type {
return &.{
ReadableStream,
@@ -137,12 +141,25 @@ pub fn callPullIfNeeded(self: *ReadableStream) !void {
self._pulling = true;
- const pull_fn = self._page.js.toLocal(self._pull_fn) orelse return;
+ if (comptime IS_DEBUG) {
+ if (self._page.js.local == null) {
+ log.fatal(.bug, "null context scope", .{.src = "ReadableStream.callPullIfNeeded", .url = self._page.url});
+ std.debug.assert(self._page.js.local != null);
+ }
+ }
- // Call the pull function
- // Note: In a complete implementation, we'd handle the promise returned by pull
- // and set _pulling = false when it resolves
- try pull_fn.call(void, .{self._controller});
+ {
+ const func = self._pull_fn orelse return;
+
+ var ls: js.Local.Scope = undefined;
+ self._page.js.localScope(&ls);
+ defer ls.deinit();
+
+ // Call the pull function
+ // Note: In a complete implementation, we'd handle the promise returned by pull
+ // and set _pulling = false when it resolves
+ try ls.toLocal(func).call(void, .{self._controller});
+ }
self._pulling = false;
diff --git a/src/browser/webapi/streams/ReadableStreamDefaultController.zig b/src/browser/webapi/streams/ReadableStreamDefaultController.zig
index f51d5798..7d868a11 100644
--- a/src/browser/webapi/streams/ReadableStreamDefaultController.zig
+++ b/src/browser/webapi/streams/ReadableStreamDefaultController.zig
@@ -17,12 +17,16 @@
// along with this program. If not, see .
const std = @import("std");
-const js = @import("../../js/js.zig");
+const log = @import("../../../log.zig");
+const js = @import("../../js/js.zig");
const Page = @import("../../Page.zig");
+
const ReadableStream = @import("ReadableStream.zig");
const ReadableStreamDefaultReader = @import("ReadableStreamDefaultReader.zig");
+const IS_DEBUG = @import("builtin").mode == .Debug;
+
const ReadableStreamDefaultController = @This();
pub const Chunk = union(enum) {
@@ -79,7 +83,19 @@ pub fn enqueue(self: *ReadableStreamDefaultController, chunk: Chunk) !void {
.done = false,
.value = .fromChunk(chunk),
};
- self._page.js.toLocal(resolver).resolve("stream enqueue", result);
+
+ if (comptime IS_DEBUG) {
+ if (self._page.js.local == null) {
+ log.fatal(.bug, "null context scope", .{.src = "ReadableStreamDefaultController.enqueue", .url = self._page.url});
+ std.debug.assert(self._page.js.local != null);
+ }
+ }
+
+ var ls: js.Local.Scope = undefined;
+ self._page.js.localScope(&ls);
+ defer ls.deinit();
+
+ ls.toLocal(resolver).resolve("stream enqueue", result);
}
pub fn close(self: *ReadableStreamDefaultController) !void {
@@ -94,9 +110,21 @@ pub fn close(self: *ReadableStreamDefaultController) !void {
.done = true,
.value = .empty,
};
- for (self._pending_reads.items) |resolver| {
- self._page.js.toLocal(resolver).resolve("stream close", result);
+
+ if (comptime IS_DEBUG) {
+ if (self._page.js.local == null) {
+ log.fatal(.bug, "null context scope", .{.src = "ReadableStreamDefaultController.close", .url = self._page.url});
+ std.debug.assert(self._page.js.local != null);
+ }
}
+
+ for (self._pending_reads.items) |resolver| {
+ var ls: js.Local.Scope = undefined;
+ self._page.js.localScope(&ls);
+ defer ls.deinit();
+ ls.toLocal(resolver).resolve("stream close", result);
+ }
+
self._pending_reads.clearRetainingCapacity();
}