From a31497937b431d70ef7e87478c82c956b9fef216 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 24 Dec 2025 09:04:25 -0800 Subject: [PATCH 1/4] use session arena instead of storing arena in Navigation --- src/browser/Session.zig | 2 +- src/browser/webapi/navigation/Navigation.zig | 20 ++++++++------------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/browser/Session.zig b/src/browser/Session.zig index da6b7dd4..9a0757a0 100644 --- a/src/browser/Session.zig +++ b/src/browser/Session.zig @@ -75,7 +75,7 @@ pub fn init(self: *Session, browser: *Browser) !void { .storage_shed = .{}, .arena = session_allocator, .cookie_jar = storage.Cookie.Jar.init(allocator), - .navigation = Navigation.init(session_allocator), + .navigation = .{}, .history = .{}, .transfer_arena = browser.transfer_arena.allocator(), }; diff --git a/src/browser/webapi/navigation/Navigation.zig b/src/browser/webapi/navigation/Navigation.zig index b1fcb225..49026458 100644 --- a/src/browser/webapi/navigation/Navigation.zig +++ b/src/browser/webapi/navigation/Navigation.zig @@ -38,7 +38,6 @@ const NavigationCurrentEntryChangeEvent = @import("../event/NavigationCurrentEnt const NavigationEventTarget = @import("NavigationEventTarget.zig"); _proto: *NavigationEventTarget = undefined, -_arena: std.mem.Allocator, _current_navigation_kind: ?NavigationKind = null, _index: usize = 0, @@ -47,10 +46,6 @@ _entries: std.ArrayList(*NavigationHistoryEntry) = .empty, _next_entry_id: usize = 0, _activation: ?NavigationActivation = null, -pub fn init(arena: std.mem.Allocator) Navigation { - return Navigation{ ._arena = arena }; -} - fn asEventTarget(self: *Navigation) *EventTarget { return self._proto.asEventTarget(); } @@ -171,7 +166,7 @@ pub fn pushEntry( page: *Page, dispatch: bool, ) !*NavigationHistoryEntry { - const arena = self._arena; + const arena = page._session.arena; const url = try arena.dupeZ(u8, _url); // truncates our history here. @@ -220,7 +215,7 @@ pub fn replaceEntry( page: *Page, dispatch: bool, ) !*NavigationHistoryEntry { - const arena = self._arena; + const arena = page._session.arena; const url = try arena.dupeZ(u8, _url); const previous = self.getCurrentEntry(); @@ -263,7 +258,7 @@ pub fn navigateInner( kind: NavigationKind, page: *Page, ) !NavigationReturn { - const arena = self._arena; + const arena = page._session.arena; const url = _url orelse return error.MissingURL; // https://github.com/WICG/navigation-api/issues/95 @@ -315,7 +310,7 @@ pub fn navigateInner( // todo: Fire navigate event finished.resolve("navigation traverse", {}); } else { - try page.navigate(url, .{ .reason = .navigation, .kind = kind }); + try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script); } }, .reload => { @@ -338,8 +333,9 @@ pub fn navigateInner( } pub fn navigate(self: *Navigation, _url: [:0]const u8, _opts: ?NavigateOptions, page: *Page) !NavigationReturn { + const arena = page._session.arena; const opts = _opts orelse NavigateOptions{}; - const json = if (opts.state) |state| state.toJson(self._arena) catch return error.DataClone else null; + const json = if (opts.state) |state| state.toJson(arena) catch return error.DataClone else null; const kind: NavigationKind = if (opts.history) |history| if (std.mem.eql(u8, "replace", history)) .{ .replace = json } else .{ .push = json } @@ -355,7 +351,7 @@ pub const ReloadOptions = struct { }; pub fn reload(self: *Navigation, _opts: ?ReloadOptions, page: *Page) !NavigationReturn { - const arena = self._arena; + const arena = page._session.arena; const opts = _opts orelse ReloadOptions{}; const entry = self.getCurrentEntry(); @@ -397,7 +393,7 @@ pub const UpdateCurrentEntryOptions = struct { }; pub fn updateCurrentEntry(self: *Navigation, options: UpdateCurrentEntryOptions, page: *Page) !void { - const arena = self._arena; + const arena = page._session.arena; const previous = self.getCurrentEntry(); self.getCurrentEntry()._state = .{ From b3e6186c78fd1309d9fa7becc61d9ea0fe7855cc Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 24 Dec 2025 08:40:01 -0800 Subject: [PATCH 2/4] history tests pass without crash --- src/browser/tests/legacy/html/history/history2.html | 8 +++++--- .../tests/legacy/html/history/history_after_nav.html | 8 ++++++-- src/main_legacy_test.zig | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/browser/tests/legacy/html/history/history2.html b/src/browser/tests/legacy/html/history/history2.html index 42bcba09..56b840da 100644 --- a/src/browser/tests/legacy/html/history/history2.html +++ b/src/browser/tests/legacy/html/history/history2.html @@ -2,8 +2,11 @@ - diff --git a/src/main_legacy_test.zig b/src/main_legacy_test.zig index 220b7ba0..cdec1fcb 100644 --- a/src/main_legacy_test.zig +++ b/src/main_legacy_test.zig @@ -98,8 +98,8 @@ pub fn run(allocator: Allocator, file: []const u8, session: *lp.Session) !void { try page.navigate(url, .{}); _ = session.wait(2000); - page._session.browser.runMicrotasks(); - page._session.browser.runMessageLoop(); + // page._session.browser.runMicrotasks(); + // page._session.browser.runMessageLoop(); js_context.eval("testing.assertOk()", "testing.assertOk()") catch |err| { const msg = try_catch.err(allocator) catch @errorName(err) orelse "unknown"; From 872ec336625f03d4c8caf2073e1892edec0c9ece Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 24 Dec 2025 08:45:14 -0800 Subject: [PATCH 3/4] use scheduleNavigation instead of navigate --- src/browser/webapi/navigation/Navigation.zig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/browser/webapi/navigation/Navigation.zig b/src/browser/webapi/navigation/Navigation.zig index 49026458..93361dcd 100644 --- a/src/browser/webapi/navigation/Navigation.zig +++ b/src/browser/webapi/navigation/Navigation.zig @@ -284,7 +284,7 @@ pub fn navigateInner( _ = try self.pushEntry(url, .{ .source = .navigation, .value = state }, page, true); } else { - try page.navigate(url, .{ .reason = .navigation, .kind = kind }); + try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script); } }, .replace => |state| { @@ -297,7 +297,7 @@ pub fn navigateInner( _ = try self.replaceEntry(url, .{ .source = .navigation, .value = state }, page, true); } else { - try page.navigate(url, .{ .reason = .navigation, .kind = kind }); + try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script); } }, .traverse => |index| { @@ -314,7 +314,7 @@ pub fn navigateInner( } }, .reload => { - try page.navigate(url, .{ .reason = .navigation, .kind = kind }); + try page.scheduleNavigation(url, .{ .reason = .navigation, .kind = kind }, .script); }, } From 248ce4f1a819f4bce6773051b80bb24a54115ee1 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 24 Dec 2025 09:03:22 -0800 Subject: [PATCH 4/4] add .skip.html to skip files in legacy tests --- src/browser/tests/legacy/html/history/history.html | 2 +- src/browser/tests/legacy/html/history/history2.html | 7 +------ .../tests/legacy/html/history/history_after_nav.html | 10 ---------- .../legacy/html/history/history_after_nav.skip.html | 6 ++++++ .../tests/legacy/html/navigation/navigation.html | 2 +- ...navigation2.html => navigation_after_nav.skip.html} | 2 +- src/main_legacy_test.zig | 4 ++++ 7 files changed, 14 insertions(+), 19 deletions(-) delete mode 100644 src/browser/tests/legacy/html/history/history_after_nav.html create mode 100644 src/browser/tests/legacy/html/history/history_after_nav.skip.html rename src/browser/tests/legacy/html/navigation/{navigation2.html => navigation_after_nav.skip.html} (88%) diff --git a/src/browser/tests/legacy/html/history/history.html b/src/browser/tests/legacy/html/history/history.html index a1635a2e..824e0e02 100644 --- a/src/browser/tests/legacy/html/history/history.html +++ b/src/browser/tests/legacy/html/history/history.html @@ -11,7 +11,7 @@ testing.expectEqual('auto', history.scrollRestoration); testing.expectEqual(null, history.state) - history.pushState({ testInProgress: true }, null, 'http://127.0.0.1:9589/html/history/history_after_nav.html'); + history.pushState({ testInProgress: true }, null, 'http://127.0.0.1:9589/html/history/history_after_nav.skip.html'); testing.expectEqual({ testInProgress: true }, history.state); history.pushState({ testInProgress: false }, null, 'http://127.0.0.1:9589/xhr/json'); diff --git a/src/browser/tests/legacy/html/history/history2.html b/src/browser/tests/legacy/html/history/history2.html index 56b840da..cb251092 100644 --- a/src/browser/tests/legacy/html/history/history2.html +++ b/src/browser/tests/legacy/html/history/history2.html @@ -4,12 +4,7 @@ - - diff --git a/src/browser/tests/legacy/html/history/history_after_nav.skip.html b/src/browser/tests/legacy/html/history/history_after_nav.skip.html new file mode 100644 index 00000000..5180b14a --- /dev/null +++ b/src/browser/tests/legacy/html/history/history_after_nav.skip.html @@ -0,0 +1,6 @@ + + + + diff --git a/src/browser/tests/legacy/html/navigation/navigation.html b/src/browser/tests/legacy/html/navigation/navigation.html index 99f72e75..f30b9e8e 100644 --- a/src/browser/tests/legacy/html/navigation/navigation.html +++ b/src/browser/tests/legacy/html/navigation/navigation.html @@ -12,7 +12,7 @@ const currentIndex = navigation.currentEntry.index; navigation.navigate( - 'http://localhost:9589/html/navigation/navigation2.html', + 'http://localhost:9589/html/navigation/navigation_after_nav.skip.html', { state: { currentIndex: currentIndex, navTestInProgress: true } } ); diff --git a/src/browser/tests/legacy/html/navigation/navigation2.html b/src/browser/tests/legacy/html/navigation/navigation_after_nav.skip.html similarity index 88% rename from src/browser/tests/legacy/html/navigation/navigation2.html rename to src/browser/tests/legacy/html/navigation/navigation_after_nav.skip.html index b16fa917..e55691bb 100644 --- a/src/browser/tests/legacy/html/navigation/navigation2.html +++ b/src/browser/tests/legacy/html/navigation/navigation_after_nav.skip.html @@ -1,7 +1,7 @@ -