Skip to content

Commit

Permalink
run beforeNavigate callbacks after cancelled unloading navigation - c…
Browse files Browse the repository at this point in the history
…loses #9170 (#9347)
  • Loading branch information
Rich-Harris authored Mar 7, 2023
1 parent 748e174 commit 6a91e88
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .changeset/gold-ways-repair.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

fix: don't prevent `beforeNavigate` callbacks from running following a cancelled unloading navigation
9 changes: 6 additions & 3 deletions packages/kit/src/runtime/client/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -1521,11 +1521,14 @@ export function create_client(app, target) {

// Ignore the following but fire beforeNavigate
if (external || options.reload) {
const navigation = before_navigate({ url, type: 'link' });
if (!navigation) {
if (before_navigate({ url, type: 'link' })) {
// set `navigating` to `true` to prevent `beforeNavigate` callbacks
// being called when the page unloads
navigating = true;
} else {
event.preventDefault();
}
navigating = true;

return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<h1>prevent navigation</h1>
<a href="/before-navigate/a">a</a>
<a href="/before-navigate/redirect">redirect</a>
<a href="/before-navigate/prevent-navigation?x=1">self</a>
<a href="https://google.com" target="_blank" rel="noreferrer">_blank</a>
<a href="https://google.de">external</a>
<pre>{times_triggered} {unload} {navigation_type}</pre>
13 changes: 13 additions & 0 deletions packages/kit/test/apps/basics/test/cross-platform/client.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,19 @@ test.describe('beforeNavigate', () => {
await page.goBack();
expect(await page.textContent('h1')).toBe('before_navigate_ran: false');
});

test('cancel() on an unloading navigation does not prevent subsequent beforeNavigate callbacks', async ({
page,
app
}) => {
await page.goto('/before-navigate/prevent-navigation');
await page.click('h1'); // The browsers block attempts to prevent navigation on a frame that's never had a user gesture.

await app.goto('https://google.de');
await app.goto('/before-navigate/prevent-navigation?x=1');

expect(await page.innerHTML('pre')).toBe('2 false goto');
});
});

test.describe('Scrolling', () => {
Expand Down

0 comments on commit 6a91e88

Please sign in to comment.