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