ignore errorCallback on shutdown

This commit is contained in:
Karl Seguin
2025-11-04 20:11:26 +08:00
parent 7c825cbe82
commit f9087d3840

View File

@@ -103,7 +103,9 @@ pub fn init(browser: *Browser, page: *Page) ScriptManager {
} }
pub fn deinit(self: *ScriptManager) void { pub fn deinit(self: *ScriptManager) void {
// necesasry to free any buffers scripts may be rerferencing
self.reset(); self.reset();
self.buffer_pool.deinit(); self.buffer_pool.deinit();
self.script_pool.deinit(); self.script_pool.deinit();
self.imported_modules.deinit(self.allocator); 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| { if (remote_url) |url| {
var headers = try self.client.newHeaders(); var headers = try self.client.newHeaders();
try page.requestCookie(.{}).headersForRequest(page.arena, url, &headers); 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 "???", .stack = page.js.stackTrace() catch "???",
}); });
} }
self.scriptList(script).append(&script.node);
} }
fn scriptList(self: *ScriptManager, script: *const Script) *std.DoublyLinkedList { fn scriptList(self: *ScriptManager, script: *const Script) *std.DoublyLinkedList {
@@ -447,8 +451,10 @@ fn evaluate(self: *ScriptManager) void {
if (script.complete == false) { if (script.complete == false) {
return; return;
} }
defer script.deinit(true); defer {
defer _ = self.normal_scripts.popFirst(); _ = self.normal_scripts.popFirst();
script.deinit(true);
}
script.eval(page); script.eval(page);
} }
@@ -468,8 +474,10 @@ fn evaluate(self: *ScriptManager) void {
if (script.complete == false) { if (script.complete == false) {
return; return;
} }
defer script.deinit(true); defer {
defer _ = self.defer_scripts.popFirst(); _ = self.defer_scripts.popFirst();
script.deinit(true);
}
script.eval(page); script.eval(page);
} }
@@ -640,8 +648,14 @@ const Script = struct {
fn errorCallback(ctx: *anyopaque, err: anyerror) void { fn errorCallback(ctx: *anyopaque, err: anyerror) void {
const self: *Script = @ptrCast(@alignCast(ctx)); const self: *Script = @ptrCast(@alignCast(ctx));
log.warn(.http, "script fetch error", .{ .req = self.url, .err = err }); log.warn(.http, "script fetch error", .{ .req = self.url, .err = err });
const manager = self.manager; const manager = self.manager;
manager.scriptList(self).remove(&self.node); manager.scriptList(self).remove(&self.node);
if (manager.shutdown) {
self.deinit(true);
return;
}
if (self.mode == .import) { if (self.mode == .import) {
const entry = self.manager.imported_modules.getPtr(self.url).?; const entry = self.manager.imported_modules.getPtr(self.url).?;
entry.* = error.Failed; entry.* = error.Failed;