Skip to content
This repository has been archived by the owner on Jan 11, 2023. It is now read-only.

Commit

Permalink
cancel navigation if overtaken by a second navigation - fixes #48
Browse files Browse the repository at this point in the history
  • Loading branch information
Rich-Harris committed Dec 25, 2017
1 parent 75aedf4 commit 3c4ebcd
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 7 deletions.
8 changes: 6 additions & 2 deletions runtime/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,14 @@ function select_route(url) {
}
}

function render(Component, data, scroll) {
let current_token;

function render(Component, data, scroll, token) {
Promise.resolve(
Component.preload ? Component.preload(data) : {}
).then(preloaded => {
if (current_token !== token) return;

if (component) {
component.destroy();
} else {
Expand Down Expand Up @@ -83,7 +87,7 @@ function navigate(url, id) {
}

selected.route.load().then(mod => {
render(mod.default, selected.data, scroll_history[id]);
render(mod.default, selected.data, scroll_history[id], current_token = {});
});

cid = id;
Expand Down
8 changes: 3 additions & 5 deletions test/app/routes/_components/Nav.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
<nav>
<ul>
<li><a class='{{page === "home" ? "selected" : ""}}' href='/'>home</a></li>
<li><a class='{{page === "about" ? "selected" : ""}}' href='/about'>about</a></li>

<!-- for the blog link, we're using rel=prefetch so that Sapper prefetches
the blog data when we hover over the link or tap it on a touchscreen -->
<li><a href='/'>home</a></li>
<li><a href='/about'>about</a></li>
<li><a href='/slow-preload'>slow preload</a></li>
<li><a rel=prefetch class='{{page === "blog" ? "selected" : ""}}' href='/blog'>blog</a></li>
</ul>
</nav>
Expand Down
11 changes: 11 additions & 0 deletions test/app/routes/slow-preload.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<h1>This page should never render</h1>

<script>
export default {
preload() {
return new Promise(fulfil => {
window.fulfil = fulfil;
});
}
};
</script>
34 changes: 34 additions & 0 deletions test/common/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,40 @@ function run(env) {

assert.ok(scrollY > 0, scrollY);
});

it('cancels navigation if subsequent navigation occurs during preload', async () => {
await nightmare
.goto(base)
.wait(() => window.READY)
.click('a[href="/slow-preload"]')
.wait(100)
.click('a[href="/about"]')
.wait(100);

assert.equal(
await nightmare.path(),
'/about'
);

assert.equal(
await nightmare.evaluate(() => document.querySelector('h1').textContent),
'About this site'
);

await nightmare
.evaluate(() => window.fulfil({}))
.wait(100);

assert.equal(
await nightmare.path(),
'/about'
);

assert.equal(
await nightmare.evaluate(() => document.querySelector('h1').textContent),
'About this site'
);
});
});

describe('headers', () => {
Expand Down

0 comments on commit 3c4ebcd

Please sign in to comment.