From 3b0215239c24e459d1aed0a54883a9868e3c91f1 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 17 Oct 2024 15:24:30 +0100 Subject: [PATCH 1/3] fix: correctly applies autofocus to static elements --- .changeset/healthy-poets-float.md | 5 +++++ .../3-transform/client/visitors/shared/fragment.js | 4 ++++ .../runtime-legacy/samples/autofocus-2/_config.js | 10 ++++++++++ .../runtime-legacy/samples/autofocus-2/main.svelte | 6 ++++++ 4 files changed, 25 insertions(+) create mode 100644 .changeset/healthy-poets-float.md create mode 100644 packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte diff --git a/.changeset/healthy-poets-float.md b/.changeset/healthy-poets-float.md new file mode 100644 index 000000000000..4709b4495ed8 --- /dev/null +++ b/.changeset/healthy-poets-float.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly applies autofocus to static elements 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 4008dbdfa3cb..4de1a11a97ee 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 @@ -142,6 +142,10 @@ function is_static_element(node) { return false; } + if (attribute.name === 'autofocus') { + return false; + } + if (node.name === 'option' && attribute.name === 'value') { return false; } diff --git a/packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js new file mode 100644 index 000000000000..f12faa87f159 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js @@ -0,0 +1,10 @@ +import { test } from '../../test'; + +export default test({ + async test({ assert, target, window }) { + assert.equal( + target.querySelector('input'), + window.document.activeElement + ); + } +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte new file mode 100644 index 000000000000..2487e00da6f0 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte @@ -0,0 +1,6 @@ +

wat

+ + +
+ +
From 17893b4e2e8b3792808aa5f50160e57a64275443 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 17 Oct 2024 15:31:12 +0100 Subject: [PATCH 2/3] lint --- .../tests/runtime-legacy/samples/autofocus-2/_config.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js index f12faa87f159..24b45b376174 100644 --- a/packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js +++ b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/_config.js @@ -2,9 +2,6 @@ import { test } from '../../test'; export default test({ async test({ assert, target, window }) { - assert.equal( - target.querySelector('input'), - window.document.activeElement - ); + assert.equal(target.querySelector('input'), window.document.activeElement); } }); From 50db71e041311990ee6777c9779813ea8dfe9807 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 17 Oct 2024 16:07:39 +0100 Subject: [PATCH 3/3] fix other case --- .../compiler/phases/2-analyze/visitors/RegularElement.js | 8 ++++++++ .../tests/runtime-legacy/samples/autofocus-2/main.svelte | 4 ---- .../tests/runtime-legacy/samples/autofocus-3/_config.js | 7 +++++++ .../tests/runtime-legacy/samples/autofocus-3/main.svelte | 3 +++ 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 packages/svelte/tests/runtime-legacy/samples/autofocus-3/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/autofocus-3/main.svelte diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js index 49a642eb497a..dd8a594e610e 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js @@ -75,6 +75,14 @@ export function RegularElement(node, context) { node.attributes.push(create_attribute('value', child.start, child.end, [child])); } + if ( + node.attributes.some( + (attribute) => attribute.type === 'Attribute' && attribute.name === 'autofocus' + ) + ) { + mark_subtree_dynamic(context.path); + } + const binding = context.state.scope.get(node.name); if ( binding !== null && diff --git a/packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte index 2487e00da6f0..e3ea9a76d40c 100644 --- a/packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte +++ b/packages/svelte/tests/runtime-legacy/samples/autofocus-2/main.svelte @@ -1,6 +1,2 @@

wat

- -
- -
diff --git a/packages/svelte/tests/runtime-legacy/samples/autofocus-3/_config.js b/packages/svelte/tests/runtime-legacy/samples/autofocus-3/_config.js new file mode 100644 index 000000000000..24b45b376174 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/autofocus-3/_config.js @@ -0,0 +1,7 @@ +import { test } from '../../test'; + +export default test({ + async test({ assert, target, window }) { + assert.equal(target.querySelector('input'), window.document.activeElement); + } +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/autofocus-3/main.svelte b/packages/svelte/tests/runtime-legacy/samples/autofocus-3/main.svelte new file mode 100644 index 000000000000..31d2cbc0ec62 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/autofocus-3/main.svelte @@ -0,0 +1,3 @@ +
+ +