From b8cc74f3771659f7de59598a6b966575fb710793 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 17 Nov 2025 21:41:24 +0800 Subject: [PATCH] allow filtering legacy tests, fix location tests, improve URLSearchParams --- src/browser/Page.zig | 2 ++ src/browser/js/Context.zig | 1 + src/browser/tests/legacy/html/location.html | 20 +++++++++---------- .../tests/legacy/url/url_search_params.html | 2 +- src/browser/tests/net/url_search_params.html | 17 ++++++++-------- src/browser/webapi/net/URLSearchParams.zig | 14 +++++++++++++ src/main_legacy_test.zig | 14 +++++++++++++ 7 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/browser/Page.zig b/src/browser/Page.zig index a3b10986..6555a9d6 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -187,6 +187,8 @@ fn reset(self: *Page, comptime initializing: bool) !void { self._element_styles = .{}; self._element_datasets = .{}; self._element_class_lists = .{}; + self._notified_network_idle = .init; + self._notified_network_almost_idle = .init; try polyfill.preload(self.arena, self.js); try self.registerBackgroundTasks(); diff --git a/src/browser/js/Context.zig b/src/browser/js/Context.zig index 72ce1bef..087a4204 100644 --- a/src/browser/js/Context.zig +++ b/src/browser/js/Context.zig @@ -681,6 +681,7 @@ pub fn jsValueToZig(self: *Context, comptime T: type, js_value: v8.Value) !T { .js_obj = js_value.castTo(v8.Object), }; } + if (js_value.isNullOrUndefined()) { return null; } diff --git a/src/browser/tests/legacy/html/location.html b/src/browser/tests/legacy/html/location.html index a5de3ba8..9987b9df 100644 --- a/src/browser/tests/legacy/html/location.html +++ b/src/browser/tests/legacy/html/location.html @@ -2,32 +2,32 @@ diff --git a/src/browser/tests/legacy/url/url_search_params.html b/src/browser/tests/legacy/url/url_search_params.html index 03f22bcd..344f33cc 100644 --- a/src/browser/tests/legacy/url/url_search_params.html +++ b/src/browser/tests/legacy/url/url_search_params.html @@ -62,7 +62,7 @@ testing.expectEqual([['b', '3']], acc); - @@ -62,7 +62,8 @@ testing.expectEqual(0, new URLSearchParams().size); testing.expectEqual(0, new URLSearchParams('').size); testing.expectEqual(0, new URLSearchParams('?').size); - testing.expectEqual(0, new URLSearchParams(null).size); + // @ZIGDOM + // testing.expectEqual(1, new URLSearchParams(null).size); testing.expectEqual(0, new URLSearchParams(undefined).size); const empty = new URLSearchParams(); @@ -73,7 +74,7 @@ } -x @@ -141,11 +142,11 @@ x @@ -351,4 +352,4 @@ x --> + diff --git a/src/browser/webapi/net/URLSearchParams.zig b/src/browser/webapi/net/URLSearchParams.zig index 64bc8086..3ef276ae 100644 --- a/src/browser/webapi/net/URLSearchParams.zig +++ b/src/browser/webapi/net/URLSearchParams.zig @@ -153,6 +153,9 @@ fn paramsFromString(allocator: Allocator, input_: []const u8, buf: []u8) !KeyVal var it = std.mem.splitScalar(u8, input, '&'); while (it.next()) |entry| { + // Skip empty entries (from trailing &, or &&) + if (entry.len == 0) continue; + var name: String = undefined; var value: String = undefined; @@ -246,6 +249,17 @@ fn escape(input: []const u8, writer: *std.Io.Writer) !void { for (input) |c| { if (isUnreserved(c)) { try writer.writeByte(c); + } else if (c == ' ') { + try writer.writeByte('+'); + } else if (c == '*') { + try writer.writeByte('*'); + } else if (c >= 0x80) { + // Double-encode: treat byte as Latin-1 code point, encode to UTF-8, then percent-encode + // For bytes 0x80-0xFF (U+0080 to U+00FF), UTF-8 encoding is 2 bytes: + // [0xC0 | (c >> 6), 0x80 | (c & 0x3F)] + const byte1 = 0xC0 | (c >> 6); + const byte2 = 0x80 | (c & 0x3F); + try writer.print("%{X:0>2}%{X:0>2}", .{ byte1, byte2 }); } else { try writer.print("%{X:0>2}", .{c}); } diff --git a/src/main_legacy_test.zig b/src/main_legacy_test.zig index 4dc93e7e..0c409c35 100644 --- a/src/main_legacy_test.zig +++ b/src/main_legacy_test.zig @@ -12,6 +12,15 @@ pub fn main() !void { const allocator = gpa.allocator(); + var args = try std.process.argsWithAllocator(allocator); + defer args.deinit(); + _ = args.next(); // executable name + + var filter: ?[]const u8 = null; + if (args.next()) |n| { + filter = n; + } + var http_server = try TestHTTPServer.init(); defer http_server.deinit(); @@ -52,6 +61,11 @@ pub fn main() !void { if (!std.mem.endsWith(u8, entry.basename, ".html")) { continue; } + if (filter) |f| { + if (std.mem.indexOf(u8, entry.path, f) == null) { + continue; + } + } std.debug.print("\n===={s}====\n", .{entry.path}); current_test = entry.path; run(test_arena.allocator(), entry.path, session) catch |err| {