mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 07:03:29 +00:00
Emit networkIdle and networkAlmostIdle Page.lifecycleEvent
Most CDP drivers have a mechanism to wait for idle network, or an almost idle network (sometimes called networkIdle2). These are events the browser must emit. The page will now emit `networkIdle` when we are reasonably sure there's no more network activity (this requires some slight changes to request interception, since, I believe, intercepted requests should be considered). `networkAlmostIdle` is currently _always_ emitted prior to emitting `networkIdle`. We should tweak this but I can't, at a glance, think of a great heuristic for when this should be emitted.
This commit is contained in:
@@ -78,12 +78,16 @@ fn getFrameTree(cmd: anytype) !void {
|
||||
}
|
||||
|
||||
fn setLifecycleEventsEnabled(cmd: anytype) !void {
|
||||
// const params = (try cmd.params(struct {
|
||||
// enabled: bool,
|
||||
// })) orelse return error.InvalidParams;
|
||||
const params = (try cmd.params(struct {
|
||||
enabled: bool,
|
||||
})) orelse return error.InvalidParams;
|
||||
|
||||
const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded;
|
||||
bc.page_life_cycle_events = true;
|
||||
if (params.enabled) {
|
||||
try bc.lifecycleEventsEnable();
|
||||
} else {
|
||||
bc.lifecycleEventsDisable();
|
||||
}
|
||||
return cmd.sendResult(null, .{});
|
||||
}
|
||||
|
||||
@@ -357,6 +361,27 @@ pub fn pageNavigated(bc: anytype, event: *const Notification.PageNavigated) !voi
|
||||
}, .{ .session_id = session_id });
|
||||
}
|
||||
|
||||
pub fn pageNetworkIdle(bc: anytype, event: *const Notification.PageNetworkIdle) !void {
|
||||
return sendPageLifecycle(bc, "networkIdle", event.timestamp);
|
||||
}
|
||||
|
||||
pub fn pageNetworkAlmostIdle(bc: anytype, event: *const Notification.PageNetworkAlmostIdle) !void {
|
||||
return sendPageLifecycle(bc, "networkAlmostIdle", event.timestamp);
|
||||
}
|
||||
|
||||
fn sendPageLifecycle(bc: anytype, name: []const u8, timestamp: u32) !void {
|
||||
const loader_id = bc.loader_id;
|
||||
const target_id = bc.target_id orelse unreachable;
|
||||
const session_id = bc.session_id orelse unreachable;
|
||||
|
||||
return bc.cdp.sendEvent("Page.lifecycleEvent", LifecycleEvent{
|
||||
.name = name,
|
||||
.frameId = target_id,
|
||||
.loaderId = loader_id,
|
||||
.timestamp = timestamp,
|
||||
}, .{ .session_id = session_id });
|
||||
}
|
||||
|
||||
const LifecycleEvent = struct {
|
||||
frameId: []const u8,
|
||||
loaderId: ?[]const u8,
|
||||
|
||||
Reference in New Issue
Block a user