Let Page.navigate do actually navigation

Signed-off-by: Francis Bouvier <francis@lightpanda.io>
This commit is contained in:
Francis Bouvier
2024-04-19 17:13:32 +02:00
parent 1b1b7cdfb0
commit 4a31dd8aa3
3 changed files with 106 additions and 21 deletions

View File

@@ -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,
};

View File

@@ -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 "";
}

View File

@@ -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;