diff --git a/.changeset/stale-games-shake.md b/.changeset/stale-games-shake.md new file mode 100644 index 000000000000..a2345b83c677 --- /dev/null +++ b/.changeset/stale-games-shake.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: `popstate` navigations take `pushState` navigations into account diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index e1bc5f7368d3..8caf64c2618c 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1818,6 +1818,7 @@ export function pushState(url, state) { }; history.pushState(opts, '', resolve_url(url)); + has_navigated = true; page = { ...page, state }; root.$set({ page }); diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index f0e9ead9f209..21a5546bc978 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -989,6 +989,17 @@ test.describe('Shallow routing', () => { await expect(page.locator('span')).not.toHaveText(now); }); + test('Does not navigate when going back to shallow route', async ({ baseURL, page }) => { + await page.goto('/shallow-routing/push-state'); + await page.locator('[data-id="two"]').click(); + await page.goBack(); + await page.goForward(); + + expect(page.url()).toBe(`${baseURL}/shallow-routing/push-state/a`); + await expect(page.locator('h1')).toHaveText('parent'); + await expect(page.locator('p')).toHaveText('active: true'); + }); + test('Replaces state on the current URL', async ({ baseURL, page, clicknav }) => { await page.goto('/shallow-routing/replace-state/b'); await clicknav('[href="/shallow-routing/replace-state"]');