From 01ce0862404b9b834c03293f9723e1bf1ab21443 Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Mon, 12 May 2025 13:12:06 +0200 Subject: [PATCH 1/3] load aboutblank doc to set window --- src/browser/browser.zig | 22 ++++++++++++++++++++++ src/cdp/domains/target.zig | 9 +++++++++ 2 files changed, 31 insertions(+) diff --git a/src/browser/browser.zig b/src/browser/browser.zig index 45fc0343c..f1d24631e 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,26 @@ pub const Page = struct { }); } + // A minimal reader for about:blank such that it can be parsed by loadHTMLDoc. + pub const AboutBlank = struct { + const content = + \\ + \\ + \\ + \\ + \\ + \\ + \\ + \\ + ; + done: bool = false, + pub fn next(self: *AboutBlank) !?[]const u8 { + if (self.done) return null; + self.done = true; + return AboutBlank.content; + } + }; + // 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..03754faf5 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 testing.expect(page.state.document != null); + try testing.expect(page.window.document != null); } { From 1cf6ab54211217a120c94c4a410876112d591925 Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Mon, 12 May 2025 13:22:42 +0200 Subject: [PATCH 2/3] std.testing --- src/cdp/domains/target.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cdp/domains/target.zig b/src/cdp/domains/target.zig index 03754faf5..0e0560887 100644 --- a/src/cdp/domains/target.zig +++ b/src/cdp/domains/target.zig @@ -508,8 +508,8 @@ test "cdp.target: createTarget" { // Even about:blank should set the window and document const page = ctx.cdp().browser_context.?.session.page.?; - try testing.expect(page.state.document != null); - try testing.expect(page.window.document != null); + try std.testing.expect(page.state.document != null); + try std.testing.expect(page.window.document != null); } { From 2f9829d00dc7b79df64c0cd8a8b839fb4734170f Mon Sep 17 00:00:00 2001 From: sjorsdonkers <72333389+sjorsdonkers@users.noreply.github.com> Date: Mon, 12 May 2025 13:41:53 +0200 Subject: [PATCH 3/3] minify aboutblank page contents --- src/browser/browser.zig | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/browser/browser.zig b/src/browser/browser.zig index f1d24631e..34ba18dec 100644 --- a/src/browser/browser.zig +++ b/src/browser/browser.zig @@ -397,21 +397,11 @@ pub const Page = struct { // A minimal reader for about:blank such that it can be parsed by loadHTMLDoc. pub const AboutBlank = struct { - const content = - \\ - \\ - \\ - \\ - \\ - \\ - \\ - \\ - ; done: bool = false, pub fn next(self: *AboutBlank) !?[]const u8 { if (self.done) return null; self.done = true; - return AboutBlank.content; + return ""; // The contents is blank } };