Remove Page.reset

Page.reset exists for 1 use case: multiple calls to the Page.navigate CDP
method. At an extreme, something like this in puppeteer:

```
await page.goto(baseURL + '/campfire-commerce/');
await page.goto(baseURL + '/campfire-commerce/');
```

Rather than handling this generically in Page, we now handle this case
specifically at the CDP layer. If the page isn't in its initial load state,
i.e. page._load_state != .waiting, then we reload the page from the session.

For reloading, my initial inclination was to do session.removePage then
session.createPage(). This behavior still seems potentially correct to me, but
compared to our `reset`, this would trigger extra notifications, namely:

self.notification.dispatch(.page_remove, .{});

and

self.notification.dispatch(.page_created, page);

Bacause of https://github.com/lightpanda-io/browser/pull/1265/ I guess that
could have side effects. So, to keep the behavior as close to the current
"reset", a new `session.replacePage()` has been added which behaves a lot like
removePage + createPage, but without the notifications being sent.

While I generally think this is just cleaner, this was largely driven by some
planning for frame support. The entity for a Frame will share a lot with the
Page (we'll extract that logic), so simplifying the Page, especially around
initialization, helps simplify frame support.
This commit is contained in:
Karl Seguin
2026-02-11 12:05:22 +08:00
parent 28815a0ae6
commit 14112ed294
9 changed files with 107 additions and 182 deletions

View File

@@ -213,7 +213,12 @@ fn navigate(cmd: anytype) !void {
return error.SessionIdNotLoaded;
}
var page = bc.session.currentPage() orelse return error.PageNotLoaded;
const session = bc.session;
var page = session.currentPage() orelse return error.PageNotLoaded;
if (page._load_state != .waiting) {
page = try session.replacePage();
}
try page.navigate(params.url, .{
.reason = .address_bar,