Skip to content

Commit 6a91e88

Browse files
authored
run beforeNavigate callbacks after cancelled unloading navigation - closes #9170 (#9347)
1 parent 748e174 commit 6a91e88

File tree

4 files changed

+25
-3
lines changed

4 files changed

+25
-3
lines changed

.changeset/gold-ways-repair.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
fix: don't prevent `beforeNavigate` callbacks from running following a cancelled unloading navigation

packages/kit/src/runtime/client/client.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,11 +1521,14 @@ export function create_client(app, target) {
15211521

15221522
// Ignore the following but fire beforeNavigate
15231523
if (external || options.reload) {
1524-
const navigation = before_navigate({ url, type: 'link' });
1525-
if (!navigation) {
1524+
if (before_navigate({ url, type: 'link' })) {
1525+
// set `navigating` to `true` to prevent `beforeNavigate` callbacks
1526+
// being called when the page unloads
1527+
navigating = true;
1528+
} else {
15261529
event.preventDefault();
15271530
}
1528-
navigating = true;
1531+
15291532
return;
15301533
}
15311534

packages/kit/test/apps/basics/src/routes/before-navigate/prevent-navigation/+page.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<h1>prevent navigation</h1>
1818
<a href="/before-navigate/a">a</a>
1919
<a href="/before-navigate/redirect">redirect</a>
20+
<a href="/before-navigate/prevent-navigation?x=1">self</a>
2021
<a href="https://google.com" target="_blank" rel="noreferrer">_blank</a>
2122
<a href="https://google.de">external</a>
2223
<pre>{times_triggered} {unload} {navigation_type}</pre>

packages/kit/test/apps/basics/test/cross-platform/client.test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,19 @@ test.describe('beforeNavigate', () => {
200200
await page.goBack();
201201
expect(await page.textContent('h1')).toBe('before_navigate_ran: false');
202202
});
203+
204+
test('cancel() on an unloading navigation does not prevent subsequent beforeNavigate callbacks', async ({
205+
page,
206+
app
207+
}) => {
208+
await page.goto('/before-navigate/prevent-navigation');
209+
await page.click('h1'); // The browsers block attempts to prevent navigation on a frame that's never had a user gesture.
210+
211+
await app.goto('https://google.de');
212+
await app.goto('/before-navigate/prevent-navigation?x=1');
213+
214+
expect(await page.innerHTML('pre')).toBe('2 false goto');
215+
});
203216
});
204217

205218
test.describe('Scrolling', () => {

0 commit comments

Comments
 (0)