From 76a9034668ba2d9ff4bdc4e964e3fa10dd1e61f9 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 7 Oct 2024 21:14:55 +0200 Subject: [PATCH] server: newSession on disposeBrowserContext Signed-off-by: Francis Bouvier --- src/browser/browser.zig | 5 +++++ src/cdp/target.zig | 8 ++++++-- src/server.zig | 20 ++++++++++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/browser/browser.zig b/src/browser/browser.zig index 944d590b..8c13d63e 100644 --- a/src/browser/browser.zig +++ b/src/browser/browser.zig @@ -64,6 +64,11 @@ pub const Browser = struct { self.session.deinit(); } + pub fn newSession(self: *Browser, alloc: std.mem.Allocator, loop: *jsruntime.Loop) !void { + self.session.deinit(); + self.session = try Session.init(alloc, loop, "about:blank"); + } + pub fn currentSession(self: *Browser) *Session { return self.session; } diff --git a/src/cdp/target.zig b/src/cdp/target.zig index 0221f0e4..5774f570 100644 --- a/src/cdp/target.zig +++ b/src/cdp/target.zig @@ -226,7 +226,7 @@ fn disposeBrowserContext( alloc: std.mem.Allocator, id: ?u16, scanner: *std.json.Scanner, - _: *Ctx, + ctx: *Ctx, ) ![]const u8 { // input @@ -236,7 +236,11 @@ fn disposeBrowserContext( const msg = try getMsg(alloc, Params, scanner); // output - return result(alloc, id orelse msg.id.?, null, {}, null); + const res = try result(alloc, id orelse msg.id.?, null, .{}, null); + defer alloc.free(res); + try server.sendSync(ctx, res); + + return error.DisposeBrowserContext; } // TODO: hard coded IDs diff --git a/src/server.zig b/src/server.zig index a2249bec..d13d4863 100644 --- a/src/server.zig +++ b/src/server.zig @@ -82,7 +82,10 @@ pub const Cmd = struct { } // read and execute input - self.msg_buf.read(self.alloc(), input, self, Cmd.do) catch unreachable; + self.msg_buf.read(self.alloc(), input, self, Cmd.do) catch |err| { + std.log.err("do error: {any}", .{err}); + return; + }; // continue receving incomming messages asynchronously self.loop.io.recv(*Cmd, self, cbk, completion, self.socket, self.buf); @@ -99,7 +102,13 @@ pub const Cmd = struct { } fn do(self: *Cmd, cmd: []const u8) anyerror!void { - const res = try cdp.do(self.alloc(), cmd, self); + const res = cdp.do(self.alloc(), cmd, self) catch |err| { + if (err == error.DisposeBrowserContext) { + try self.newSession(); + return; + } + return err; + }; // send result if (!std.mem.eql(u8, res, "")) { @@ -108,6 +117,13 @@ pub const Cmd = struct { } } + fn newSession(self: *Cmd) !void { + std.log.info("new session", .{}); + try self.browser.newSession(self.alloc(), self.loop); + const cmd_opaque = @as(*anyopaque, @ptrCast(self)); + try self.browser.currentSession().setInspector(cmd_opaque, Cmd.onInspectorResp, Cmd.onInspectorNotif); + } + // Inspector pub fn sendInspector(self: *Cmd, msg: []const u8) void {