From 65751a69aed5486705ca4c104445a841d5949860 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 8 Dec 2025 16:28:31 +0800 Subject: [PATCH] document.cookie --- src/browser/tests/document/document.html | 11 +++++++++ src/browser/webapi/HTMLDocument.zig | 24 +++++++++++++++++++ .../webapi/storage/{cookie.zig => Cookie.zig} | 0 3 files changed, 35 insertions(+) rename src/browser/webapi/storage/{cookie.zig => Cookie.zig} (100%) diff --git a/src/browser/tests/document/document.html b/src/browser/tests/document/document.html index cc5ee34e..8658b9b6 100644 --- a/src/browser/tests/document/document.html +++ b/src/browser/tests/document/document.html @@ -169,3 +169,14 @@ newAnchor.remove(); testing.expectEqual(initialLength, anchors.length); + + diff --git a/src/browser/webapi/HTMLDocument.zig b/src/browser/webapi/HTMLDocument.zig index 16914b7b..1d6dedc4 100644 --- a/src/browser/webapi/HTMLDocument.zig +++ b/src/browser/webapi/HTMLDocument.zig @@ -140,6 +140,29 @@ pub fn getAll(self: *HTMLDocument, page: *Page) !*collections.HTMLAllCollection return page._factory.create(collections.HTMLAllCollection.init(self.asNode(), page)); } +pub fn getCookie(_: *HTMLDocument, page: *Page) ![]const u8 { + var buf: std.ArrayList(u8) = .empty; + try page._session.cookie_jar.forRequest(page.url, buf.writer(page.call_arena), .{ + .is_http = false, + .is_navigation = true, + }); + return buf.items; +} + +pub fn setCookie(_: *HTMLDocument, cookie_str: []const u8, page: *Page) ![]const u8 { + // we use the cookie jar's allocator to parse the cookie because it + // outlives the page's arena. + const Cookie = @import("storage/Cookie.zig"); + const c = try Cookie.parse(page._session.cookie_jar.allocator, page.url, cookie_str); + errdefer c.deinit(); + if (c.http_only) { + c.deinit(); + return ""; // HttpOnly cookies cannot be set from JS + } + try page._session.cookie_jar.add(c, std.time.timestamp()); + return cookie_str; +} + pub const JsApi = struct { pub const bridge = js.Bridge(HTMLDocument); @@ -170,4 +193,5 @@ pub const JsApi = struct { pub const currentScript = bridge.accessor(HTMLDocument.getCurrentScript, null, .{}); pub const location = bridge.accessor(HTMLDocument.getLocation, null, .{ .cache = "location" }); pub const all = bridge.accessor(HTMLDocument.getAll, null, .{}); + pub const cookie = bridge.accessor(HTMLDocument.getCookie, HTMLDocument.setCookie, .{}); }; diff --git a/src/browser/webapi/storage/cookie.zig b/src/browser/webapi/storage/Cookie.zig similarity index 100% rename from src/browser/webapi/storage/cookie.zig rename to src/browser/webapi/storage/Cookie.zig