From 575900de885c84aa6498e3ec121eabf7bba6ae4b Mon Sep 17 00:00:00 2001 From: Ranjan Purbey Date: Mon, 17 Feb 2025 21:42:35 +0530 Subject: [PATCH] fix: Add more checks to determine if element is non-static (#15259) Fixes #15241 --- .changeset/unlucky-laws-decide.md | 5 +++++ .../3-transform/client/visitors/shared/fragment.js | 11 +++++++++++ .../samples/element-dir-attribute-sibling/_config.js | 9 +++++++++ .../samples/element-dir-attribute-sibling/main.svelte | 1 + .../input-checked-attribute-sibling/_config.js | 9 +++++++++ .../input-checked-attribute-sibling/_expected.html | 1 + .../input-checked-attribute-sibling/main.svelte | 1 + 7 files changed, 37 insertions(+) create mode 100644 .changeset/unlucky-laws-decide.md create mode 100644 packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/_config.js create mode 100644 packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/main.svelte create mode 100644 packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_config.js create mode 100644 packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_expected.html create mode 100644 packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/main.svelte diff --git a/.changeset/unlucky-laws-decide.md b/.changeset/unlucky-laws-decide.md new file mode 100644 index 0000000000..c5fd7c65d9 --- /dev/null +++ b/.changeset/unlucky-laws-decide.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure input elements and elements with `dir` attribute are marked as non-static diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js index 5bc3041ca4..f076d7c11e 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js @@ -144,6 +144,17 @@ function is_static_element(node, state) { return false; } + if (attribute.name === 'dir') { + return false; + } + + if ( + ['input', 'textarea'].includes(node.name) && + ['value', 'checked'].includes(attribute.name) + ) { + return false; + } + if (node.name === 'option' && attribute.name === 'value') { return false; } diff --git a/packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/_config.js b/packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/_config.js new file mode 100644 index 0000000000..e3c629aef9 --- /dev/null +++ b/packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/_config.js @@ -0,0 +1,9 @@ +import { test } from '../../test'; + +export default test({ + test(assert, target) { + const p = target.querySelector('p'); + + assert.equal(p?.dir, 'rtl'); + } +}); diff --git a/packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/main.svelte b/packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/main.svelte new file mode 100644 index 0000000000..802edc0fee --- /dev/null +++ b/packages/svelte/tests/hydration/samples/element-dir-attribute-sibling/main.svelte @@ -0,0 +1 @@ +

text

. diff --git a/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_config.js b/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_config.js new file mode 100644 index 0000000000..31ec66fc88 --- /dev/null +++ b/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_config.js @@ -0,0 +1,9 @@ +import { test } from '../../test'; + +export default test({ + test(assert, target) { + const input = target.querySelector('input'); + + assert.equal(input?.checked, true); + } +}); diff --git a/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_expected.html b/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_expected.html new file mode 100644 index 0000000000..bcd53f8783 --- /dev/null +++ b/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/_expected.html @@ -0,0 +1 @@ +. diff --git a/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/main.svelte b/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/main.svelte new file mode 100644 index 0000000000..db3eae870f --- /dev/null +++ b/packages/svelte/tests/hydration/samples/input-checked-attribute-sibling/main.svelte @@ -0,0 +1 @@ +.