diff --git a/src/Notification.zig b/src/Notification.zig index d01492c8..186cc04e 100644 --- a/src/Notification.zig +++ b/src/Notification.zig @@ -105,7 +105,7 @@ pub const PageRemove = struct {}; pub const PageNavigate = struct { req_id: u32, - page_id: u32, + frame_id: u32, timestamp: u64, url: [:0]const u8, opts: Page.NavigateOpts, @@ -113,7 +113,7 @@ pub const PageNavigate = struct { pub const PageNavigated = struct { req_id: u32, - page_id: u32, + frame_id: u32, timestamp: u64, url: [:0]const u8, opts: Page.NavigatedOpts, @@ -121,18 +121,18 @@ pub const PageNavigated = struct { pub const PageNetworkIdle = struct { req_id: u32, - page_id: u32, + frame_id: u32, timestamp: u64, }; pub const PageNetworkAlmostIdle = struct { req_id: u32, - page_id: u32, + frame_id: u32, timestamp: u64, }; pub const PageFrameCreated = struct { - page_id: u32, + frame_id: u32, parent_id: u32, timestamp: u64, }; @@ -319,7 +319,7 @@ test "Notification" { // noop notifier.dispatch(.page_navigate, &.{ - .page_id = 0, + .frame_id = 0, .req_id = 1, .timestamp = 4, .url = undefined, @@ -330,7 +330,7 @@ test "Notification" { try notifier.register(.page_navigate, &tc, TestClient.pageNavigate); notifier.dispatch(.page_navigate, &.{ - .page_id = 0, + .frame_id = 0, .req_id = 1, .timestamp = 4, .url = undefined, @@ -340,7 +340,7 @@ test "Notification" { notifier.unregisterAll(&tc); notifier.dispatch(.page_navigate, &.{ - .page_id = 0, + .frame_id = 0, .req_id = 1, .timestamp = 10, .url = undefined, @@ -351,25 +351,25 @@ test "Notification" { try notifier.register(.page_navigate, &tc, TestClient.pageNavigate); try notifier.register(.page_navigated, &tc, TestClient.pageNavigated); notifier.dispatch(.page_navigate, &.{ - .page_id = 0, + .frame_id = 0, .req_id = 1, .timestamp = 10, .url = undefined, .opts = .{}, }); - notifier.dispatch(.page_navigated, &.{ .page_id = 0, .req_id = 1, .timestamp = 6, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigated, &.{ .frame_id = 0, .req_id = 1, .timestamp = 6, .url = undefined, .opts = .{} }); try testing.expectEqual(14, tc.page_navigate); try testing.expectEqual(6, tc.page_navigated); notifier.unregisterAll(&tc); notifier.dispatch(.page_navigate, &.{ - .page_id = 0, + .frame_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{}, }); - notifier.dispatch(.page_navigated, &.{ .page_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigated, &.{ .frame_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); try testing.expectEqual(14, tc.page_navigate); try testing.expectEqual(6, tc.page_navigated); @@ -377,27 +377,27 @@ test "Notification" { // unregister try notifier.register(.page_navigate, &tc, TestClient.pageNavigate); try notifier.register(.page_navigated, &tc, TestClient.pageNavigated); - notifier.dispatch(.page_navigate, &.{ .page_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); - notifier.dispatch(.page_navigated, &.{ .page_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigate, &.{ .frame_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigated, &.{ .frame_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); try testing.expectEqual(114, tc.page_navigate); try testing.expectEqual(1006, tc.page_navigated); notifier.unregister(.page_navigate, &tc); - notifier.dispatch(.page_navigate, &.{ .page_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); - notifier.dispatch(.page_navigated, &.{ .page_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigate, &.{ .frame_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigated, &.{ .frame_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); try testing.expectEqual(114, tc.page_navigate); try testing.expectEqual(2006, tc.page_navigated); notifier.unregister(.page_navigated, &tc); - notifier.dispatch(.page_navigate, &.{ .page_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); - notifier.dispatch(.page_navigated, &.{ .page_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigate, &.{ .frame_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigated, &.{ .frame_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); try testing.expectEqual(114, tc.page_navigate); try testing.expectEqual(2006, tc.page_navigated); // already unregistered, try anyways notifier.unregister(.page_navigated, &tc); - notifier.dispatch(.page_navigate, &.{ .page_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); - notifier.dispatch(.page_navigated, &.{ .page_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigate, &.{ .frame_id = 0, .req_id = 1, .timestamp = 100, .url = undefined, .opts = .{} }); + notifier.dispatch(.page_navigated, &.{ .frame_id = 0, .req_id = 1, .timestamp = 1000, .url = undefined, .opts = .{} }); try testing.expectEqual(114, tc.page_navigate); try testing.expectEqual(2006, tc.page_navigated); } diff --git a/src/browser/Page.zig b/src/browser/Page.zig index c1622140..6e80c2de 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -81,7 +81,7 @@ const Page = @This(); // This is the "id" of the frame. It can be re-used from page-to-page, e.g. // when navigating. -id: u32, +_frame_id: u32, _session: *Session, @@ -242,7 +242,7 @@ _type: enum { root, frame }, // only used for logs right now _req_id: u32 = 0, _navigated_options: ?NavigatedOpts = null, -pub fn init(self: *Page, id: u32, session: *Session, parent: ?*Page) !void { +pub fn init(self: *Page, frame_id: u32, session: *Session, parent: ?*Page) !void { if (comptime IS_DEBUG) { log.debug(.page, "page.init", .{}); } @@ -262,7 +262,6 @@ pub fn init(self: *Page, id: u32, session: *Session, parent: ?*Page) !void { })).asDocument(); self.* = .{ - .id = id, .js = undefined, .parent = parent, .arena = page_arena, @@ -270,6 +269,7 @@ pub fn init(self: *Page, id: u32, session: *Session, parent: ?*Page) !void { .window = undefined, .arena_pool = arena_pool, .call_arena = call_arena, + ._frame_id = frame_id, ._session = session, ._factory = factory, ._pending_loads = 1, // always 1 for the ScriptManager @@ -465,7 +465,7 @@ pub fn navigate(self: *Page, request_url: [:0]const u8, opts: NavigateOpts) !voi self.documentIsComplete(); session.notification.dispatch(.page_navigate, &.{ - .page_id = self.id, + .frame_id = self._frame_id, .req_id = req_id, .opts = opts, .url = request_url, @@ -481,7 +481,7 @@ pub fn navigate(self: *Page, request_url: [:0]const u8, opts: NavigateOpts) !voi }); session.notification.dispatch(.page_navigated, &.{ - .page_id = self.id, + .frame_id = self._frame_id, .req_id = req_id, .opts = .{ .cdp_id = opts.cdp_id, @@ -517,7 +517,7 @@ pub fn navigate(self: *Page, request_url: [:0]const u8, opts: NavigateOpts) !voi // We dispatch page_navigate event before sending the request. // It ensures the event page_navigated is not dispatched before this one. session.notification.dispatch(.page_navigate, &.{ - .page_id = self.id, + .frame_id = self._frame_id, .req_id = req_id, .opts = opts, .url = self.url, @@ -535,7 +535,7 @@ pub fn navigate(self: *Page, request_url: [:0]const u8, opts: NavigateOpts) !voi http_client.request(.{ .ctx = self, .url = self.url, - .page_id = self.id, + .frame_id = self._frame_id, .method = opts.method, .headers = headers, .body = opts.body, @@ -712,7 +712,7 @@ pub fn documentIsComplete(self: *Page) void { } self._session.notification.dispatch(.page_navigated, &.{ - .page_id = self.id, + .frame_id = self._frame_id, .req_id = self._req_id, .opts = self._navigated_options.?, .url = self.url, @@ -964,17 +964,17 @@ pub fn iframeAddedCallback(self: *Page, iframe: *Element.Html.IFrame) !void { iframe._executed = true; const session = self._session; - const page_id = session.nextPageId(); + const frame_id = session.nextFrameId(); const page_frame = try self.arena.create(Page); - try Page.init(page_frame, page_id, session, self); + try Page.init(page_frame, frame_id, session, self); self._pending_loads += 1; page_frame.iframe = iframe; iframe._content_window = page_frame.window; self._session.notification.dispatch(.page_frame_created, &.{ - .page_id = page_id, - .parent_id = self.id, + .frame_id = frame_id, + .parent_id = self._frame_id, .timestamp = timestamp(.monotonic), }); @@ -1327,8 +1327,8 @@ pub fn deliverSlotchangeEvents(self: *Page) void { pub fn notifyNetworkIdle(self: *Page) void { lp.assert(self._notified_network_idle == .done, "Page.notifyNetworkIdle", .{}); self._session.notification.dispatch(.page_network_idle, &.{ - .page_id = self.id, .req_id = self._req_id, + .frame_id = self._frame_id, .timestamp = timestamp(.monotonic), }); } @@ -1336,8 +1336,8 @@ pub fn notifyNetworkIdle(self: *Page) void { pub fn notifyNetworkAlmostIdle(self: *Page) void { lp.assert(self._notified_network_almost_idle == .done, "Page.notifyNetworkAlmostIdle", .{}); self._session.notification.dispatch(.page_network_almost_idle, &.{ - .page_id = self.id, .req_id = self._req_id, + .frame_id = self._frame_id, .timestamp = timestamp(.monotonic), }); } diff --git a/src/browser/ScriptManager.zig b/src/browser/ScriptManager.zig index 61d4aef0..4b5316e7 100644 --- a/src/browser/ScriptManager.zig +++ b/src/browser/ScriptManager.zig @@ -265,7 +265,7 @@ pub fn addFromElement(self: *ScriptManager, comptime from_parser: bool, script_e .url = url, .ctx = script, .method = .GET, - .page_id = page.id, + .frame_id = page._frame_id, .headers = try self.getHeaders(url), .blocking = is_blocking, .cookie_jar = &page._session.cookie_jar, @@ -384,7 +384,7 @@ pub fn preloadImport(self: *ScriptManager, url: [:0]const u8, referrer: []const .url = url, .ctx = script, .method = .GET, - .page_id = page.id, + .frame_id = page._frame_id, .headers = try self.getHeaders(url), .cookie_jar = &page._session.cookie_jar, .resource_type = .script, @@ -487,7 +487,7 @@ pub fn getAsyncImport(self: *ScriptManager, url: [:0]const u8, cb: ImportAsync.C try self.client.request(.{ .url = url, .method = .GET, - .page_id = page.id, + .frame_id = page._frame_id, .headers = try self.getHeaders(url), .ctx = script, .resource_type = .script, diff --git a/src/browser/Session.zig b/src/browser/Session.zig index 540ba520..0cf17d70 100644 --- a/src/browser/Session.zig +++ b/src/browser/Session.zig @@ -54,7 +54,7 @@ navigation: Navigation, page: ?Page, -page_id_gen: u32, +frame_id_gen: u32, pub fn init(self: *Session, browser: *Browser, notification: *Notification) !void { const allocator = browser.app.allocator; @@ -65,7 +65,7 @@ pub fn init(self: *Session, browser: *Browser, notification: *Notification) !voi .page = null, .arena = arena, .history = .{}, - .page_id_gen = 0, + .frame_id_gen = 0, // The prototype (EventTarget) for Navigation is created when a Page is created. .navigation = .{ ._proto = undefined }, .storage_shed = .{}, @@ -93,7 +93,7 @@ pub fn createPage(self: *Session) !*Page { self.page = @as(Page, undefined); const page = &self.page.?; - try Page.init(page, self.nextPageId(), self, null); + try Page.init(page, self.nextFrameId(), self, null); // Creates a new NavigationEventTarget for this page. try self.navigation.onNewPage(page); @@ -131,7 +131,7 @@ pub fn replacePage(self: *Session) !*Page { lp.assert(self.page != null, "Session.replacePage null page", .{}); var current = self.page.?; - const page_id = current.id; + const frame_id = current._frame_id; const parent = current.parent; current.deinit(); @@ -139,7 +139,7 @@ pub fn replacePage(self: *Session) !*Page { self.page = @as(Page, undefined); const page = &self.page.?; - try Page.init(page, page_id, self, parent); + try Page.init(page, frame_id, self, parent); return page; } @@ -153,9 +153,9 @@ pub const WaitResult = enum { cdp_socket, }; -pub fn findPage(self: *Session, id: u32) ?*Page { +pub fn findPage(self: *Session, frame_id: u32) ?*Page { const page = self.currentPage() orelse return null; - return if (page.id == id) page else null; + return if (page._frame_id == frame_id) page else null; } pub fn wait(self: *Session, wait_ms: u32) WaitResult { @@ -347,20 +347,20 @@ fn processScheduledNavigation(self: *Session, current_page: *Page) !*Page { current_page._queued_navigation = null; defer browser.arena_pool.release(qn.arena); - const page_id, const parent = blk: { + const frame_id, const parent = blk: { const page = &self.page.?; - const page_id = page.id; + const frame_id = page._frame_id; const parent = page.parent; browser.http_client.abort(); self.removePage(); - break :blk .{ page_id, parent }; + break :blk .{ frame_id, parent }; }; self.page = @as(Page, undefined); const page = &self.page.?; - try Page.init(page, page_id, self, parent); + try Page.init(page, frame_id, self, parent); // Creates a new NavigationEventTarget for this page. try self.navigation.onNewPage(page); @@ -377,8 +377,8 @@ fn processScheduledNavigation(self: *Session, current_page: *Page) !*Page { return page; } -pub fn nextPageId(self: *Session) u32 { - const id = self.page_id_gen +% 1; - self.page_id_gen = id; +pub fn nextFrameId(self: *Session) u32 { + const id = self.frame_id_gen +% 1; + self.frame_id_gen = id; return id; } diff --git a/src/browser/webapi/net/Fetch.zig b/src/browser/webapi/net/Fetch.zig index 161e88c2..35fce366 100644 --- a/src/browser/webapi/net/Fetch.zig +++ b/src/browser/webapi/net/Fetch.zig @@ -72,9 +72,9 @@ pub fn init(input: Input, options: ?InitOpts, page: *Page) !js.Promise { try http_client.request(.{ .ctx = fetch, - .page_id = page.id, .url = request._url, .method = request._method, + .frame_id = page._frame_id, .body = request._body, .headers = headers, .resource_type = .fetch, diff --git a/src/browser/webapi/net/XMLHttpRequest.zig b/src/browser/webapi/net/XMLHttpRequest.zig index 0eb32cad..c1380908 100644 --- a/src/browser/webapi/net/XMLHttpRequest.zig +++ b/src/browser/webapi/net/XMLHttpRequest.zig @@ -223,9 +223,9 @@ pub fn send(self: *XMLHttpRequest, body_: ?[]const u8) !void { try http_client.request(.{ .ctx = self, .url = self._url, - .page_id = page.id, .method = self._method, .headers = headers, + .frame_id = page._frame_id, .body = self._request_body, .cookie_jar = if (cookie_support) &page._session.cookie_jar else null, .resource_type = .xhr, diff --git a/src/cdp/domains/fetch.zig b/src/cdp/domains/fetch.zig index d6e96f2f..8a54881b 100644 --- a/src/cdp/domains/fetch.zig +++ b/src/cdp/domains/fetch.zig @@ -193,7 +193,7 @@ pub fn requestIntercept(bc: anytype, intercept: *const Notification.RequestInter try bc.cdp.sendEvent("Fetch.requestPaused", .{ .requestId = &id.toInterceptId(transfer.id), - .frameId = &id.toFrameId(transfer.req.page_id), + .frameId = &id.toFrameId(transfer.req.frame_id), .request = network.TransferAsRequestWriter.init(transfer), .resourceType = switch (transfer.req.resource_type) { .script => "Script", @@ -397,7 +397,7 @@ pub fn requestAuthRequired(bc: anytype, intercept: *const Notification.RequestAu try bc.cdp.sendEvent("Fetch.authRequired", .{ .requestId = &id.toInterceptId(transfer.id), - .frameId = &id.toFrameId(transfer.req.page_id), + .frameId = &id.toFrameId(transfer.req.frame_id), .request = network.TransferAsRequestWriter.init(transfer), .resourceType = switch (transfer.req.resource_type) { .script => "Script", diff --git a/src/cdp/domains/network.zig b/src/cdp/domains/network.zig index bad29b2d..b353dc76 100644 --- a/src/cdp/domains/network.zig +++ b/src/cdp/domains/network.zig @@ -237,8 +237,8 @@ pub fn httpRequestStart(bc: anytype, msg: *const Notification.RequestStart) !voi const transfer = msg.transfer; const req = &transfer.req; - const page_id = req.page_id; - const page = bc.session.findPage(page_id) orelse return; + const frame_id = req.frame_id; + const page = bc.session.findPage(frame_id) orelse return; // Modify request with extra CDP headers for (bc.extra_headers.items) |extra| { @@ -249,7 +249,7 @@ pub fn httpRequestStart(bc: anytype, msg: *const Notification.RequestStart) !voi try bc.cdp.sendEvent("Network.requestWillBeSent", .{ .loaderId = &id.toLoaderId(transfer.id), .requestId = &id.toRequestId(transfer.id), - .frameId = &id.toFrameId(page_id), + .frameId = &id.toFrameId(frame_id), .type = req.resource_type.string(), .documentURL = page.url, .request = TransferAsRequestWriter.init(transfer), @@ -270,7 +270,7 @@ pub fn httpResponseHeaderDone(arena: Allocator, bc: anytype, msg: *const Notific try bc.cdp.sendEvent("Network.responseReceived", .{ .loaderId = &id.toLoaderId(transfer.id), .requestId = &id.toRequestId(transfer.id), - .frameId = &id.toFrameId(transfer.req.page_id), + .frameId = &id.toFrameId(transfer.req.frame_id), .response = TransferAsResponseWriter.init(arena, msg.transfer), .hasExtraInfo = false, // TODO change after adding Network.responseReceivedExtraInfo }, .{ .session_id = session_id }); diff --git a/src/cdp/domains/page.zig b/src/cdp/domains/page.zig index 3db5d67c..6a9af8b0 100644 --- a/src/cdp/domains/page.zig +++ b/src/cdp/domains/page.zig @@ -105,7 +105,7 @@ fn setLifecycleEventsEnabled(cmd: anytype) !void { const page = bc.session.currentPage() orelse return error.PageNotLoaded; if (page._load_state == .complete) { - const frame_id = &id.toFrameId(page.id); + const frame_id = &id.toFrameId(page._frame_id); const loader_id = &id.toLoaderId(page._req_id); const now = timestampF(.monotonic); @@ -239,7 +239,7 @@ pub fn pageNavigate(bc: anytype, event: *const Notification.PageNavigate) !void const session_id = bc.session_id orelse return; bc.reset(); - const frame_id = &id.toFrameId(event.page_id); + const frame_id = &id.toFrameId(event.frame_id); const loader_id = &id.toLoaderId(event.req_id); var cdp = bc.cdp; @@ -308,7 +308,7 @@ pub fn pageFrameCreated(bc: anytype, event: *const Notification.PageFrameCreated const session_id = bc.session_id orelse return; const cdp = bc.cdp; - const frame_id = &id.toFrameId(event.page_id); + const frame_id = &id.toFrameId(event.frame_id); try cdp.sendEvent("Page.frameAttached", .{ .params = .{ .frameId = frame_id, @@ -319,7 +319,7 @@ pub fn pageFrameCreated(bc: anytype, event: *const Notification.PageFrameCreated try cdp.sendEvent("Page.lifecycleEvent", LifecycleEvent{ .name = "init", .frameId = frame_id, - .loaderId = &id.toLoaderId(event.page_id), + .loaderId = &id.toLoaderId(event.frame_id), .timestamp = event.timestamp, }, .{ .session_id = session_id }); } @@ -331,7 +331,7 @@ pub fn pageNavigated(arena: Allocator, bc: anytype, event: *const Notification.P const session_id = bc.session_id orelse return; const timestamp = event.timestamp; - const frame_id = &id.toFrameId(event.page_id); + const frame_id = &id.toFrameId(event.frame_id); const loader_id = &id.toLoaderId(event.req_id); var cdp = bc.cdp; @@ -478,11 +478,11 @@ pub fn pageNavigated(arena: Allocator, bc: anytype, event: *const Notification.P } pub fn pageNetworkIdle(bc: anytype, event: *const Notification.PageNetworkIdle) !void { - return sendPageLifecycle(bc, "networkIdle", event.timestamp, &id.toFrameId(event.page_id), &id.toLoaderId(event.req_id)); + return sendPageLifecycle(bc, "networkIdle", event.timestamp, &id.toFrameId(event.frame_id), &id.toLoaderId(event.req_id)); } pub fn pageNetworkAlmostIdle(bc: anytype, event: *const Notification.PageNetworkAlmostIdle) !void { - return sendPageLifecycle(bc, "networkAlmostIdle", event.timestamp, &id.toFrameId(event.page_id), &id.toLoaderId(event.req_id)); + return sendPageLifecycle(bc, "networkAlmostIdle", event.timestamp, &id.toFrameId(event.frame_id), &id.toLoaderId(event.req_id)); } fn sendPageLifecycle(bc: anytype, name: []const u8, timestamp: u64, frame_id: []const u8, loader_id: []const u8) !void { diff --git a/src/cdp/domains/target.zig b/src/cdp/domains/target.zig index 8a818a27..243ddc8f 100644 --- a/src/cdp/domains/target.zig +++ b/src/cdp/domains/target.zig @@ -177,7 +177,7 @@ fn createTarget(cmd: anytype) !void { const page = try bc.session.createPage(); // the target_id == the frame_id of the "root" page - const frame_id = id.toFrameId(page.id); + const frame_id = id.toFrameId(page._frame_id); bc.target_id = frame_id; const target_id = &bc.target_id.?; { @@ -421,7 +421,7 @@ fn setAutoAttach(cmd: anytype) !void { if (bc.target_id == null) { if (bc.session.currentPage()) |page| { // the target_id == the frame_id of the "root" page - bc.target_id = id.toFrameId(page.id); + bc.target_id = id.toFrameId(page._frame_id); try doAttachtoTarget(cmd, &bc.target_id.?); } } diff --git a/src/http/Client.zig b/src/http/Client.zig index 1670883c..b1380e49 100644 --- a/src/http/Client.zig +++ b/src/http/Client.zig @@ -320,7 +320,7 @@ fn fetchRobotsThenProcessRequest(self: *Client, robots_url: [:0]const u8, req: R .method = .GET, .headers = headers, .blocking = false, - .page_id = req.page_id, + .frame_id = req.frame_id, .cookie_jar = req.cookie_jar, .notification = req.notification, .resource_type = .fetch, @@ -855,7 +855,7 @@ pub const RequestCookie = struct { }; pub const Request = struct { - page_id: u32, + frame_id: u32, method: Method, url: [:0]const u8, headers: Net.Headers,