mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-04-01 01:46:44 +00:00
URLSearchParams: support passing arrays to constructor
This commit is contained in:
@@ -46,6 +46,10 @@ pub fn init(opts_: ?InitOpts, page: *Page) !*URLSearchParams {
|
||||
.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| {
|
||||
// Order matters here; Array is also an Object.
|
||||
if (js_val.isArray()) {
|
||||
break :blk try paramsFromArray(arena, js_val.toArray());
|
||||
}
|
||||
if (js_val.isObject()) {
|
||||
break :blk try KeyValueList.fromJsObject(arena, js_val.toObject(), null, page);
|
||||
}
|
||||
@@ -134,6 +138,37 @@ pub fn sort(self: *URLSearchParams) void {
|
||||
}.cmp);
|
||||
}
|
||||
|
||||
fn paramsFromArray(allocator: Allocator, array: js.Array) !KeyValueList {
|
||||
const array_len = array.len();
|
||||
if (array_len == 0) {
|
||||
return .empty;
|
||||
}
|
||||
|
||||
var params = KeyValueList.init();
|
||||
try params.ensureTotalCapacity(allocator, array_len);
|
||||
// TODO: Release `params` on error.
|
||||
|
||||
var i: u32 = 0;
|
||||
while (i < array_len) : (i += 1) {
|
||||
const item = try array.get(i);
|
||||
if (!item.isArray()) return error.InvalidArgument;
|
||||
|
||||
const as_array = item.toArray();
|
||||
// Need 2 items for KV.
|
||||
if (as_array.len() != 2) return error.InvalidArgument;
|
||||
|
||||
const name_val = try as_array.get(0);
|
||||
const value_val = try as_array.get(1);
|
||||
|
||||
params._entries.appendAssumeCapacity(.{
|
||||
.name = try name_val.toSSOWithAlloc(allocator),
|
||||
.value = try value_val.toSSOWithAlloc(allocator),
|
||||
});
|
||||
}
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
fn paramsFromString(allocator: Allocator, input_: []const u8, buf: []u8) !KeyValueList {
|
||||
if (input_.len == 0) {
|
||||
return .empty;
|
||||
|
||||
Reference in New Issue
Block a user