diff --git a/.changeset/dull-spies-hammer.md b/.changeset/dull-spies-hammer.md new file mode 100644 index 000000000000..119795f86fec --- /dev/null +++ b/.changeset/dull-spies-hammer.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: don't use fork of unrelated route diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index b04664ddc578..f07164930983 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1690,8 +1690,9 @@ async function navigate({ } } + // also compare ids to avoid using wrong fork (e.g. a new one could've been added while navigating) + const load_cache_fork = intent && load_cache?.id === intent.id ? load_cache.fork : null; // reset preload synchronously after the history state has been set to avoid race conditions - const load_cache_fork = load_cache?.fork; load_cache = null; navigation_result.props.page.state = state; diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/slow-navigation/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/slow-navigation/+page.svelte index e69de29bb2d1..216c10c4ecdc 100644 --- a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/slow-navigation/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/slow-navigation/+page.svelte @@ -0,0 +1 @@ +

slow navigation

diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/target/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/target/+page.svelte index e69de29bb2d1..729e18b74ae5 100644 --- a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/target/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/offline/target/+page.svelte @@ -0,0 +1 @@ +

target

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 059e3afed201..f551432d81f8 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1047,6 +1047,21 @@ test.describe('data-sveltekit attributes', () => { expect(page).toHaveURL('/data-sveltekit/preload-data/offline/slow-navigation'); }); + test('data-sveltekit-preload does not abort ongoing navigation #2', async ({ page }) => { + await page.goto('/data-sveltekit/preload-data/offline'); + + await page.locator('#slow-navigation').dispatchEvent('click'); + await page.waitForTimeout(100); // wait for navigation to start + await page.locator('#one').dispatchEvent('mousemove'); + await Promise.all([ + page.waitForTimeout(100), // wait for preloading to start + page.waitForLoadState('networkidle') // wait for preloading to finish + ]); + + expect(page).toHaveURL('/data-sveltekit/preload-data/offline/slow-navigation'); + await expect(page.getByText('slow navigation', { exact: true })).toBeVisible(); + }); + test('data-sveltekit-preload-data tap works after data-sveltekit-preload-code hover', async ({ page }) => {