diff --git a/src/browser/browser.zig b/src/browser/browser.zig index 45fc0343c..34ba18dec 100644 --- a/src/browser/browser.zig +++ b/src/browser/browser.zig @@ -335,6 +335,8 @@ pub const Page = struct { // if the url is about:blank, nothing to do. if (std.mem.eql(u8, "about:blank", request_url.raw)) { + var about_blank = AboutBlank{}; + try self.loadHTMLDoc(&about_blank, "utf-8"); return; } @@ -393,6 +395,16 @@ pub const Page = struct { }); } + // A minimal reader for about:blank such that it can be parsed by loadHTMLDoc. + pub const AboutBlank = struct { + done: bool = false, + pub fn next(self: *AboutBlank) !?[]const u8 { + if (self.done) return null; + self.done = true; + return ""; // The contents is blank + } + }; + // https://html.spec.whatwg.org/#read-html fn loadHTMLDoc(self: *Page, reader: anytype, charset: []const u8) !void { const arena = self.arena; diff --git a/src/cdp/domains/target.zig b/src/cdp/domains/target.zig index fca783510..0e0560887 100644 --- a/src/cdp/domains/target.zig +++ b/src/cdp/domains/target.zig @@ -125,6 +125,10 @@ fn createTarget(cmd: anytype) !void { bc.target_id = target_id; var page = try bc.session.createPage(); + // Navigate to about:blank such that the window / state.document are created and set + // Playwright uses these before navigating to a real URL to detect when they are removed. + const url = try @import("../../url.zig").URL.parse("about:blank", ""); + try page.navigate(url, .{}); { const aux_data = try std.fmt.allocPrint(cmd.arena, "{{\"isDefault\":true,\"type\":\"default\",\"frameId\":\"{s}\"}}", .{target_id}); bc.inspector.contextCreated( @@ -501,6 +505,11 @@ test "cdp.target: createTarget" { // should create a browser context const bc = ctx.cdp().browser_context.?; try ctx.expectSentEvent("Target.targetCreated", .{ .targetInfo = .{ .url = "about:blank", .title = "about:blank", .attached = false, .type = "page", .canAccessOpener = false, .browserContextId = bc.id, .targetId = bc.target_id.? } }, .{}); + + // Even about:blank should set the window and document + const page = ctx.cdp().browser_context.?.session.page.?; + try std.testing.expect(page.state.document != null); + try std.testing.expect(page.window.document != null); } {