From 9c1d17e51ffc637f846e83382a9e22227a783784 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Thu, 2 Apr 2026 10:31:09 +0200 Subject: [PATCH] fix: handle autofocus in `set_attributes` --- .../internal/client/dom/elements/attributes.js | 11 ++++++++++- .../svelte-element-autofocus/_config.js | 18 ++++++++++++++++++ .../svelte-element-autofocus/main.svelte | 5 +++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/_config.js create mode 100644 packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/main.svelte diff --git a/packages/svelte/src/internal/client/dom/elements/attributes.js b/packages/svelte/src/internal/client/dom/elements/attributes.js index ec45e8cf0c..8bdd7d9311 100644 --- a/packages/svelte/src/internal/client/dom/elements/attributes.js +++ b/packages/svelte/src/internal/client/dom/elements/attributes.js @@ -431,7 +431,16 @@ function set_attributes( // avoid using the setter set_attribute(element, key, value); } else if (key === 'autofocus') { - autofocus(/** @type {HTMLElement} */ (element), Boolean(value)); + if (renderer == null) { + autofocus(/** @type {HTMLElement} */ (element), Boolean(value)); + } else { + // In custom renderer mode, just set autofocus as a regular attribute + if (value) { + set_attribute_op(element, key, value); + } else { + remove_attribute(element, key); + } + } } else if (!is_custom_element && (key === '__value' || (key === 'value' && value != null))) { // @ts-ignore We're not running this for custom elements because __value is actually // how Lit stores the current value on the element, and messing with that would break things. diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/_config.js b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/_config.js new file mode 100644 index 0000000000..8d4602f7fb --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/_config.js @@ -0,0 +1,18 @@ +import { test } from '../../test'; + +export default test({ + test({ assert, target }) { + // If we got here, the component mounted without crashing on document.body access. + // Verify autofocus is set as a regular attribute. + const input = target.children.find( + (/** @type {any} */ n) => n.type === 'element' && n.name === 'input' + ); + assert.ok(input, 'input element should exist'); + assert.equal( + input.attributes['autofocus'], + 'true', + 'autofocus should be set as a regular attribute' + ); + assert.equal(input.attributes['value'], 'test', 'value should be set as a regular attribute'); + } +}); diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/main.svelte b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/main.svelte new file mode 100644 index 0000000000..bea9f28141 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/main.svelte @@ -0,0 +1,5 @@ + + +