Restore scroll position on back/forward with history:"reload"#3704
Closed
scriptogre wants to merge 1 commit into
Closed
Restore scroll position on back/forward with history:"reload"#3704scriptogre wants to merge 1 commit into
scriptogre wants to merge 1 commit into
Conversation
When history:"reload" is set, pressing back/forward calls location.reload(), which destroys the browser's native scroll restoration. This patch tracks scroll positions in sessionStorage, keyed by a unique index assigned to each history entry. Scroll is saved via a debounced scroll listener (350ms, safe for Safari's replaceState rate limit), on pushState, and on popstate. After reload, the saved position is restored via requestAnimationFrame after the load event. Includes Playwright e2e tests covering back, forward, and repeated cycles.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
history:"reload"loses scroll position on back/forward navigation.Solution
Track scroll positions in
sessionStorage, keyed by a unique index per history entry. Same pattern used by SvelteKit, React Router, and TanStack Router.Scroll is saved via a debounced (350ms) scroll listener, on
pushState, and onpopstate. The 350ms debounce stays under Safari'sreplaceStaterate limit. After reload, scroll is restored viarequestAnimationFrameafter theloadevent.How to test