From 3d10f417ebea34a09be3e2479015e08d820df3fe Mon Sep 17 00:00:00 2001 From: Theodore Brown Date: Sun, 19 Jan 2025 00:04:08 -0600 Subject: [PATCH 1/2] fix: consistently set value to blank string when value attribute is undefined Fixes #4467 --- .../client/dom/elements/attributes.js | 4 +- .../value-attribute-null-undefined/_config.js | 49 +++++++++++++++++++ .../main.svelte | 9 ++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/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 a2fffe869660..eab27e6c02d5 100644 --- a/packages/svelte/src/internal/client/dom/elements/attributes.js +++ b/packages/svelte/src/internal/client/dom/elements/attributes.js @@ -68,14 +68,14 @@ export function set_value(element, value) { // treat null and undefined the same for the initial value value ?? undefined) || // @ts-expect-error - // `progress` elements always need their value set when its `0` + // `progress` elements always need their value set when it's `0` (element.value === value && (value !== 0 || element.nodeName !== 'PROGRESS')) ) { return; } // @ts-expect-error - element.value = value; + element.value = value ?? ''; } /** diff --git a/packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/_config.js b/packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/_config.js new file mode 100644 index 000000000000..08f0c5aec7ae --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/_config.js @@ -0,0 +1,49 @@ +import { test, ok } from '../../test'; +import { flushSync } from 'svelte'; + +export default test({ + mode: ['client'], + + async test({ assert, target }) { + /** + * @type {HTMLInputElement | null} + */ + const input = target.querySelector('input[type=text]'); + /** + * @type {HTMLButtonElement | null} + */ + const setString = target.querySelector('#setString'); + /** + * @type {HTMLButtonElement | null} + */ + const setNull = target.querySelector('#setNull'); + /** + * @type {HTMLButtonElement | null} + */ + const setUndefined = target.querySelector('#setUndefined'); + + ok(input); + ok(setString); + ok(setNull); + ok(setUndefined); + + // value should always be blank string when value attribute is set to null or undefined + + assert.equal(input.value, ''); + setString.click(); + flushSync(); + assert.equal(input.value, 'foo'); + + setNull.click(); + flushSync(); + assert.equal(input.value, ''); + + setString.click(); + flushSync(); + assert.equal(input.value, 'foo'); + + setUndefined.click(); + flushSync(); + assert.equal(input.value, ''); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/main.svelte b/packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/main.svelte new file mode 100644 index 000000000000..9f944923c2f7 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/value-attribute-null-undefined/main.svelte @@ -0,0 +1,9 @@ + + + + + + + From 9c723614d77e2573bcdecf64263e6973c11ca92f Mon Sep 17 00:00:00 2001 From: Theodore Brown Date: Wed, 22 Jan 2025 12:29:01 -0600 Subject: [PATCH 2/2] Add changeset --- .changeset/dirty-sloths-move.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dirty-sloths-move.md diff --git a/.changeset/dirty-sloths-move.md b/.changeset/dirty-sloths-move.md new file mode 100644 index 000000000000..07436a0b2e1b --- /dev/null +++ b/.changeset/dirty-sloths-move.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: consistently set value to blank string when value attribute is undefined