diff --git a/src/core/drive/morph_renderer.js b/src/core/drive/morph_renderer.js index 87401ee23..4c25246a1 100644 --- a/src/core/drive/morph_renderer.js +++ b/src/core/drive/morph_renderer.js @@ -29,6 +29,7 @@ export class MorphRenderer extends Renderer { this.isMorphingTurboFrame = this.#isFrameReloadedWithMorph(currentElement) Idiomorph.morph(currentElement, newElement, { + ignoreActiveValue: true, morphStyle: morphStyle, callbacks: { beforeNodeAdded: this.#shouldAddElement, diff --git a/src/tests/fixtures/page_refresh.html b/src/tests/fixtures/page_refresh.html index f7f577d56..6a9cc4b5e 100644 --- a/src/tests/fixtures/page_refresh.html +++ b/src/tests/fixtures/page_refresh.html @@ -88,6 +88,13 @@

Element with Stimulus controller

+
+ + +

Link with params to refresh the page

Link to another page

diff --git a/src/tests/functional/page_refresh_tests.js b/src/tests/functional/page_refresh_tests.js index 9db411665..ead9247b0 100644 --- a/src/tests/functional/page_refresh_tests.js +++ b/src/tests/functional/page_refresh_tests.js @@ -7,7 +7,8 @@ import { nextEventNamed, nextEventOnTarget, noNextEventOnTarget, - noNextEventNamed + noNextEventNamed, + getSearchParam } from "../helpers/page" test("renders a page refresh with morphing", async ({ page }) => { @@ -81,6 +82,24 @@ test("renders a page refresh with morphing when the paths are the same but searc await nextEventNamed(page, "turbo:render", { renderMethod: "morph" }) }) +test("renders a page refresh with morphing when the GET form paths are the same but search params are diferent", async ({ page }) => { + await page.goto("/src/tests/fixtures/page_refresh.html") + + const input = page.locator("form[method=get] input[name=query]") + + await input.fill("Search") + await nextEventNamed(page, "turbo:render", { renderMethod: "morph" }) + + await expect(input).toBeFocused() + expect(getSearchParam(page.url(), "query")).toEqual("Search") + + await input.press("?") + await nextEventNamed(page, "turbo:render", { renderMethod: "morph" }) + + await expect(input).toBeFocused() + expect(getSearchParam(page.url(), "query")).toEqual("Search?") +}) + test("doesn't morph when the turbo-refresh-method meta tag is not 'morph'", async ({ page }) => { await page.goto("/src/tests/fixtures/page_refresh_replace.html") @@ -181,12 +200,12 @@ test("it preserves focus across morphs", async ({ page }) => { const input = await page.locator("#form input[type=text]") - await input.fill("Discard me") + await input.fill("Preserve me") await input.press("Enter") await nextEventNamed(page, "turbo:render", { renderMethod: "morph" }) await expect(input).toBeFocused() - await expect(input).toHaveValue("") + await expect(input).toHaveValue("Preserve me") }) test("it preserves focus and the [data-turbo-permanent] element's value across morphs", async ({ page }) => {