diff --git a/src/core/drive/visit.ts b/src/core/drive/visit.ts index 1d759cf86..0ce9f7422 100644 --- a/src/core/drive/visit.ts +++ b/src/core/drive/visit.ts @@ -281,6 +281,7 @@ export class Visit implements FetchRequestDelegate { if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) { this.adapter.visitProposedToLocation(this.redirectedToLocation, { action: "replace", + willRender: false, response: this.response, }) this.followedRedirect = true diff --git a/src/tests/fixtures/frames.html b/src/tests/fixtures/frames.html index 2a84ca2a4..b611136e5 100644 --- a/src/tests/fixtures/frames.html +++ b/src/tests/fixtures/frames.html @@ -121,5 +121,7 @@

Frames: #nested-child


Navigate #frame + + Eager-loaded frame after GET redirect diff --git a/src/tests/fixtures/frames/frame_for_eager.html b/src/tests/fixtures/frames/frame_for_eager.html new file mode 100644 index 000000000..8445b3571 --- /dev/null +++ b/src/tests/fixtures/frames/frame_for_eager.html @@ -0,0 +1,3 @@ + +

Eager-loaded frame: Loaded

+
diff --git a/src/tests/fixtures/page_with_eager_frame.html b/src/tests/fixtures/page_with_eager_frame.html new file mode 100644 index 000000000..9c96fdd7a --- /dev/null +++ b/src/tests/fixtures/page_with_eager_frame.html @@ -0,0 +1,19 @@ + + + + + Frame + + + + +

Eager-loaded frame

+ + +

Eager-loaded frame: NOT Loaded...

+
+ + + Page /src/tests/fixtures/frames.html + + diff --git a/src/tests/functional/frame_tests.ts b/src/tests/functional/frame_tests.ts index d628622e1..9ef2ff199 100644 --- a/src/tests/functional/frame_tests.ts +++ b/src/tests/functional/frame_tests.ts @@ -579,6 +579,29 @@ export class FrameTests extends TurboDriveTestCase { this.assert.ok(await this.nextEventOnTarget("frame", "turbo:before-fetch-response")) } + async "test navigating a eager frame with a link[method=get] that does not fetch eager frame twice"() { + await this.clickSelector("#link-to-eager-loaded-frame") + + await this.nextBeat + + const eventLogs = await this.eventLogChannel.read() + const fetchLogs = eventLogs.filter( + ([name, options]) => + name == "turbo:before-fetch-request" && + options?.url?.includes("/src/tests/fixtures/frames/frame_for_eager.html") + ) + this.assert.equal(fetchLogs.length, 1) + + const src = (await this.attributeForSelector("#eager-loaded-frame", "src")) ?? "" + this.assert.ok(src.includes("/src/tests/fixtures/frames/frame_for_eager.html"), "updates src attribute") + this.assert.equal(await (await this.querySelector("h1")).getVisibleText(), "Eager-loaded frame") + this.assert.equal( + await (await this.querySelector("#eager-loaded-frame h2")).getVisibleText(), + "Eager-loaded frame: Loaded" + ) + this.assert.equal(await this.pathname, "/src/tests/fixtures/page_with_eager_frame.html") + } + async withoutChangingEventListenersCount(callback: () => void) { const name = "eventListenersAttachedToDocument" const setup = () => {