From 14b0095822da23086e5dc985f3797372092c084c Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Tue, 17 Feb 2026 09:47:45 +0100 Subject: [PATCH] move page error HTML creation into pageDoneCallback Now pageErrCllaback call pageDoneCallback to finalize the page. --- src/browser/Page.zig | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/browser/Page.zig b/src/browser/Page.zig index 04c35332..257f6750 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -789,6 +789,21 @@ fn pageDoneCallback(ctx: *anyopaque) !void { self._parse_state = .{ .complete = {} }; self.documentIsComplete(); }, + .err => |err| { + // Generate a pseudo HTML page indicating the failure. + const parse_arena = try self.getArena(.{ .debug = "Page.parse" }); + defer self.releaseArena(parse_arena); + + const html = std.mem.concat(parse_arena, u8, &.{ + "

Navigation failed

Reason: ", + @errorName(err), + "

", + }) catch "

Navigation failed

"; + + var parser = Parser.init(parse_arena, self.document.asNode(), self); + parser.parse(html); + self.documentIsComplete(); + }, else => unreachable, } } @@ -797,25 +812,14 @@ fn pageErrorCallback(ctx: *anyopaque, err: anyerror) void { log.err(.page, "navigate failed", .{ .err = err }); var self: *Page = @ptrCast(@alignCast(ctx)); - self.clearTransferArena(); self._parse_state = .{ .err = err }; - defer self.documentIsComplete(); - // Generate a pseudo HTML page indicating the navigation falilure. - const parse_arena = self.getArena(.{ .debug = "Page.parse" }) catch |e| { - log.err(.browser, "get arena on pageErrorCallback", .{ .err = e }); + // In case of error, we want to complete the page with a custom HTML + // containing the error. + pageDoneCallback(ctx) catch |e| { + log.err(.browser, "pageErrorCallback", .{ .err = e }); return; }; - defer self.releaseArena(parse_arena); - - const html = std.mem.concat(parse_arena, u8, &.{ - "

Navigation failed

Reason: ", - @errorName(err), - "

", - }) catch "

Navigation failed

"; - - var parser = Parser.init(parse_arena, self.document.asNode(), self); - parser.parse(html); } // The transfer arena is useful and interesting, but has a weird lifetime.