diff --git a/src/browser/Page.zig b/src/browser/Page.zig index 6d6828bc..2d64f1fe 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -332,6 +332,10 @@ pub fn deinit(self: *Page) void { // stats.print(&stream) catch unreachable; } + if (self._queued_navigation) |qn| { + self.arena_pool.release(qn.arena); + } + const session = self._session; session.browser.env.destroyContext(self.js); @@ -585,6 +589,10 @@ fn scheduleNavigationWithArena(self: *Page, arena: Allocator, request_url: []con .url = resolved_url, .priority = priority, }; + + if (self._queued_navigation) |existing| { + self.arena_pool.release(existing.arena); + } self._queued_navigation = qn; } @@ -917,9 +925,9 @@ fn pageDoneCallback(ctx: *anyopaque) !void { } fn pageErrorCallback(ctx: *anyopaque, err: anyerror) void { - log.err(.page, "navigate failed", .{ .err = err, .type = self._type }); - var self: *Page = @ptrCast(@alignCast(ctx)); + + log.err(.page, "navigate failed", .{ .err = err, .type = self._type }); self._parse_state = .{ .err = err }; // In case of error, we want to complete the page with a custom HTML diff --git a/src/browser/Session.zig b/src/browser/Session.zig index c61cd4f7..9a3abf20 100644 --- a/src/browser/Session.zig +++ b/src/browser/Session.zig @@ -176,8 +176,10 @@ pub fn wait(self: *Session, wait_ms: u32) WaitResult { switch (wait_result) { .done => { - const qn = page._queued_navigation orelse return .done; - page = self.processScheduledNavigation(qn) catch return .done; + if (page._queued_navigation == null) { + return .done; + } + page = self.processScheduledNavigation(page) catch return .done; }, else => |result| return result, } @@ -322,8 +324,12 @@ fn _wait(self: *Session, page: *Page, wait_ms: u32) !WaitResult { } } -fn processScheduledNavigation(self: *Session, qn: *Page.QueuedNavigation) !*Page { +fn processScheduledNavigation(self: *Session, current_page: *Page) !*Page { const browser = self.browser; + + const qn = current_page._queued_navigation.?; + // take ownership of the page's queued navigation + current_page._queued_navigation = null; defer browser.arena_pool.release(qn.arena); const page_id, const parent = blk: {