cancel navigation if overtaken by a second navigation - fixes #48

This commit is contained in:
Rich Harris
2017-12-24 20:37:00 -05:00
parent 75aedf4663
commit 3c4ebcda30
4 changed files with 54 additions and 7 deletions

View File

@@ -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>

View File

@@ -0,0 +1,11 @@
<h1>This page should never render</h1>
<script>
export default {
preload() {
return new Promise(fulfil => {
window.fulfil = fulfil;
});
}
};
</script>

View File

@@ -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', () => {