From 4fc09eccdf20e9b4872a155beee21578278bcb9f Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Wed, 12 Nov 2025 09:51:49 -0800 Subject: [PATCH] proper handling of history opt in navigate --- src/browser/html/location.zig | 4 ++-- src/browser/navigation/Navigation.zig | 24 +++++++++++++++++++++--- src/browser/navigation/root.zig | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/browser/html/location.zig b/src/browser/html/location.zig index 45817845..dc959e87 100644 --- a/src/browser/html/location.zig +++ b/src/browser/html/location.zig @@ -56,7 +56,7 @@ pub const Location = struct { break :blk try std.fmt.allocPrint(page.arena, "#{s}", .{hash}); }; - return page.navigateFromWebAPI(normalized_hash, .{ .reason = .script }, .replace); + return page.navigateFromWebAPI(normalized_hash, .{ .reason = .script }, .{ .replace = null }); } pub fn get_protocol(self: *Location) []const u8 { @@ -96,7 +96,7 @@ pub const Location = struct { } pub fn _replace(_: *const Location, url: []const u8, page: *Page) !void { - return page.navigateFromWebAPI(url, .{ .reason = .script }, .replace); + return page.navigateFromWebAPI(url, .{ .reason = .script }, .{ .replace = null }); } pub fn _reload(_: *const Location, page: *Page) !void { diff --git a/src/browser/navigation/Navigation.zig b/src/browser/navigation/Navigation.zig index a739eaf7..9f2da76c 100644 --- a/src/browser/navigation/Navigation.zig +++ b/src/browser/navigation/Navigation.zig @@ -197,7 +197,7 @@ pub fn replaceEntry( const entry = try arena.create(NavigationHistoryEntry); entry.* = NavigationHistoryEntry{ .id = id_str, - .key = id_str, + .key = previous.key, .url = url, .state = state, }; @@ -260,6 +260,19 @@ pub fn navigate( try page.navigateFromWebAPI(url, .{ .reason = .navigation }, kind); } }, + .replace => |state| { + if (is_same_document) { + page.url = new_url; + + try committed.resolve({}); + // todo: Fire navigate event + try finished.resolve({}); + + _ = try self.replaceEntry(url, .{ .source = .navigation, .value = state }, page, true); + } else { + try page.navigateFromWebAPI(url, .{ .reason = .navigation }, kind); + } + }, .traverse => |index| { self.index = index; @@ -276,7 +289,6 @@ pub fn navigate( .reload => { try page.navigateFromWebAPI(url, .{ .reason = .navigation }, kind); }, - else => unreachable, } return .{ @@ -288,7 +300,13 @@ pub fn navigate( pub fn _navigate(self: *Navigation, _url: []const u8, _opts: ?NavigateOptions, page: *Page) !NavigationReturn { const opts = _opts orelse NavigateOptions{}; const json = if (opts.state) |state| state.toJson(page.session.arena) catch return error.DataClone else null; - return try self.navigate(_url, .{ .push = json }, page); + + const kind: NavigationKind = switch (opts.history) { + .replace => .{ .replace = json }, + .push, .auto => .{ .push = json }, + }; + + return try self.navigate(_url, kind, page); } pub const ReloadOptions = struct { diff --git a/src/browser/navigation/root.zig b/src/browser/navigation/root.zig index 14c5898c..969a9997 100644 --- a/src/browser/navigation/root.zig +++ b/src/browser/navigation/root.zig @@ -51,7 +51,7 @@ pub const NavigationType = enum { pub const NavigationKind = union(NavigationType) { push: ?[]const u8, - replace, + replace: ?[]const u8, traverse: usize, reload, };