diff --git a/src/core/session.js b/src/core/session.js
index cdb978348..1047d4463 100644
--- a/src/core/session.js
+++ b/src/core/session.js
@@ -109,7 +109,7 @@ export class Session {
refresh(url, requestId) {
const isRecentRequest = requestId && this.recentRequests.has(requestId)
- if (!isRecentRequest) {
+ if (!isRecentRequest && !this.navigator.currentVisit) {
this.visit(url, { action: "replace", shouldCacheSnapshot: false })
}
}
diff --git a/src/tests/fixtures/page_refresh.html b/src/tests/fixtures/page_refresh.html
index 35cb44354..ab06be4db 100644
--- a/src/tests/fixtures/page_refresh.html
+++ b/src/tests/fixtures/page_refresh.html
@@ -81,6 +81,7 @@
Page to be refreshed
Reload
+ Navigate with delayed response
Frame to be morphed
diff --git a/src/tests/functional/page_refresh_tests.js b/src/tests/functional/page_refresh_tests.js
index 6619ae58e..7af62f56c 100644
--- a/src/tests/functional/page_refresh_tests.js
+++ b/src/tests/functional/page_refresh_tests.js
@@ -8,7 +8,8 @@ import {
nextEventOnTarget,
noNextEventOnTarget,
noNextEventNamed,
- getSearchParam
+ getSearchParam,
+ refreshWithStream
} from "../helpers/page"
test("renders a page refresh with morphing", async ({ page }) => {
@@ -26,16 +27,22 @@ test("async page refresh with turbo-stream", async ({ page }) => {
await page.evaluate(() => document.querySelector("#title").innerText = "Updated")
await expect(page.locator("#title")).toHaveText("Updated")
-
- await page.evaluate(() => {
- document.body.insertAdjacentHTML("beforeend", ``)
- })
+ await refreshWithStream(page)
await expect(page.locator("#title")).not.toHaveText("Updated")
await expect(page.locator("#title")).toHaveText("Page to be refreshed")
expect(await noNextEventNamed(page, "turbo:before-cache")).toBeTruthy()
})
+test("async page refresh with turbo-stream does not interrupt an initiated Visit", async ({ page }) => {
+ await page.goto("/src/tests/fixtures/page_refresh.html")
+ await page.pause()
+ await page.click("#delayed_link")
+ await refreshWithStream(page)
+
+ await expect(page.locator("h1")).toHaveText("One")
+})
+
test("dispatches a turbo:before-morph-element and turbo:morph-element event for each morphed element", async ({ page }) => {
await page.goto("/src/tests/fixtures/page_refresh.html")
await page.fill("#form-text", "Morph me")
diff --git a/src/tests/helpers/page.js b/src/tests/helpers/page.js
index 760b6631f..4990a3e5d 100644
--- a/src/tests/helpers/page.js
+++ b/src/tests/helpers/page.js
@@ -226,6 +226,10 @@ export function readMutationLogs(page, length) {
return readArray(page, "mutationLogs", length)
}
+export function refreshWithStream(page) {
+ return page.evaluate(() => document.body.insertAdjacentHTML("beforeend", ``))
+}
+
export function search(url) {
const { search } = new URL(url)