Skip to content

Commit 98cdc40

Browse files
authored
Only update history when Turbo visit is renderable (#601)
* use location.replace instead of location.reload * update when we change the history * get location from visitStart * always pass the visit to renderError/Page * rollback name update * revert visit_control view hack * await nextBeat for the URL to be ready * remove console log
1 parent 50d8bd7 commit 98cdc40

File tree

7 files changed

+32
-12
lines changed

7 files changed

+32
-12
lines changed

src/core/drive/navigator.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ export class Navigator {
108108
if (responseHTML) {
109109
const snapshot = PageSnapshot.fromHTMLString(responseHTML)
110110
if (fetchResponse.serverError) {
111-
await this.view.renderError(snapshot)
111+
await this.view.renderError(snapshot, this.currentVisit)
112112
} else {
113-
await this.view.renderPage(snapshot)
113+
await this.view.renderPage(snapshot, false, true, this.currentVisit)
114114
}
115115
this.view.scrollToTop()
116116
this.view.clearSnapshotCache()

src/core/drive/page_view.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ErrorRenderer } from "./error_renderer"
44
import { PageRenderer } from "./page_renderer"
55
import { PageSnapshot } from "./page_snapshot"
66
import { SnapshotCache } from "./snapshot_cache"
7+
import { Visit } from "./visit"
78

89
export interface PageViewDelegate extends ViewDelegate<PageSnapshot> {
910
viewWillCacheSnapshot(): void
@@ -16,15 +17,18 @@ export class PageView extends View<Element, PageSnapshot, PageViewRenderer, Page
1617
lastRenderedLocation = new URL(location.href)
1718
forceReloaded = false
1819

19-
renderPage(snapshot: PageSnapshot, isPreview = false, willRender = true) {
20+
renderPage(snapshot: PageSnapshot, isPreview = false, willRender = true, visit?: Visit) {
2021
const renderer = new PageRenderer(this.snapshot, snapshot, isPreview, willRender)
2122
if (!renderer.shouldRender) {
2223
this.forceReloaded = true
24+
} else {
25+
visit?.changeHistory()
2326
}
2427
return this.render(renderer)
2528
}
2629

27-
renderError(snapshot: PageSnapshot) {
30+
renderError(snapshot: PageSnapshot, visit?: Visit) {
31+
visit?.changeHistory()
2832
const renderer = new ErrorRenderer(this.snapshot, snapshot, false)
2933
return this.render(renderer)
3034
}

src/core/drive/visit.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -225,11 +225,11 @@ export class Visit implements FetchRequestDelegate {
225225
this.cacheSnapshot()
226226
if (this.view.renderPromise) await this.view.renderPromise
227227
if (isSuccessful(statusCode) && responseHTML != null) {
228-
await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender)
228+
await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender, this)
229229
this.adapter.visitRendered(this)
230230
this.complete()
231231
} else {
232-
await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML))
232+
await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this)
233233
this.adapter.visitRendered(this)
234234
this.fail()
235235
}
@@ -267,7 +267,7 @@ export class Visit implements FetchRequestDelegate {
267267
this.adapter.visitRendered(this)
268268
} else {
269269
if (this.view.renderPromise) await this.view.renderPromise
270-
await this.view.renderPage(snapshot, isPreview, this.willRender)
270+
await this.view.renderPage(snapshot, isPreview, this.willRender, this)
271271
this.adapter.visitRendered(this)
272272
if (!isPreview) {
273273
this.complete()

src/core/native/browser_adapter.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export class BrowserAdapter implements Adapter {
1717

1818
visitProgressBarTimeout?: number
1919
formProgressBarTimeout?: number
20+
location?: URL
2021

2122
constructor(session: Session) {
2223
this.session = session
@@ -27,9 +28,9 @@ export class BrowserAdapter implements Adapter {
2728
}
2829

2930
visitStarted(visit: Visit) {
31+
this.location = visit.location
3032
visit.loadCachedSnapshot()
3133
visit.issueRequest()
32-
visit.changeHistory()
3334
visit.goToSamePageAnchor()
3435
}
3536

@@ -121,7 +122,10 @@ export class BrowserAdapter implements Adapter {
121122

122123
reload(reason: ReloadReason) {
123124
dispatch("turbo:reload", { detail: reason })
124-
window.location.reload()
125+
126+
if (!this.location) return
127+
128+
window.location.href = this.location.toString()
125129
}
126130

127131
get navigator() {

src/tests/fixtures/rendering.html

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ <h1>Rendering</h1>
7878
<button id="permanent-video-button" type="button">Play</button>
7979

8080
<hr class="push-off-screen">
81+
<p><a id="below-the-fold-visit-control-reload-link-middle" href="/src/tests/fixtures/visit_control_reload.html#middle">Visit control: reload - middle</a></p>
8182
<p><a id="below-the-fold-visit-control-reload-link" href="/src/tests/fixtures/visit_control_reload.html">Visit control: reload</a></p>
8283
</body>
8384
</html>

src/tests/fixtures/visit_control_reload.html

+12-3
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,17 @@
66
<script src="/dist/turbo.es2017-umd.js" data-turbo-track="reload"></script>
77
<script src="/src/tests/fixtures/test.js"></script>
88
<meta name="turbo-visit-control" content="reload">
9-
</head>
10-
<body>
11-
<h1>Visit control: reload</h1>
9+
<style>
10+
.push-off-screen { margin-top: 1000px; }
11+
</style>
12+
</head>
13+
<body>
14+
<h1>Visit control: reload</h1>
15+
16+
<hr class="push-off-screen">
17+
18+
<h2 id="middle">Middle the page</h2>
19+
<hr class="push-off-screen">
20+
<h2>Down the page</h2>
1221
</body>
1322
</html>

src/tests/functional/visit_tests.ts

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export class VisitTests extends TurboDriveTestCase {
1010
const urlBeforeVisit = await this.location
1111
await this.visitLocation("/src/tests/fixtures/one.html")
1212

13+
await this.nextBeat
14+
1315
const urlAfterVisit = await this.location
1416
this.assert.notEqual(urlBeforeVisit, urlAfterVisit)
1517
this.assert.equal(await this.visitAction, "advance")

0 commit comments

Comments
 (0)