From f9087d384000143efa9eaa68acd2b87d7272041e Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 4 Nov 2025 20:11:26 +0800 Subject: [PATCH] ignore errorCallback on shutdown --- src/browser/ScriptManager.zig | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/browser/ScriptManager.zig b/src/browser/ScriptManager.zig index 6bf69938..e51b3b07 100644 --- a/src/browser/ScriptManager.zig +++ b/src/browser/ScriptManager.zig @@ -103,7 +103,9 @@ pub fn init(browser: *Browser, page: *Page) ScriptManager { } pub fn deinit(self: *ScriptManager) void { + // necesasry to free any buffers scripts may be rerferencing self.reset(); + self.buffer_pool.deinit(); self.script_pool.deinit(); self.imported_modules.deinit(self.allocator); @@ -227,6 +229,10 @@ pub fn addFromElement(self: *ScriptManager, element: *parser.Element, comptime c }, }; + const list = self.scriptList(script); + list.append(&script.node); + errdefer list.remove(&script.node); + if (remote_url) |url| { var headers = try self.client.newHeaders(); try page.requestCookie(.{}).headersForRequest(page.arena, url, &headers); @@ -251,8 +257,6 @@ pub fn addFromElement(self: *ScriptManager, element: *parser.Element, comptime c .stack = page.js.stackTrace() catch "???", }); } - - self.scriptList(script).append(&script.node); } fn scriptList(self: *ScriptManager, script: *const Script) *std.DoublyLinkedList { @@ -447,8 +451,10 @@ fn evaluate(self: *ScriptManager) void { if (script.complete == false) { return; } - defer script.deinit(true); - defer _ = self.normal_scripts.popFirst(); + defer { + _ = self.normal_scripts.popFirst(); + script.deinit(true); + } script.eval(page); } @@ -468,8 +474,10 @@ fn evaluate(self: *ScriptManager) void { if (script.complete == false) { return; } - defer script.deinit(true); - defer _ = self.defer_scripts.popFirst(); + defer { + _ = self.defer_scripts.popFirst(); + script.deinit(true); + } script.eval(page); } @@ -640,8 +648,14 @@ const Script = struct { fn errorCallback(ctx: *anyopaque, err: anyerror) void { const self: *Script = @ptrCast(@alignCast(ctx)); log.warn(.http, "script fetch error", .{ .req = self.url, .err = err }); + const manager = self.manager; manager.scriptList(self).remove(&self.node); + if (manager.shutdown) { + self.deinit(true); + return; + } + if (self.mode == .import) { const entry = self.manager.imported_modules.getPtr(self.url).?; entry.* = error.Failed;