diff --git a/src/browser/html/document.zig b/src/browser/html/document.zig index 984650145..707db0c1e 100644 --- a/src/browser/html/document.zig +++ b/src/browser/html/document.zig @@ -195,7 +195,7 @@ pub const HTMLDocument = struct { } pub fn set_location(_: *const parser.DocumentHTML, url: []const u8, page: *Page) !void { - return page.navigateFromWebAPI(url, .{ .reason = .script }, .{ .push = null }); + return page.navigateAsync(url, .{ .reason = .script }, .{ .push = null }); } pub fn get_designMode(_: *parser.DocumentHTML) []const u8 { diff --git a/src/browser/html/location.zig b/src/browser/html/location.zig index dc959e87a..a329af129 100644 --- a/src/browser/html/location.zig +++ b/src/browser/html/location.zig @@ -38,7 +38,7 @@ pub const Location = struct { } pub fn set_href(_: *const Location, href: []const u8, page: *Page) !void { - return page.navigateFromWebAPI(href, .{ .reason = .script }, .{ .push = null }); + return page.navigateAsync(href, .{ .reason = .script }, .{ .push = null }); } pub fn set_hash(_: *const Location, hash: []const u8, page: *Page) !void { @@ -56,7 +56,7 @@ pub const Location = struct { break :blk try std.fmt.allocPrint(page.arena, "#{s}", .{hash}); }; - return page.navigateFromWebAPI(normalized_hash, .{ .reason = .script }, .{ .replace = null }); + return page.navigateAsync(normalized_hash, .{ .reason = .script }, .{ .replace = null }); } pub fn get_protocol(self: *Location) []const u8 { @@ -92,15 +92,15 @@ pub const Location = struct { } pub fn _assign(_: *const Location, url: []const u8, page: *Page) !void { - return page.navigateFromWebAPI(url, .{ .reason = .script }, .{ .push = null }); + return page.navigateAsync(url, .{ .reason = .script }, .{ .push = null }); } pub fn _replace(_: *const Location, url: []const u8, page: *Page) !void { - return page.navigateFromWebAPI(url, .{ .reason = .script }, .{ .replace = null }); + return page.navigateAsync(url, .{ .reason = .script }, .{ .replace = null }); } pub fn _reload(_: *const Location, page: *Page) !void { - return page.navigateFromWebAPI(page.url.raw, .{ .reason = .script }, .reload); + return page.navigateAsync(page.url.raw, .{ .reason = .script }, .reload); } pub fn _toString(self: *Location, page: *Page) ![]const u8 { diff --git a/src/browser/html/window.zig b/src/browser/html/window.zig index 2d440bd98..a5fecea74 100644 --- a/src/browser/html/window.zig +++ b/src/browser/html/window.zig @@ -137,7 +137,7 @@ pub const Window = struct { } pub fn set_location(_: *const Window, url: []const u8, page: *Page) !void { - return page.navigateFromWebAPI(url, .{ .reason = .script }, .{ .push = null }); + return page.navigateAsync(url, .{ .reason = .script }, .{ .push = null }); } // frames return the window itself, but accessing it via a pseudo diff --git a/src/browser/navigation/Navigation.zig b/src/browser/navigation/Navigation.zig index 9f2da76cc..7b6ce4f0a 100644 --- a/src/browser/navigation/Navigation.zig +++ b/src/browser/navigation/Navigation.zig @@ -257,7 +257,7 @@ pub fn navigate( _ = try self.pushEntry(url, .{ .source = .navigation, .value = state }, page, true); } else { - try page.navigateFromWebAPI(url, .{ .reason = .navigation }, kind); + try page.navigateAsync(url, .{ .reason = .navigation }, kind); } }, .replace => |state| { @@ -270,7 +270,7 @@ pub fn navigate( _ = try self.replaceEntry(url, .{ .source = .navigation, .value = state }, page, true); } else { - try page.navigateFromWebAPI(url, .{ .reason = .navigation }, kind); + try page.navigateAsync(url, .{ .reason = .navigation }, kind); } }, .traverse => |index| { @@ -283,11 +283,11 @@ pub fn navigate( // todo: Fire navigate event try finished.resolve({}); } else { - try page.navigateFromWebAPI(url, .{ .reason = .navigation }, kind); + try page.navigateAsync(url, .{ .reason = .navigation }, kind); } }, .reload => { - try page.navigateFromWebAPI(url, .{ .reason = .navigation }, kind); + try page.navigateAsync(url, .{ .reason = .navigation }, kind); }, } diff --git a/src/browser/page.zig b/src/browser/page.zig index 1b8a64e54..815b697ff 100644 --- a/src/browser/page.zig +++ b/src/browser/page.zig @@ -167,21 +167,6 @@ pub const Page = struct { self.script_manager.deinit(); } - fn reset(self: *Page) !void { - // Force running the micro task to drain the queue. - self.session.browser.env.runMicrotasks(); - - self.scheduler.reset(); - self.http_client.abort(); - self.script_manager.reset(); - - self.load_state = .parsing; - self.mode = .{ .pre = {} }; - _ = self.session.browser.page_arena.reset(.{ .retain_with_limit = 1 * 1024 * 1024 }); - - try self.registerBackgroundTasks(); - } - fn registerBackgroundTasks(self: *Page) !void { if (comptime builtin.is_test) { // HTML test runner manually calls these as necessary @@ -544,14 +529,9 @@ pub const Page = struct { }; } + // You are no supposed to call this function directly. // spec reference: https://html.spec.whatwg.org/#document-lifecycle pub fn navigate(self: *Page, request_url: []const u8, opts: NavigateOpts) !void { - if (self.mode != .pre) { - // it's possible for navigate to be called multiple times on the - // same page (via CDP). We want to reset the page between each call. - try self.reset(); - } - const req_id = self.http_client.nextReqId(); log.info(.http, "navigate", .{ @@ -964,7 +944,7 @@ pub const Page = struct { const element: *parser.Element = @ptrCast(node); const href = (try parser.elementGetAttribute(element, "href")) orelse return; log.debug(.input, "window click on link", .{ .tag = tag, .href = href }); - try self.navigateFromWebAPI(href, .{}, .{ .push = null }); + try self.navigateAsync(href, .{}, .{ .push = null }); return; }, .input => { @@ -1118,7 +1098,7 @@ pub const Page = struct { // As such we schedule the function to be called as soon as possible. // The page.arena is safe to use here, but the transfer_arena exists // specifically for this type of lifetime. - pub fn navigateFromWebAPI(self: *Page, url: []const u8, opts: NavigateOpts, kind: NavigationKind) !void { + pub fn navigateAsync(self: *Page, url: []const u8, opts: NavigateOpts, kind: NavigationKind) !void { const session = self.session; const stitched_url = try URL.stitch( session.transfer_arena, @@ -1221,7 +1201,7 @@ pub const Page = struct { } else { action = try URL.concatQueryString(transfer_arena, action, buf.items); } - try self.navigateFromWebAPI(action, opts, .{ .push = null }); + try self.navigateAsync(action, opts, .{ .push = null }); } pub fn isNodeAttached(self: *const Page, node: *parser.Node) bool { diff --git a/src/browser/session.zig b/src/browser/session.zig index 0bb941aba..bde866e94 100644 --- a/src/browser/session.zig +++ b/src/browser/session.zig @@ -191,7 +191,7 @@ pub const Session = struct { // bad if old requests went to the new page, so let's make double sure self.browser.http_client.abort(); - // Page.navigateFromWebAPI terminatedExecution. If we don't resume + // Page.navigateAsync terminatedExecution. If we don't resume // it before doing a shutdown we'll get an error. self.executor.resumeExecution(); self.removePage(); diff --git a/src/cdp/domains/page.zig b/src/cdp/domains/page.zig index d355e727d..5a983c3cd 100644 --- a/src/cdp/domains/page.zig +++ b/src/cdp/domains/page.zig @@ -216,10 +216,10 @@ fn navigate(cmd: anytype) !void { var page = bc.session.currentPage() orelse return error.PageNotLoaded; - try page.navigate(params.url, .{ + try page.navigateAsync(params.url, .{ .reason = .address_bar, .cdp_id = cmd.input.id, - }); + }, .{ .push = null }); } pub fn pageNavigate(arena: Allocator, bc: anytype, event: *const Notification.PageNavigate) !void {