Skip to content

fix: load the URL shown in the address bar when returning to a pushState/replaceState history entry#16307

Open
Nic-Polumeyv wants to merge 2 commits into
sveltejs:mainfrom
Nic-Polumeyv:fix-shallow-history-url
Open

fix: load the URL shown in the address bar when returning to a pushState/replaceState history entry#16307
Nic-Polumeyv wants to merge 2 commits into
sveltejs:mainfrom
Nic-Polumeyv:fix-shallow-history-url

Conversation

@Nic-Polumeyv

Copy link
Copy Markdown
Contributor

closes #11465

pushState and replaceState write one URL to the address bar and store a different one in the history entry:

const opts = {
	[HISTORY_INDEX]: (current_history_index += 1),
	[NAVIGATION_INDEX]: current_navigation_index,
	[PAGE_URL_KEY]: page.url.href, // the page we were on
	[STATES_KEY]: state
};

history.pushState(opts, '', resolve_url(url)); // the URL the user sees

When you later return to that entry, the popstate handler feeds PAGE_URL_KEY to navigate, so load runs with the old URL while the address bar shows the pushed one. That's the report in the issue, url.searchParams in load missing params that are visibly in the URL after going back.

Both functions now store the same resolved URL they push. This follows teemingc's comment on the issue, keep the page store URL at push time but update the URL that subsequent loads run with.

One existing assertion changes. "Replaces state on a new URL" expected that going forward to a replaced entry renders the old page under the new URL, which is the inconsistency being fixed. It now expects the route the address bar shows, with page.state still restored. A new test covers the reported sequence, push, navigate away, go back, and fails on main.

This doesn't touch the invalidate-after-pushState case from #11503. That needs a decision on push-time load semantics, and an existing test ("Invalidates the correct route after pushing state to a new URL") deliberately locks in the current behavior, so I left it alone. Happy to take it as a follow-up if there's an agreed direction.


Please don't delete this checklist! Before submitting the PR, please make sure you do the following:

  • It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
  • This message body should clearly illustrate what problems it solves.
  • Ideally, include a test that fails without this PR but passes with it.

Tests

  • Run the tests with pnpm test and lint the project with pnpm lint and pnpm check

Changesets

  • If your PR makes a change that should be noted in one or more packages' changelogs, generate a changeset by running pnpm changeset and following the prompts. Changesets that add features should be minor and those that fix bugs should be patch. Please prefix changeset messages with feat:, fix:, or chore:.

Edits

  • Please ensure that 'Allow edits from maintainers' is checked. PRs without this option may be closed.

@pkg-svelte-dev

Copy link
Copy Markdown

Install the latest version of @sveltejs/kit from a7e5b7d:

pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/a7e5b7dede267833dde3cceac18e808d1cb180e3

Open in pkg.svelte.dev: https://pkg.svelte.dev/repos/kit/pr/16307

Note

This PR is from a fork. A maintainer must approve approve each commit before it can be built and installed.

@changeset-bot

changeset-bot Bot commented Jul 10, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a7e5b7d

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/kit Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pushState and replaceState causing inconsistencies with different url

1 participant