diff --git a/src/cdp/cdp.zig b/src/cdp/cdp.zig index 8470fb43..e5a34110 100644 --- a/src/cdp/cdp.zig +++ b/src/cdp/cdp.zig @@ -152,7 +152,7 @@ pub fn CDPT(comptime TypeProvider: type) type { } if (is_startup) { - dispatchStartupCommand(&command) catch |err| { + dispatchStartupCommand(&command, input.method) catch |err| { command.sendError(-31999, @errorName(err), .{}) catch {}; return err; }; @@ -174,7 +174,23 @@ pub fn CDPT(comptime TypeProvider: type) type { // "special" handling - the bare minimum we need to do until the driver // switches to a real BrowserContext. // (I can imagine this logic will become driver-specific) - fn dispatchStartupCommand(command: anytype) !void { + fn dispatchStartupCommand(command: anytype, method: []const u8) !void { + // Stagehand parses the response and error if we don't return a + // correct one for this call. + if (std.mem.eql(u8, method, "Page.getFrameTree")) { + return command.sendResult(.{ + .frameTree = .{ + .frame = .{ + .id = "TID-STARTUP-B", + .loaderId = LOADER_ID, + .securityOrigin = URL_BASE, + .url = "about:blank", + .secureContextType = "Secure", + }, + }, + }, .{}); + } + return command.sendResult(null, .{}); } diff --git a/src/cdp/domains/target.zig b/src/cdp/domains/target.zig index 920cba51..51581caa 100644 --- a/src/cdp/domains/target.zig +++ b/src/cdp/domains/target.zig @@ -36,6 +36,7 @@ pub fn processMessage(cmd: anytype) !void { sendMessageToTarget, setAutoAttach, setDiscoverTargets, + activateTarget, }, cmd.input.action) orelse return error.UnknownMethod; switch (action) { @@ -51,14 +52,16 @@ pub fn processMessage(cmd: anytype) !void { .sendMessageToTarget => return sendMessageToTarget(cmd), .setAutoAttach => return setAutoAttach(cmd), .setDiscoverTargets => return setDiscoverTargets(cmd), + .activateTarget => return cmd.sendResult(null, .{}), } } fn getTargets(cmd: anytype) !void { - // Some clients like Stagehand expects to have an existing context. - const bc = cmd.browser_context orelse cmd.createBrowserContext() catch |err| switch (err) { - error.AlreadyExists => unreachable, - else => return err, + // If no context available, return an empty array. + const bc = cmd.browser_context orelse { + return cmd.sendResult(.{ + .targetInfos = [_]TargetInfo{}, + }, .{ .include_session_id = false }); }; const target_id = bc.target_id orelse {