Skip to content

Commit 36ec4e5

Browse files
committed
fix: correctly handle srcObject attribute on video elements
1 parent 32a1453 commit 36ec4e5

File tree

5 files changed

+36
-9
lines changed

5 files changed

+36
-9
lines changed

.changeset/bright-jokes-bow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: correctly handle srcObject attribute on video elements

packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { escape_html } from '../../../../../escaping.js';
77
import {
88
is_boolean_attribute,
9-
is_dom_property,
9+
DOM_PROPERTIES_MAP,
1010
is_load_error_element,
1111
is_void
1212
} from '../../../../../utils.js';
@@ -557,8 +557,8 @@ function build_element_attribute_update_assignment(element, node_id, attribute,
557557
update = b.stmt(b.call('$.set_value', node_id, value));
558558
} else if (name === 'checked') {
559559
update = b.stmt(b.call('$.set_checked', node_id, value));
560-
} else if (is_dom_property(name)) {
561-
update = b.stmt(b.assignment('=', b.member(node_id, name), value));
560+
} else if (DOM_PROPERTIES_MAP.has(name)) {
561+
update = b.stmt(b.assignment('=', b.member(node_id, DOM_PROPERTIES_MAP.get(name)), value));
562562
} else {
563563
if (name === 'style' && attribute.metadata.expression.has_state && has_call) {
564564
// ensure we're not creating a separate template effect for this so that

packages/svelte/src/utils.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,14 @@ const DOM_PROPERTIES = [
212212
'readOnly',
213213
'value',
214214
'inert',
215-
'volume'
215+
'volume',
216+
'srcObject'
216217
];
217218

218-
/**
219-
* @param {string} name
220-
*/
221-
export function is_dom_property(name) {
222-
return DOM_PROPERTIES.includes(name);
219+
export const DOM_PROPERTIES_MAP = new Map();
220+
221+
for (const property of DOM_PROPERTIES) {
222+
DOM_PROPERTIES_MAP.set(property.toLowerCase(), property);
223223
}
224224

225225
/**
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
html: `<video></video>`,
5+
6+
test({ assert, target }) {
7+
const video = target.querySelector('video');
8+
9+
// @ts-ignore
10+
assert.deepEqual(video?.srcObject, {});
11+
}
12+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script>
2+
let srcObject = $state();
3+
4+
$effect(() => {
5+
srcObject = {};
6+
})
7+
</script>
8+
9+
<video {srcObject}></video>
10+

0 commit comments

Comments
 (0)