From 52dcc6765af407da356333fdcab86ff56e987fb9 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Sat, 13 Dec 2025 12:47:54 +0800 Subject: [PATCH] URLSearchParams from FormData --- .../tests/legacy/url/url_search_params.html | 1 - src/browser/tests/net/url_search_params.html | 14 +++++++++++ src/browser/webapi/URL.zig | 24 ++++++------------- src/browser/webapi/net/URLSearchParams.zig | 5 +++- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/browser/tests/legacy/url/url_search_params.html b/src/browser/tests/legacy/url/url_search_params.html index 344f33cc..738253d2 100644 --- a/src/browser/tests/legacy/url/url_search_params.html +++ b/src/browser/tests/legacy/url/url_search_params.html @@ -81,7 +81,6 @@ testing.expectEqual(3, ups.size); testing.expectEqual(['1', '2'], ups.getAll('a')); - testing.expectEqual(['3'], ups.getAll('b')); fd.delete('a'); // the two aren't linked, it created a copy diff --git a/src/browser/tests/net/url_search_params.html b/src/browser/tests/net/url_search_params.html index 54b66b3d..74d7c03b 100644 --- a/src/browser/tests/net/url_search_params.html +++ b/src/browser/tests/net/url_search_params.html @@ -353,3 +353,17 @@ testing.expectEqual(['a', 'a', 'b', 'b', 'c'], Array.from(usp.keys())); } + + diff --git a/src/browser/webapi/URL.zig b/src/browser/webapi/URL.zig index 766bd3c2..e886c8eb 100644 --- a/src/browser/webapi/URL.zig +++ b/src/browser/webapi/URL.zig @@ -35,23 +35,6 @@ _search_params: ?*URLSearchParams = null, pub const resolve = @import("../URL.zig").resolve; pub const eqlDocument = @import("../URL.zig").eqlDocument; -pub fn canParse(url: []const u8, base_: ?[]const u8, page: *Page) bool { - _ = page; - const url_is_absolute = U.isCompleteHTTPUrl(url); - - if (base_) |b| { - // Base must be valid even if URL is absolute - if (!U.isCompleteHTTPUrl(b)) { - return false; - } - return true; - } else if (!url_is_absolute) { - return false; - } else { - return true; - } -} - pub fn init(url: [:0]const u8, base_: ?[:0]const u8, page: *Page) !*URL { const url_is_absolute = @import("../URL.zig").isCompleteHTTPUrl(url); @@ -238,6 +221,13 @@ pub fn toString(self: *const URL, page: *const Page) ![:0]const u8 { return buf.written()[0 .. buf.written().len - 1 :0]; } +pub fn canParse(url: []const u8, base_: ?[]const u8) bool { + if (base_) |b| { + return U.isCompleteHTTPUrl(b); + } + return U.isCompleteHTTPUrl(url); +} + pub const JsApi = struct { pub const bridge = js.Bridge(URL); diff --git a/src/browser/webapi/net/URLSearchParams.zig b/src/browser/webapi/net/URLSearchParams.zig index 2cfe3b2c..482c4c7f 100644 --- a/src/browser/webapi/net/URLSearchParams.zig +++ b/src/browser/webapi/net/URLSearchParams.zig @@ -24,8 +24,9 @@ const String = @import("../../../string.zig").String; const Allocator = std.mem.Allocator; const Page = @import("../../Page.zig"); -const GenericIterator = @import("../collections/iterator.zig").Entry; +const FormData = @import("FormData.zig"); const KeyValueList = @import("../KeyValueList.zig"); +const GenericIterator = @import("../collections/iterator.zig").Entry; const URLSearchParams = @This(); @@ -33,6 +34,7 @@ _arena: Allocator, _params: KeyValueList, const InitOpts = union(enum) { + form_data: *FormData, value: js.Value, query_string: []const u8, }; @@ -43,6 +45,7 @@ pub fn init(opts_: ?InitOpts, page: *Page) !*URLSearchParams { const opts = opts_ orelse break :blk .empty; switch (opts) { .query_string => |qs| break :blk try paramsFromString(arena, qs, &page.buf), + .form_data => |fd| break :blk try KeyValueList.copy(arena, fd._list), .value => |js_val| { if (js_val.isObject()) { break :blk try KeyValueList.fromJsObject(arena, js_val.toObject(), null, page);