mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-12-16 08:18:59 +00:00
properly handle replace navigation case
This commit is contained in:
@@ -101,28 +101,27 @@ pub fn _forward(self: *Navigation, page: *Page) !NavigationReturn {
|
|||||||
return self.navigate(next_entry.url, .{ .traverse = new_index }, page);
|
return self.navigate(next_entry.url, .{ .traverse = new_index }, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn updateEntries(self: *Navigation, url: []const u8, kind: NavigationKind, page: *Page, dispatch: bool) !void {
|
||||||
|
switch (kind) {
|
||||||
|
.replace => {
|
||||||
|
_ = try self.replaceEntry(url, null, page, dispatch);
|
||||||
|
},
|
||||||
|
.push => |state| {
|
||||||
|
_ = try self.pushEntry(url, state, page, dispatch);
|
||||||
|
},
|
||||||
|
.traverse => |index| {
|
||||||
|
self.index = index;
|
||||||
|
},
|
||||||
|
.reload => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This is for after true navigation processing, where we need to ensure that our entries are up to date.
|
// This is for after true navigation processing, where we need to ensure that our entries are up to date.
|
||||||
// This is only really safe to run in the `pageDoneCallback` where we can guarantee that the URL and NavigationKind are correct.
|
// This is only really safe to run in the `pageDoneCallback` where we can guarantee that the URL and NavigationKind are correct.
|
||||||
pub fn processNavigation(self: *Navigation, page: *Page) !void {
|
pub fn processNavigation(self: *Navigation, page: *Page) !void {
|
||||||
const url = page.url.raw;
|
const url = page.url.raw;
|
||||||
const kind = page.session.navigation_kind;
|
const kind: NavigationKind = page.session.navigation_kind orelse .{ .push = null };
|
||||||
|
try self.updateEntries(url, kind, page, false);
|
||||||
if (kind) |k| {
|
|
||||||
switch (k) {
|
|
||||||
.replace => {
|
|
||||||
// When replacing, we just update the URL but the state is nullified.
|
|
||||||
const entry = self.currentEntry();
|
|
||||||
entry.url = url;
|
|
||||||
entry.state = null;
|
|
||||||
},
|
|
||||||
.push => |state| {
|
|
||||||
_ = try self.pushEntry(url, state, page, false);
|
|
||||||
},
|
|
||||||
.traverse, .reload => {},
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_ = try self.pushEntry(url, null, page, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pushes an entry into the Navigation stack WITHOUT actually navigating to it.
|
/// Pushes an entry into the Navigation stack WITHOUT actually navigating to it.
|
||||||
@@ -166,6 +165,33 @@ pub fn pushEntry(self: *Navigation, _url: []const u8, state: ?[]const u8, page:
|
|||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn replaceEntry(self: *Navigation, _url: []const u8, state: ?[]const u8, page: *Page, dispatch: bool) !*NavigationHistoryEntry {
|
||||||
|
const arena = page.session.arena;
|
||||||
|
const url = try arena.dupe(u8, _url);
|
||||||
|
|
||||||
|
const previous = self.currentEntry();
|
||||||
|
|
||||||
|
const id = self.next_entry_id;
|
||||||
|
self.next_entry_id += 1;
|
||||||
|
const id_str = try std.fmt.allocPrint(arena, "{d}", .{id});
|
||||||
|
|
||||||
|
const entry = try arena.create(NavigationHistoryEntry);
|
||||||
|
entry.* = NavigationHistoryEntry{
|
||||||
|
.id = id_str,
|
||||||
|
.key = id_str,
|
||||||
|
.url = url,
|
||||||
|
.state = state,
|
||||||
|
};
|
||||||
|
|
||||||
|
self.entries.items[self.index] = entry;
|
||||||
|
|
||||||
|
if (dispatch) {
|
||||||
|
NavigationCurrentEntryChangeEvent.dispatch(self, previous, .replace);
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
const NavigateOptions = struct {
|
const NavigateOptions = struct {
|
||||||
const NavigateOptionsHistory = enum {
|
const NavigateOptionsHistory = enum {
|
||||||
pub const ENUM_JS_USE_TAG = true;
|
pub const ENUM_JS_USE_TAG = true;
|
||||||
|
|||||||
@@ -1075,9 +1075,7 @@ pub const Page = struct {
|
|||||||
|
|
||||||
if (try self.url.eqlDocument(&new_url, session.transfer_arena)) {
|
if (try self.url.eqlDocument(&new_url, session.transfer_arena)) {
|
||||||
self.url = new_url;
|
self.url = new_url;
|
||||||
|
try session.navigation.updateEntries(stitched_url, kind, self, true);
|
||||||
const prev = session.navigation.currentEntry();
|
|
||||||
NavigationCurrentEntryChangeEvent.dispatch(&self.session.navigation, prev, kind);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user