From 2a0d1a28699b6ec317b5649d1b1f8deda9e7d9d8 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 22 Feb 2022 23:34:45 -0500 Subject: [PATCH 01/15] defer pushState until navigation completes --- packages/kit/src/runtime/client/router.js | 12 ++++++------ packages/kit/src/runtime/server/page/load_node.js | 2 -- packages/kit/test/apps/basics/test/test.js | 8 ++++++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/kit/src/runtime/client/router.js b/packages/kit/src/runtime/client/router.js index a0301ab0e968..7464d6dafe43 100644 --- a/packages/kit/src/runtime/client/router.js +++ b/packages/kit/src/runtime/client/router.js @@ -428,12 +428,6 @@ export class Router { info.url = new URL(url.origin + pathname + url.search + url.hash); - if (details) { - const change = details.replaceState ? 0 : 1; - details.state['sveltekit:index'] = this.current_history_index += change; - history[details.replaceState ? 'replaceState' : 'pushState'](details.state, '', info.url); - } - await this.renderer.handle_navigation(info, chain, false, { scroll, keepfocus @@ -446,5 +440,11 @@ export class Router { const navigation = { from, to: url }; this.callbacks.after_navigate.forEach((fn) => fn(navigation)); } + + if (details) { + const change = details.replaceState ? 0 : 1; + details.state['sveltekit:index'] = this.current_history_index += change; + history[details.replaceState ? 'replaceState' : 'pushState'](details.state, '', info.url); + } } } diff --git a/packages/kit/src/runtime/server/page/load_node.js b/packages/kit/src/runtime/server/page/load_node.js index 96bcfc641d89..841dc0f01779 100644 --- a/packages/kit/src/runtime/server/page/load_node.js +++ b/packages/kit/src/runtime/server/page/load_node.js @@ -139,8 +139,6 @@ export async function load_node({ } } - opts.headers.set('referer', event.url.href); - const resolved = resolve(event.url.pathname, requested.split('?')[0]); /** @type {Response} */ diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index c83e450369fb..b2677b94628f 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1267,8 +1267,12 @@ test.describe.parallel('Load', () => { await clicknav('[href="/load/fetch-headers"]'); const json = /** @type {string} */ (await page.textContent('pre')); - expect(JSON.parse(json)).toEqual({ - referer: `${baseURL}/load/fetch-headers`, + const headers = JSON.parse(json); + + expect(headers).toEqual({ + // the referer will be the previous page in the client-side + // navigation case + referer: `${baseURL}/load`, // these headers aren't particularly useful, but they allow us to verify // that page headers are being forwarded 'sec-fetch-dest': javaScriptEnabled ? 'empty' : 'document', From bb276d6b523298b317402587be94016b0f749fbf Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 00:00:27 -0500 Subject: [PATCH 02/15] fix test, simplify clicknav implementation --- packages/kit/test/apps/basics/test/test.js | 4 ++-- packages/kit/test/utils.d.ts | 2 +- packages/kit/test/utils.js | 23 ++++++---------------- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index b2677b94628f..f2583bd4f0dc 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -106,10 +106,10 @@ test.describe.parallel('beforeNavigate', () => { await page.goto('/before-navigate/prevent-navigation'); try { - await clicknav('[href="/before-navigate/a"]'); + await clicknav('[href="/before-navigate/a"]', { timeout: 1000 }); expect(false).toBe(true); } catch (/** @type {any} */ e) { - expect(e.message).toMatch('Timed out'); + expect(e.message).toMatch('page.waitForNavigation: Timeout 1000ms exceeded'); } expect(page.url()).toBe(baseURL + '/before-navigate/prevent-navigation'); diff --git a/packages/kit/test/utils.d.ts b/packages/kit/test/utils.d.ts index 194880ad7948..aea4c91489ca 100644 --- a/packages/kit/test/utils.d.ts +++ b/packages/kit/test/utils.d.ts @@ -20,7 +20,7 @@ export const test: TestType< prefetchRoutes: (urls: string[]) => Promise; }; back: () => Promise; - clicknav: (selector: string) => Promise; + clicknav: (selector: string, options?: { timeout?: number }) => Promise; in_view: (selector: string) => Promise; read_errors: (href: string) => string; }, diff --git a/packages/kit/test/utils.js b/packages/kit/test/utils.js index b5e4bbfff4c8..fa9bcac7b652 100644 --- a/packages/kit/test/utils.js +++ b/packages/kit/test/utils.js @@ -81,24 +81,13 @@ export const test = base.extend({ // @ts-expect-error clicknav: async ({ page, javaScriptEnabled }, use) => { - /** @param {string} selector */ - async function clicknav(selector) { + /** + * @param {string} selector + * @param {{ timeout: number }} options + */ + async function clicknav(selector, options) { if (javaScriptEnabled) { - await page.evaluate(() => { - window.navigated = new Promise((fulfil, reject) => { - const timeout = setTimeout(() => reject(new Error('Timed out')), 2000); - addEventListener( - 'sveltekit:navigation-end', - () => { - clearTimeout(timeout); - fulfil(); - }, - { once: true } - ); - }); - }); - - await Promise.all([page.click(selector), page.evaluate(() => window.navigated)]); + await Promise.all([page.click(selector), page.waitForNavigation(options)]); } else { await page.click(selector); } From 060ec6be89f7bfdcc039d6d339272938e16fd486 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 00:14:08 -0500 Subject: [PATCH 03/15] remove now-obsolete sveltekit:navigation-{start,end} events --- documentation/docs/08-events.md | 8 ++------ packages/kit/src/runtime/client/router.js | 5 ----- packages/kit/test/utils.js | 14 -------------- 3 files changed, 2 insertions(+), 25 deletions(-) diff --git a/documentation/docs/08-events.md b/documentation/docs/08-events.md index 58d01a516ba6..f5a202253122 100644 --- a/documentation/docs/08-events.md +++ b/documentation/docs/08-events.md @@ -2,10 +2,6 @@ title: Events --- -SvelteKit emits [CustomEvents](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) on the `window` object when certain things happen: +SvelteKit emits a `sveltekit:start` [CustomEvents](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) on the `window` object once the app has hydrated. -- `sveltekit:start` — fired once the app has hydrated -- `sveltekit:navigation-start` — navigation has started -- `sveltekit:navigation-end` — navigation has ended - -You probably won't need to use these, but they can be useful in the context of (for example) integration tests. +You probably won't need to use it, but it can be useful in the context of (for example) integration tests. diff --git a/packages/kit/src/runtime/client/router.js b/packages/kit/src/runtime/client/router.js index 7464d6dafe43..8214fb970ad1 100644 --- a/packages/kit/src/runtime/client/router.js +++ b/packages/kit/src/runtime/client/router.js @@ -419,9 +419,6 @@ export class Router { accepted(); - if (!this.navigating) { - dispatchEvent(new CustomEvent('sveltekit:navigation-start')); - } this.navigating++; const pathname = normalize_path(url.pathname, this.trailing_slash); @@ -435,8 +432,6 @@ export class Router { this.navigating--; if (!this.navigating) { - dispatchEvent(new CustomEvent('sveltekit:navigation-end')); - const navigation = { from, to: url }; this.callbacks.after_navigate.forEach((fn) => fn(navigation)); } diff --git a/packages/kit/test/utils.js b/packages/kit/test/utils.js index fa9bcac7b652..9fb8f1cd077d 100644 --- a/packages/kit/test/utils.js +++ b/packages/kit/test/utils.js @@ -58,20 +58,6 @@ export const test = base.extend({ back: async ({ page, javaScriptEnabled }, use) => { use(async () => { if (javaScriptEnabled) { - await page.evaluate(() => { - window.navigated = new Promise((fulfil, reject) => { - const timeout = setTimeout(() => reject(new Error('Timed out')), 2000); - addEventListener( - 'sveltekit:navigation-end', - () => { - clearTimeout(timeout); - fulfil(); - }, - { once: true } - ); - }); - }); - await Promise.all([page.goBack(), page.evaluate(() => window.navigated)]); } else { return page.goBack().then(() => void 0); From 7a510ea9835cc5ba05f8ea4e59442017b47d8a37 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 00:15:28 -0500 Subject: [PATCH 04/15] changesets --- .changeset/little-geckos-smell.md | 5 +++++ .changeset/old-years-march.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/little-geckos-smell.md create mode 100644 .changeset/old-years-march.md diff --git a/.changeset/little-geckos-smell.md b/.changeset/little-geckos-smell.md new file mode 100644 index 000000000000..41699f75d44b --- /dev/null +++ b/.changeset/little-geckos-smell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Remove sveltekit:navigation-{start,end} events diff --git a/.changeset/old-years-march.md b/.changeset/old-years-march.md new file mode 100644 index 000000000000..c51205ec9d8b --- /dev/null +++ b/.changeset/old-years-march.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[breaking] defer pushState until navigation occurs From 129cb8ed97656254b03d4a0a5cdf80a012fc9451 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 09:28:03 -0500 Subject: [PATCH 05/15] Update .changeset/little-geckos-smell.md Co-authored-by: Ignatius Bagus --- .changeset/little-geckos-smell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/little-geckos-smell.md b/.changeset/little-geckos-smell.md index 41699f75d44b..f7e2f421c7a0 100644 --- a/.changeset/little-geckos-smell.md +++ b/.changeset/little-geckos-smell.md @@ -2,4 +2,4 @@ '@sveltejs/kit': patch --- -Remove sveltekit:navigation-{start,end} events +[breaking] remove sveltekit:navigation-{start,end} events From 1db3a31803bdcf231a20499fdc01a5b0c58bf5cf Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 09:28:14 -0500 Subject: [PATCH 06/15] Update documentation/docs/08-events.md Co-authored-by: Ignatius Bagus --- documentation/docs/08-events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/08-events.md b/documentation/docs/08-events.md index f5a202253122..205b399b30ca 100644 --- a/documentation/docs/08-events.md +++ b/documentation/docs/08-events.md @@ -2,6 +2,6 @@ title: Events --- -SvelteKit emits a `sveltekit:start` [CustomEvents](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) on the `window` object once the app has hydrated. +SvelteKit emits a `sveltekit:start` [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) on the `window` object once the app has hydrated. You probably won't need to use it, but it can be useful in the context of (for example) integration tests. From 607e1c9a42c2a35d66fd13aa74c0cc56489c2db9 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 11:59:04 -0500 Subject: [PATCH 07/15] make navigation abortable --- packages/kit/src/runtime/client/router.js | 5 +++++ .../routes/routing/cancellation/__layout.svelte | 4 ++++ .../src/routes/routing/cancellation/a.svelte | 17 +++++++++++++++++ .../src/routes/routing/cancellation/b.svelte | 1 + .../routes/routing/cancellation/index.svelte | 1 + packages/kit/test/apps/basics/test/test.js | 11 +++++++++++ 6 files changed, 39 insertions(+) create mode 100644 packages/kit/test/apps/basics/src/routes/routing/cancellation/__layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/cancellation/b.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/cancellation/index.svelte diff --git a/packages/kit/src/runtime/client/router.js b/packages/kit/src/runtime/client/router.js index 8214fb970ad1..7d7afef2bef8 100644 --- a/packages/kit/src/runtime/client/router.js +++ b/packages/kit/src/runtime/client/router.js @@ -425,11 +425,16 @@ export class Router { info.url = new URL(url.origin + pathname + url.search + url.hash); + const token = this.navigating_token = {}; + await this.renderer.handle_navigation(info, chain, false, { scroll, keepfocus }); + // navigation was aborted + if (this.navigating_token !== token) return; + this.navigating--; if (!this.navigating) { const navigation = { from, to: url }; diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/__layout.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/__layout.svelte new file mode 100644 index 000000000000..7a04256ede3d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/cancellation/__layout.svelte @@ -0,0 +1,4 @@ + + +a +b diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte new file mode 100644 index 000000000000..ec4ec8478ebb --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/cancellation/a.svelte @@ -0,0 +1,17 @@ + + +

this should not appear

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/b.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/b.svelte new file mode 100644 index 000000000000..51902b4da7a6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/cancellation/b.svelte @@ -0,0 +1 @@ +

b

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/routing/cancellation/index.svelte b/packages/kit/test/apps/basics/src/routes/routing/cancellation/index.svelte new file mode 100644 index 000000000000..002578b92477 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/cancellation/index.svelte @@ -0,0 +1 @@ +

cancellation

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index f2583bd4f0dc..2a889a7f703b 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -2125,6 +2125,17 @@ test.describe.parallel('Routing', () => { await clicknav('[href="/static.json"]'); expect(await page.textContent('body')).toBe('"static file"\n'); }); + + test('navigation is cancelled upon subsequent navigation', async ({ baseURL, page, clicknav }) => { + await page.goto('/routing/cancellation'); + await page.click('[href="/routing/cancellation/a"]'); + await clicknav('[href="/routing/cancellation/b"]'); + + expect(await page.url()).toBe(`${baseURL}/routing/cancellation/b`); + + await page.evaluate('window.fulfil_navigation && window.fulfil_navigation()'); + expect(await page.url()).toBe(`${baseURL}/routing/cancellation/b`); + }); }); test.describe.parallel('Session', () => { From 45df64953c8c1111605c33f9e32fe19110e22cdb Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 12:03:09 -0500 Subject: [PATCH 08/15] sigh. lint --- packages/kit/test/apps/basics/test/test.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 2a889a7f703b..03a76422afac 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -2126,7 +2126,11 @@ test.describe.parallel('Routing', () => { expect(await page.textContent('body')).toBe('"static file"\n'); }); - test('navigation is cancelled upon subsequent navigation', async ({ baseURL, page, clicknav }) => { + test('navigation is cancelled upon subsequent navigation', async ({ + baseURL, + page, + clicknav + }) => { await page.goto('/routing/cancellation'); await page.click('[href="/routing/cancellation/a"]'); await clicknav('[href="/routing/cancellation/b"]'); From c72b2b7adad7d38f83331f883a9836c9af795549 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 12:09:38 -0500 Subject: [PATCH 09/15] ugh come on --- packages/kit/src/runtime/client/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/client/router.js b/packages/kit/src/runtime/client/router.js index 7d7afef2bef8..bc9796861579 100644 --- a/packages/kit/src/runtime/client/router.js +++ b/packages/kit/src/runtime/client/router.js @@ -425,7 +425,7 @@ export class Router { info.url = new URL(url.origin + pathname + url.search + url.hash); - const token = this.navigating_token = {}; + const token = (this.navigating_token = {}); await this.renderer.handle_navigation(info, chain, false, { scroll, From accdb5cf27336ba553dfae308003c88706999b08 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 12:21:38 -0500 Subject: [PATCH 10/15] Update packages/kit/src/runtime/client/router.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Maurício Kishi --- packages/kit/src/runtime/client/router.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/runtime/client/router.js b/packages/kit/src/runtime/client/router.js index bc9796861579..5bed19f1363e 100644 --- a/packages/kit/src/runtime/client/router.js +++ b/packages/kit/src/runtime/client/router.js @@ -432,10 +432,10 @@ export class Router { keepfocus }); + this.navigating--; + // navigation was aborted if (this.navigating_token !== token) return; - - this.navigating--; if (!this.navigating) { const navigation = { from, to: url }; this.callbacks.after_navigate.forEach((fn) => fn(navigation)); From 83269e686e289a0cc25c297ed1851244a8ebee04 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 12:35:10 -0500 Subject: [PATCH 11/15] belt and braces --- packages/kit/test/apps/basics/test/test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 03a76422afac..11f61c1d80d2 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1633,13 +1633,14 @@ test.describe.parallel('searchParams', () => { }); test.describe.parallel('Redirects', () => { - test('redirect', async ({ page, clicknav }) => { + test('redirect', async ({ baseURL, page, clicknav }) => { await page.goto('/redirect'); await clicknav('[href="/redirect/a"]'); await page.waitForURL('/redirect/c'); expect(await page.textContent('h1')).toBe('c'); + expect(page.url()).toBe(`${baseURL}/redirect/c`); }); test('prevents redirect loops', async ({ baseURL, page, javaScriptEnabled }) => { From deeccca0694a8d552206bed2163247d0b077913d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 12:43:14 -0500 Subject: [PATCH 12/15] ugh --- packages/kit/src/runtime/client/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/client/router.js b/packages/kit/src/runtime/client/router.js index 5bed19f1363e..60d66b0a70b4 100644 --- a/packages/kit/src/runtime/client/router.js +++ b/packages/kit/src/runtime/client/router.js @@ -433,7 +433,7 @@ export class Router { }); this.navigating--; - + // navigation was aborted if (this.navigating_token !== token) return; if (!this.navigating) { From a48c857e95c73ccc2850682ea210e79bed9d4b8a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 13:00:44 -0500 Subject: [PATCH 13/15] changeset --- .changeset/cyan-cobras-explode.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cyan-cobras-explode.md diff --git a/.changeset/cyan-cobras-explode.md b/.changeset/cyan-cobras-explode.md new file mode 100644 index 000000000000..fdb170084db8 --- /dev/null +++ b/.changeset/cyan-cobras-explode.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[breaking] referer header sent by fetch in load matches page's referer header, not the page itself From e7f44dcb782f7218cd982daf3dc34822dd37dbe3 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 13:05:27 -0500 Subject: [PATCH 14/15] for the love of --- packages/kit/test/ambient.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kit/test/ambient.d.ts b/packages/kit/test/ambient.d.ts index ea7820b66d38..ed7ec4e0f548 100644 --- a/packages/kit/test/ambient.d.ts +++ b/packages/kit/test/ambient.d.ts @@ -6,6 +6,7 @@ declare global { // used in tests oops: string; pageContext: any; + fulfil_navigation: (value: any) => void; } const goto: ( From e28bc390e033e38585fd1640da65c22f973afd2c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 23 Feb 2022 13:34:29 -0500 Subject: [PATCH 15/15] use pushState for redirects --- packages/kit/src/runtime/client/renderer.js | 9 ++++----- packages/kit/test/apps/basics/test/test.js | 5 ++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/kit/src/runtime/client/renderer.js b/packages/kit/src/runtime/client/renderer.js index cc8c98212c17..3c0db40a66eb 100644 --- a/packages/kit/src/runtime/client/renderer.js +++ b/packages/kit/src/runtime/client/renderer.js @@ -335,11 +335,10 @@ export class Renderer { }); } else { if (this.router) { - this.router.goto( - new URL(navigation_result.redirect, info.url).href, - { replaceState: true }, - [...chain, info.url.pathname] - ); + this.router.goto(new URL(navigation_result.redirect, info.url).href, {}, [ + ...chain, + info.url.pathname + ]); } else { location.href = new URL(navigation_result.redirect, location.href).href; } diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 5d5d5b9578ce..d1203b732039 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1635,7 +1635,7 @@ test.describe.parallel('searchParams', () => { }); test.describe.parallel('Redirects', () => { - test('redirect', async ({ baseURL, page, clicknav }) => { + test('redirect', async ({ baseURL, page, clicknav, back }) => { await page.goto('/redirect'); await clicknav('[href="/redirect/a"]'); @@ -1643,6 +1643,9 @@ test.describe.parallel('Redirects', () => { await page.waitForURL('/redirect/c'); expect(await page.textContent('h1')).toBe('c'); expect(page.url()).toBe(`${baseURL}/redirect/c`); + + await back(); + expect(page.url()).toBe(`${baseURL}/redirect`); }); test('prevents redirect loops', async ({ baseURL, page, javaScriptEnabled }) => {