From 099550dddc3056942b95df6798606d7eeb7757bd Mon Sep 17 00:00:00 2001 From: hobostay Date: Sat, 14 Mar 2026 13:18:42 +0800 Subject: [PATCH 1/4] Ignore partitionKey in cookie operations to support Puppeteer page.setCookie() Puppeteer's page.setCookie() internally calls Network.deleteCookies twice before setting a cookie. The second call includes a partitionKey field for CHIPS (partitioned cookies), which caused Lightpanda to return NotImplemented. Since Lightpanda doesn't support partitioned cookies, we now silently ignore the partitionKey parameter and proceed with the cookie operation based on name/domain/path matching. This change affects: - Network.deleteCookies: no longer rejects requests with partitionKey - Network.setCookie (via setCdpCookie): no longer rejects cookies with partitionKey Fixes #1818 Co-Authored-By: Claude Opus 4.6 --- src/cdp/domains/network.zig | 7 ++++++- src/cdp/domains/storage.zig | 10 +++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/cdp/domains/network.zig b/src/cdp/domains/network.zig index c04ee33b..dab07df8 100644 --- a/src/cdp/domains/network.zig +++ b/src/cdp/domains/network.zig @@ -117,7 +117,12 @@ fn deleteCookies(cmd: anytype) !void { path: ?[]const u8 = null, partitionKey: ?CdpStorage.CookiePartitionKey = null, })) orelse return error.InvalidParams; - if (params.partitionKey != null) return error.NotImplemented; + // Silently ignore partitionKey since we don't support partitioned cookies (CHIPS). + // This allows Puppeteer's page.setCookie() to work, which sends deleteCookies + // with partitionKey as part of its cookie-setting workflow. + if (params.partitionKey != null) { + log.debug(.network, "partitionKey ignored in deleteCookies", .{}); + } const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded; const cookies = &bc.session.cookie_jar.cookies; diff --git a/src/cdp/domains/storage.zig b/src/cdp/domains/storage.zig index c7546ad6..d772f736 100644 --- a/src/cdp/domains/storage.zig +++ b/src/cdp/domains/storage.zig @@ -128,7 +128,15 @@ pub const CdpCookie = struct { }; pub fn setCdpCookie(cookie_jar: *CookieJar, param: CdpCookie) !void { - if (param.priority != .Medium or param.sameParty != null or param.sourceScheme != null or param.partitionKey != null) { + // Silently ignore partitionKey since we don't support partitioned cookies (CHIPS). + // This allows Puppeteer's page.setCookie() to work, which may send cookies with + // partitionKey as part of its cookie-setting workflow. + if (param.partitionKey != null) { + const log = @import("../../log.zig"); + log.debug(.storage, "partitionKey ignored in setCdpCookie", .{}); + } + // Still reject unsupported features + if (param.priority != .Medium or param.sameParty != null or param.sourceScheme != null) { return error.NotImplemented; } From 68337a6989d027fd51cc5e89d87d62c7661e6e91 Mon Sep 17 00:00:00 2001 From: hobostay Date: Sat, 14 Mar 2026 17:32:48 +0800 Subject: [PATCH 2/4] Fix compilation errors: add missing log import and remove duplicate - Add missing `const log = @import("../../log.zig");` in network.zig - Remove duplicate `log` declaration inside setCdpCookie in storage.zig (already declared at file scope) Fixes compilation errors: - src/cdp/domains/network.zig:124:9: error: use of undeclared identifier 'log' - src/cdp/domains/storage.zig:135:15: error: local constant shadows declaration of 'log' Co-Authored-By: Claude Opus 4.6 --- src/cdp/domains/network.zig | 1 + src/cdp/domains/storage.zig | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cdp/domains/network.zig b/src/cdp/domains/network.zig index dab07df8..5c422a8d 100644 --- a/src/cdp/domains/network.zig +++ b/src/cdp/domains/network.zig @@ -19,6 +19,7 @@ const std = @import("std"); const lp = @import("lightpanda"); const Allocator = std.mem.Allocator; +const log = @import("../../log.zig"); const CdpStorage = @import("storage.zig"); diff --git a/src/cdp/domains/storage.zig b/src/cdp/domains/storage.zig index d772f736..497f7efa 100644 --- a/src/cdp/domains/storage.zig +++ b/src/cdp/domains/storage.zig @@ -132,7 +132,6 @@ pub fn setCdpCookie(cookie_jar: *CookieJar, param: CdpCookie) !void { // This allows Puppeteer's page.setCookie() to work, which may send cookies with // partitionKey as part of its cookie-setting workflow. if (param.partitionKey != null) { - const log = @import("../../log.zig"); log.debug(.storage, "partitionKey ignored in setCdpCookie", .{}); } // Still reject unsupported features From 1ec3e156fbe00248e6a611bd9f906e215f4df411 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 16 Mar 2026 07:28:14 +0800 Subject: [PATCH 3/4] Fix partitionKey ignore PR Fixes https://github.com/lightpanda-io/browser/pull/1821 so that it compiles --- src/cdp/domains/network.zig | 2 +- src/cdp/domains/storage.zig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cdp/domains/network.zig b/src/cdp/domains/network.zig index 5c422a8d..3599a88d 100644 --- a/src/cdp/domains/network.zig +++ b/src/cdp/domains/network.zig @@ -122,7 +122,7 @@ fn deleteCookies(cmd: anytype) !void { // This allows Puppeteer's page.setCookie() to work, which sends deleteCookies // with partitionKey as part of its cookie-setting workflow. if (params.partitionKey != null) { - log.debug(.network, "partitionKey ignored in deleteCookies", .{}); + log.warn(.not_implemented, "partition key", .{.src = "deleteCookies"}); } const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded; diff --git a/src/cdp/domains/storage.zig b/src/cdp/domains/storage.zig index 497f7efa..92a8018a 100644 --- a/src/cdp/domains/storage.zig +++ b/src/cdp/domains/storage.zig @@ -132,7 +132,7 @@ pub fn setCdpCookie(cookie_jar: *CookieJar, param: CdpCookie) !void { // This allows Puppeteer's page.setCookie() to work, which may send cookies with // partitionKey as part of its cookie-setting workflow. if (param.partitionKey != null) { - log.debug(.storage, "partitionKey ignored in setCdpCookie", .{}); + log.warn(.not_implemented, "partition key", .{.src = "setCdpCookie"}); } // Still reject unsupported features if (param.priority != .Medium or param.sameParty != null or param.sourceScheme != null) { From 323ec0046c584aefa63069135612554e5dabc85f Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 16 Mar 2026 07:36:14 +0800 Subject: [PATCH 4/4] zig fmt --- src/cdp/domains/network.zig | 2 +- src/cdp/domains/storage.zig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cdp/domains/network.zig b/src/cdp/domains/network.zig index 3599a88d..5b9a49df 100644 --- a/src/cdp/domains/network.zig +++ b/src/cdp/domains/network.zig @@ -122,7 +122,7 @@ fn deleteCookies(cmd: anytype) !void { // This allows Puppeteer's page.setCookie() to work, which sends deleteCookies // with partitionKey as part of its cookie-setting workflow. if (params.partitionKey != null) { - log.warn(.not_implemented, "partition key", .{.src = "deleteCookies"}); + log.warn(.not_implemented, "partition key", .{ .src = "deleteCookies" }); } const bc = cmd.browser_context orelse return error.BrowserContextNotLoaded; diff --git a/src/cdp/domains/storage.zig b/src/cdp/domains/storage.zig index 92a8018a..e0f67456 100644 --- a/src/cdp/domains/storage.zig +++ b/src/cdp/domains/storage.zig @@ -132,7 +132,7 @@ pub fn setCdpCookie(cookie_jar: *CookieJar, param: CdpCookie) !void { // This allows Puppeteer's page.setCookie() to work, which may send cookies with // partitionKey as part of its cookie-setting workflow. if (param.partitionKey != null) { - log.warn(.not_implemented, "partition key", .{.src = "setCdpCookie"}); + log.warn(.not_implemented, "partition key", .{ .src = "setCdpCookie" }); } // Still reject unsupported features if (param.priority != .Medium or param.sameParty != null or param.sourceScheme != null) {