fix: handle autofocus and muted

pull/18058/head
paoloricciuti 5 months ago
parent 2dc8fd19a3
commit ff5e835bf0

@ -257,7 +257,7 @@ export function RegularElement(node, context) {
if (name !== 'class' || value) { if (name !== 'class' || value) {
context.state.template.set_prop(attribute.name, value === true ? '' : value); context.state.template.set_prop(attribute.name, value === true ? '' : value);
} }
} else if (name === 'autofocus') { } else if (name === 'autofocus' && !context.state.options.customRenderer) {
let { value } = build_attribute_value(attribute.value, context); let { value } = build_attribute_value(attribute.value, context);
context.state.init.push(b.stmt(b.call('$.autofocus', node_id, value))); context.state.init.push(b.stmt(b.call('$.autofocus', node_id, value)));
} else if (name === 'class') { } else if (name === 'class') {
@ -615,7 +615,7 @@ function build_element_attribute_update(
attributes, attributes,
custom_renderer = false custom_renderer = false
) { ) {
if (name === 'muted') { if (name === 'muted' && !custom_renderer) {
// Special case for Firefox who needs it set as a property in order to work // Special case for Firefox who needs it set as a property in order to work
return b.assignment('=', b.member(node_id, b.id('muted')), value); return b.assignment('=', b.member(node_id, b.id('muted')), value);
} }
@ -656,7 +656,7 @@ function build_element_attribute_update(
return b.call('$.set_default_checked', node_id, value); return b.call('$.set_default_checked', node_id, value);
} }
if (is_dom_property(name)) { if (is_dom_property(name) && !custom_renderer) {
return b.assignment('=', b.member(node_id, name), value); return b.assignment('=', b.member(node_id, name), value);
} }

@ -2,10 +2,7 @@ import { flushSync } from 'svelte';
import { test } from '../../test'; import { test } from '../../test';
export default test({ export default test({
test({ assert, target, serialize, dispatch_event }) { test({ assert, target, dispatch_event }) {
// Initial state
const html = serialize(target);
// Find all inputs and the button // Find all inputs and the button
const inputs = target.children.filter( const inputs = target.children.filter(
(/** @type {any} */ n) => n.type === 'element' && n.name === 'input' (/** @type {any} */ n) => n.type === 'element' && n.name === 'input'
@ -22,6 +19,8 @@ export default test({
assert.equal(input_value.attributes['value'], 'hello'); assert.equal(input_value.attributes['value'], 'hello');
assert.equal(input_value.attributes['class'], 'hello'); assert.equal(input_value.attributes['class'], 'hello');
assert.equal(input_value.attributes['style'], 'color: blue'); assert.equal(input_value.attributes['style'], 'color: blue');
assert.equal(input_value.attributes['autofocus'], 'true');
assert.equal(input_value.attributes['muted'], 'true');
// Input 2: type="checkbox" checked="" // Input 2: type="checkbox" checked=""
const input_checked = inputs[1]; const input_checked = inputs[1];

@ -8,7 +8,7 @@
let spread = $derived({value, class: class_name, style}); let spread = $derived({value, class: class_name, style});
</script> </script>
<input {value} class={class_name} {style} /> <input autofocus muted {value} class={class_name} {style} />
<input type="checkbox" checked={checked} /> <input type="checkbox" checked={checked} />
<input value="fixed" defaultValue={default_value} /> <input value="fixed" defaultValue={default_value} />
<input type="checkbox" checked defaultChecked={default_checked} /> <input type="checkbox" checked defaultChecked={default_checked} />

Loading…
Cancel
Save