From 5a0c7eff66ae2621fa0a0144bae65ff3a0bbbc17 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 7 May 2026 09:14:07 +0800 Subject: [PATCH] Protect assertion when reload from about:blank (and hopefully all other cases) where a commit happens on a previously blank slate. --- src/browser/webapi/navigation/Navigation.zig | 34 +++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/browser/webapi/navigation/Navigation.zig b/src/browser/webapi/navigation/Navigation.zig index 4b95584f..41ce62f0 100644 --- a/src/browser/webapi/navigation/Navigation.zig +++ b/src/browser/webapi/navigation/Navigation.zig @@ -153,10 +153,14 @@ pub fn updateEntries( pub fn commitNavigation(self: *Navigation, frame: *Frame) !void { const url = frame.url; - const kind: NavigationKind = self._current_navigation_kind orelse .{ .push = null }; + var kind: NavigationKind = self._current_navigation_kind orelse .{ .push = null }; defer self._current_navigation_kind = null; const from_entry = self.getCurrentEntryOrNull(); + if (from_entry == null) { + kind = .{ .push = null }; + } + try self.updateEntries(url, kind, frame, false); self._activation = NavigationActivation{ @@ -517,3 +521,31 @@ test "Navigation: about:blank commits entry" { ); try testing.expect(result.isTrue()); } + +test "Navigation: reload on empty stack seeds an entry" { + const frame = try testing.test_session.createPage(); + defer testing.test_session.removePage(); + + testing.test_session.navigation._entries.clearRetainingCapacity(); + testing.test_session.navigation._index = 0; + + // Mirrors CDP Page.reload arriving on a fresh session: doReload reads + // frame.url (default "about:blank") and routes through the synchronous + // about:blank commit with kind=.reload. updateEntries is a no-op for + // .reload, so without the empty-stack guard this would assert + // `len: 0` in getCurrentEntry. + try frame.navigate("about:blank", .{ .kind = .reload }); + + var runner = try testing.test_session.runner(.{}); + try runner.wait(.{ .ms = 1000 }); + + var ls: js.Local.Scope = undefined; + frame.js.localScope(&ls); + defer ls.deinit(); + + const result = try ls.local.exec( + "navigation.currentEntry.url === 'about:blank'", + "Navigation.test", + ); + try testing.expect(result.isTrue()); +}