From afa38d1319ee194d1f2c2ca0b7b3a57daaa9fdf0 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Mon, 16 Dec 2024 13:23:43 +0800 Subject: [PATCH 1/8] fix, test, and changeset --- .changeset/witty-vans-smash.md | 5 +++++ packages/kit/src/runtime/client/utils.js | 2 +- .../basics/src/routes/routing/+page.svelte | 1 + .../basics/test/cross-platform/client.test.js | 22 +++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changeset/witty-vans-smash.md diff --git a/.changeset/witty-vans-smash.md b/.changeset/witty-vans-smash.md new file mode 100644 index 000000000000..0c6f09aba4c8 --- /dev/null +++ b/.changeset/witty-vans-smash.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: navigate without reloading for links with explicit `target=_self` diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 16a1b3426a9e..ad375ce588a8 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -135,7 +135,7 @@ export function get_link_info(a, base) { const external = !url || - !!target || + (!!target && target && target !== '_self') || is_external_url(url, base) || (a.getAttribute('rel') || '').split(/\s+/).includes('external'); diff --git a/packages/kit/test/apps/basics/src/routes/routing/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/+page.svelte index e676c47a6533..2976b7945e13 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/routing/+page.svelte @@ -5,6 +5,7 @@

Great success!

a +explicit target="_self" ok next-paint symlinked diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index ce0758ea8dea..59352dac5028 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -696,6 +696,28 @@ test.describe('Routing', () => { expect(requests.filter((url) => !url.endsWith('/favicon.png'))).toEqual([]); }); + test('navigates to a new page without reloading for explicit target="_self"', async ({ + app, + page, + clicknav + }) => { + await page.goto('/routing'); + + await app.preloadData('/routing/a?self=1').catch((e) => { + // from error handler tests; ignore + if (!e.message.includes('Crashing now')) throw e; + }); + + /** @type {string[]} */ + const requests = []; + page.on('request', (r) => requests.push(r.url())); + + await clicknav('a[href="/routing/a?self=1"]'); + expect(await page.textContent('h1')).toBe('a'); + + expect(requests.filter((url) => !url.endsWith('/favicon.png'))).toEqual([]); + }); + test('navigates programmatically', async ({ page, app }) => { await page.goto('/routing/a'); await app.goto('/routing/b'); From b7634c7540ea75135c0aea4922f7fc0ff96f7700 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Mon, 16 Dec 2024 13:55:28 +0800 Subject: [PATCH 2/8] fix --- .changeset/witty-vans-smash.md | 2 +- packages/kit/src/runtime/client/utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/witty-vans-smash.md b/.changeset/witty-vans-smash.md index 0c6f09aba4c8..91b00ca92cc1 100644 --- a/.changeset/witty-vans-smash.md +++ b/.changeset/witty-vans-smash.md @@ -2,4 +2,4 @@ '@sveltejs/kit': patch --- -fix: navigate without reloading for links with explicit `target=_self` +fix: navigate without reloading for links with a `target` attribute and will display in the current browsing context diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index ad375ce588a8..3ef57cc4cae2 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -135,7 +135,7 @@ export function get_link_info(a, base) { const external = !url || - (!!target && target && target !== '_self') || + (!!target && target === '_blank') || is_external_url(url, base) || (a.getAttribute('rel') || '').split(/\s+/).includes('external'); From 309b24d580aaccc70632558bcd5657ad30ff7987 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Mon, 16 Dec 2024 13:56:31 +0800 Subject: [PATCH 3/8] even better? --- packages/kit/src/runtime/client/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 3ef57cc4cae2..76e36c7dfcec 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -135,7 +135,7 @@ export function get_link_info(a, base) { const external = !url || - (!!target && target === '_blank') || + target === '_blank' || is_external_url(url, base) || (a.getAttribute('rel') || '').split(/\s+/).includes('external'); From 13997a4a9ce1874d7cbedf364f24b5642e81d030 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Mon, 16 Dec 2024 14:33:23 +0800 Subject: [PATCH 4/8] update test --- .../basics/src/routes/routing/+page.svelte | 5 +++- .../basics/test/cross-platform/client.test.js | 28 +++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/kit/test/apps/basics/src/routes/routing/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/+page.svelte index 2976b7945e13..6e3adf7395fc 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/routing/+page.svelte @@ -5,7 +5,6 @@

Great success!

a -explicit target="_self" ok next-paint symlinked @@ -15,3 +14,7 @@ b
+ +_self +_self +_self diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 59352dac5028..093603329423 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -696,26 +696,30 @@ test.describe('Routing', () => { expect(requests.filter((url) => !url.endsWith('/favicon.png'))).toEqual([]); }); - test('navigates to a new page without reloading for explicit target="_self"', async ({ + test('navigates to a new page without reloading when `target` is the current browsing context', async ({ app, page, clicknav }) => { - await page.goto('/routing'); + const targets = ['_self', '_parent', '_top']; - await app.preloadData('/routing/a?self=1').catch((e) => { - // from error handler tests; ignore - if (!e.message.includes('Crashing now')) throw e; - }); + for (const target of targets) { + await page.goto('/routing'); - /** @type {string[]} */ - const requests = []; - page.on('request', (r) => requests.push(r.url())); + await app.preloadData('/routing/a?target').catch((e) => { + // from error handler tests; ignore + if (!e.message.includes('Crashing now')) throw e; + }); - await clicknav('a[href="/routing/a?self=1"]'); - expect(await page.textContent('h1')).toBe('a'); + /** @type {string[]} */ + const requests = []; + page.on('request', (r) => requests.push(r.url())); - expect(requests.filter((url) => !url.endsWith('/favicon.png'))).toEqual([]); + await clicknav(`a[target="${target}"]`); + expect(await page.textContent('h1')).toBe('a'); + + expect(requests.filter((url) => !url.endsWith('/favicon.png'))).toEqual([]); + } }); test('navigates programmatically', async ({ page, app }) => { From ff10a5899db53f75151dfe69fd94ebda2f73731a Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 17 Jan 2025 10:46:31 +0800 Subject: [PATCH 5/8] Update packages/kit/src/runtime/client/utils.js Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- packages/kit/src/runtime/client/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index be9adf4f20dd..35d699f59bc8 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -136,7 +136,7 @@ export function get_link_info(a, base, uses_hash_router) { const external = !url || - target === '_blank' || + (target || '_self') !== '_self' || is_external_url(url, base, uses_hash_router) || (a.getAttribute('rel') || '').split(/\s+/).includes('external'); From 6746850766f776d1b1959cc1d8525276c6987fa0 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 17 Jan 2025 10:47:03 +0800 Subject: [PATCH 6/8] Update .changeset/witty-vans-smash.md --- .changeset/witty-vans-smash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/witty-vans-smash.md b/.changeset/witty-vans-smash.md index 91b00ca92cc1..858c1366b824 100644 --- a/.changeset/witty-vans-smash.md +++ b/.changeset/witty-vans-smash.md @@ -1,5 +1,5 @@ --- -'@sveltejs/kit': patch +'@sveltejs/kit': major --- fix: navigate without reloading for links with a `target` attribute and will display in the current browsing context From 99a9a919fb0c3f811e707b5a910b613250c6b1bd Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Fri, 17 Jan 2025 17:41:11 +0800 Subject: [PATCH 7/8] format --- packages/kit/src/runtime/client/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 35d699f59bc8..18cf3cd558e0 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -136,7 +136,7 @@ export function get_link_info(a, base, uses_hash_router) { const external = !url || - (target || '_self') !== '_self' || + (target || '_self') !== '_self' || is_external_url(url, base, uses_hash_router) || (a.getAttribute('rel') || '').split(/\s+/).includes('external'); From 166d9e63a408bd46769ead8ec3531a79d6978812 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Fri, 17 Jan 2025 17:46:36 +0800 Subject: [PATCH 8/8] fix test anchor text --- packages/kit/test/apps/basics/src/routes/routing/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/test/apps/basics/src/routes/routing/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/+page.svelte index 19f85bbe1321..4d125e45f016 100644 --- a/packages/kit/test/apps/basics/src/routes/routing/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/routing/+page.svelte @@ -16,5 +16,5 @@
_self -_self -_self +_parent +_top