diff --git a/src/cdp/domains/page.zig b/src/cdp/domains/page.zig index aee7fa45..0e781fa4 100644 --- a/src/cdp/domains/page.zig +++ b/src/cdp/domains/page.zig @@ -39,6 +39,7 @@ pub fn processMessage(cmd: anytype) !void { addScriptToEvaluateOnNewDocument, createIsolatedWorld, navigate, + reload, stopLoading, close, captureScreenshot, @@ -52,6 +53,7 @@ pub fn processMessage(cmd: anytype) !void { .addScriptToEvaluateOnNewDocument => return addScriptToEvaluateOnNewDocument(cmd), .createIsolatedWorld => return createIsolatedWorld(cmd), .navigate => return navigate(cmd), + .reload => return doReload(cmd), .stopLoading => return cmd.sendResult(null, .{}), .close => return close(cmd), .captureScreenshot => return captureScreenshot(cmd), @@ -252,6 +254,36 @@ fn navigate(cmd: anytype) !void { }); } +fn doReload(cmd: anytype) !void { + const params = try cmd.params(struct { + ignoreCache: ?bool = null, + scriptToEvaluateOnLoad: ?[]const u8 = null, + }); + + const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded; + + if (bc.session_id == null) { + return error.SessionIdNotLoaded; + } + + const session = bc.session; + var page = session.currentPage() orelse return error.PageNotLoaded; + + // Dupe URL before replacePage() frees the old page's arena. + const reload_url = try cmd.arena.dupeZ(u8, page.url); + + if (page._load_state != .waiting) { + page = try session.replacePage(); + } + + try page.navigate(reload_url, .{ + .reason = .address_bar, + .cdp_id = cmd.input.id, + .kind = .reload, + .force = if (params) |p| p.ignoreCache orelse false else false, + }); +} + pub fn pageNavigate(bc: anytype, event: *const Notification.PageNavigate) !void { // detachTarget could be called, in which case, we still have a page doing // things, but no session. @@ -784,3 +816,27 @@ test "cdp.page: getLayoutMetrics" { }, }, .{ .id = 12 }); } + +test "cdp.page: reload" { + var ctx = try testing.context(); + defer ctx.deinit(); + + { + // reload without browser context — should error + try ctx.processMessage(.{ .id = 30, .method = "Page.reload" }); + try ctx.expectSentError(-31998, "BrowserContextNotLoaded", .{ .id = 30 }); + } + + _ = try ctx.loadBrowserContext(.{ .id = "BID-9", .url = "hi.html", .target_id = "FID-000000000X".* }); + + { + // reload with no params — should not error (navigation is async, + // so no result is sent synchronously; we just verify no error) + try ctx.processMessage(.{ .id = 31, .method = "Page.reload" }); + } + + { + // reload with ignoreCache param + try ctx.processMessage(.{ .id = 32, .method = "Page.reload", .params = .{ .ignoreCache = true } }); + } +}