diff --git a/src/cdp/cdp.zig b/src/cdp/cdp.zig index fa7ebd67..548eafbe 100644 --- a/src/cdp/cdp.zig +++ b/src/cdp/cdp.zig @@ -262,3 +262,7 @@ pub const SessionID = "9559320D92474062597D9875C664CAC0"; pub const URLBase = "chrome://newtab/"; pub const FrameID = "90D14BBD8AED408A0467AC93100BCDBE"; pub const LoaderID = "CFC8BED824DD2FD56CF1EF33C965C79C"; + +pub const TimestampEvent = struct { + timestamp: f64, +}; diff --git a/src/cdp/page.zig b/src/cdp/page.zig index f2cefb4a..f513f194 100644 --- a/src/cdp/page.zig +++ b/src/cdp/page.zig @@ -6,6 +6,7 @@ const cdp = @import("cdp.zig"); const result = cdp.result; const getParams = cdp.getParams; const stringify = cdp.stringify; +const sendEvent = cdp.sendEvent; const PageMethods = enum { enable, @@ -45,6 +46,21 @@ fn enable( return result(alloc, id, null, null, sessionID); } +const Frame = struct { + id: []const u8, + loaderId: []const u8, + url: []const u8, + domainAndRegistry: []const u8 = "", + securityOrigin: []const u8, + mimeType: []const u8 = "text/html", + adFrameStatus: struct { + adFrameType: []const u8 = "none", + } = .{}, + secureContextType: []const u8, + crossOriginIsolatedContextType: []const u8 = "NotIsolated", + gatedAPIFeatures: [][]const u8 = &[0][]const u8{}, +}; + fn getFrameTree( alloc: std.mem.Allocator, id: u64, @@ -54,20 +70,7 @@ fn getFrameTree( const sessionID = try cdp.getSessionID(scanner); const FrameTree = struct { frameTree: struct { - frame: struct { - id: []const u8, - loaderId: []const u8, - url: []const u8, - domainAndRegistry: []const u8 = "", - securityOrigin: []const u8, - mimeType: []const u8 = "text/html", - adFrameStatus: struct { - adFrameType: []const u8 = "none", - } = .{}, - secureContextType: []const u8, - crossOriginIsolatedContextType: []const u8 = "NotIsolated", - gatedAPIFeatures: [][]const u8 = &[0][]const u8{}, - }, + frame: Frame, }, childFrames: ?[]@This() = null, }; @@ -105,6 +108,13 @@ fn setLifecycleEventsEnabled( return result(alloc, id, null, null, sessionID); } +const LifeCycleEvent = struct { + frameId: []const u8, + loaderId: ?[]const u8, + name: []const u8 = undefined, + timestamp: f32 = undefined, +}; + fn addScriptToEvaluateOnNewDocument( alloc: std.mem.Allocator, id: u64, @@ -162,14 +172,31 @@ fn navigate( frameId: ?[]const u8 = null, referrerPolicy: ?[]const u8 = null, // TODO: enum }; - const content = try cdp.getContent(alloc, Params, scanner); - std.debug.assert(content.sessionID != null); + const input = try cdp.getContent(alloc, Params, scanner); + const sessionID = input.sessionID; + std.debug.assert(sessionID != null); // change state - ctx.state.url = content.params.url; + ctx.state.url = input.params.url; ctx.state.loaderID = "AF8667A203C5392DBE9AC290044AA4C2"; - var page = try ctx.browser.currentSession().createPage(); + var life_event = LifeCycleEvent{ + .frameId = ctx.state.frameID, + .loaderId = ctx.state.loaderID, + }; + var ts_event: cdp.TimestampEvent = undefined; + + // frameStartedLoading event + const FrameStartedLoading = struct { + frameId: []const u8, + }; + const frame_started_loading = FrameStartedLoading{ .frameId = ctx.state.frameID }; + try sendEvent(alloc, ctx, "Page.frameStartedLoading", FrameStartedLoading, frame_started_loading, sessionID); + if (ctx.state.page_life_cycle_events) { + life_event.name = "init"; + life_event.timestamp = 343721.796037; + try sendEvent(alloc, ctx, "Page.lifeCycleEvent", LifeCycleEvent, life_event, sessionID); + } // output const Resp = struct { @@ -181,5 +208,56 @@ fn navigate( .frameId = ctx.state.frameID, .loaderId = ctx.state.loaderID, }; - return result(alloc, id, Resp, resp, content.sessionID); + const res = try result(alloc, id, Resp, resp, sessionID); + std.log.debug("res {s}", .{res}); + try server.sendSync(ctx, res); + + // launch navigate + var p = try ctx.browser.currentSession().createPage(); + _ = try p.navigate(input.params.url); + + // frameNavigated event + const FrameNavigated = struct { + frame: Frame, + type: []const u8 = "Navigation", + }; + const frame_navigated = FrameNavigated{ + .frame = .{ + .id = ctx.state.frameID, + .url = ctx.state.url, + .securityOrigin = ctx.state.securityOrigin, + .secureContextType = ctx.state.secureContextType, + .loaderId = ctx.state.loaderID, + }, + }; + try sendEvent(alloc, ctx, "Page.frameNavigated", FrameNavigated, frame_navigated, sessionID); + if (ctx.state.page_life_cycle_events) { + life_event.name = "load"; + life_event.timestamp = 343721.824655; + try sendEvent(alloc, ctx, "Page.lifeCycleEvent", LifeCycleEvent, life_event, sessionID); + } + + // domContentEventFired event + ts_event = .{ .timestamp = 343721.803338 }; + try sendEvent(alloc, ctx, "Page.domContentEventFired", cdp.TimestampEvent, ts_event, sessionID); + if (ctx.state.page_life_cycle_events) { + life_event.name = "DOMContentLoaded"; + life_event.timestamp = 343721.803338; + try sendEvent(alloc, ctx, "Page.lifeCycleEvent", LifeCycleEvent, life_event, sessionID); + } + + // loadEventFired event + ts_event = .{ .timestamp = 343721.824655 }; + try sendEvent(alloc, ctx, "Page.loadEventFired", cdp.TimestampEvent, ts_event, sessionID); + if (ctx.state.page_life_cycle_events) { + life_event.name = "load"; + life_event.timestamp = 343721.824655; + try sendEvent(alloc, ctx, "Page.lifeCycleEvent", LifeCycleEvent, life_event, sessionID); + } + + // frameStoppedLoading + const FrameStoppedLoading = struct { frameId: []const u8 }; + try sendEvent(alloc, ctx, "Page.frameStoppedLoading", FrameStoppedLoading, .{ .frameId = ctx.state.frameID }, sessionID); + + return ""; } diff --git a/src/server.zig b/src/server.zig index 48ddcc72..4798c158 100644 --- a/src/server.zig +++ b/src/server.zig @@ -76,9 +76,12 @@ pub const Cmd = struct { } @panic(@errorName(err)); }; - std.log.debug("res {s}", .{res}); - sendAsync(self, res) catch unreachable; + // send result + if (!std.mem.eql(u8, res, "")) { + std.log.debug("res {s}", .{res}); + sendAsync(self, res) catch unreachable; + } if (pos == null) break;