File tree 4 files changed +38
-7
lines changed
src/internal/client/dom/elements
tests/runtime-runes/samples/custom-element-attributes
4 files changed +38
-7
lines changed Original file line number Diff line number Diff line change
1
+ ---
2
+ ' svelte ' : patch
3
+ ---
4
+
5
+ fix: properly set ` value ` property of custom elements
Original file line number Diff line number Diff line change @@ -363,9 +363,10 @@ export function set_attributes(
363
363
element . style . cssText = value + '' ;
364
364
} else if ( key === 'autofocus' ) {
365
365
autofocus ( /** @type {HTMLElement } */ ( element ) , Boolean ( value ) ) ;
366
- } else if ( key === '__value' || ( key === 'value' && value != null ) ) {
367
- // @ts -ignore
368
- element . value = element [ key ] = element . __value = value ;
366
+ } else if ( ! is_custom_element && ( key === '__value' || ( key === 'value' && value != null ) ) ) {
367
+ // @ts -ignore We're not running this for custom elements because __value is actually
368
+ // how Lit stores the current value on the element, and messing with that would break things.
369
+ element . value = element . __value = value ;
369
370
} else if ( key === 'selected' && is_option_element ) {
370
371
set_selected ( /** @type {HTMLOptionElement } */ ( element ) , value ) ;
371
372
} else {
Original file line number Diff line number Diff line change 1
1
import { test } from '../../test' ;
2
2
3
3
export default test ( {
4
- mode : [ 'client' , 'server' ] ,
4
+ mode : [ 'client' ] ,
5
5
async test ( { assert, target } ) {
6
6
const my_element = /** @type HTMLElement & { object: { test: true }; } */ (
7
7
target . querySelector ( 'my-element' )
8
8
) ;
9
- const my_link = /** @type HTMLAnchorElement & { object: { test: true }; } */ (
10
- target . querySelector ( 'a' )
11
- ) ;
12
9
assert . equal ( my_element . getAttribute ( 'string' ) , 'test' ) ;
13
10
assert . equal ( my_element . hasAttribute ( 'object' ) , false ) ;
14
11
assert . deepEqual ( my_element . object , { test : true } ) ;
12
+
13
+ const my_link = /** @type HTMLAnchorElement & { object: { test: true }; } */ (
14
+ target . querySelector ( 'a' )
15
+ ) ;
15
16
assert . equal ( my_link . getAttribute ( 'string' ) , 'test' ) ;
16
17
assert . equal ( my_link . hasAttribute ( 'object' ) , false ) ;
17
18
assert . deepEqual ( my_link . object , { test : true } ) ;
19
+
20
+ const [ value1 , value2 ] = target . querySelectorAll ( 'value-element' ) ;
21
+ assert . equal ( value1 . shadowRoot ?. innerHTML , '<span>test</span>' ) ;
22
+ assert . equal ( value2 . shadowRoot ?. innerHTML , '<span>test</span>' ) ;
18
23
}
19
24
} ) ;
Original file line number Diff line number Diff line change
1
+ <script module >
2
+ customElements .define (' value-element' , class extends HTMLElement {
3
+
4
+ constructor () {
5
+ super ();
6
+ this .attachShadow ({ mode: ' open' });
7
+ }
8
+
9
+ set value (v ) {
10
+ if (this .__value !== v) {
11
+ this .__value = v;
12
+ this .shadowRoot .innerHTML = ` <span >${ v} </span >` ;
13
+ }
14
+ }
15
+ });
16
+ </script >
17
+
1
18
<my-element string ="test" object ={{ test : true }}></my-element >
2
19
<a is ="my-link" string ="test" object ={{ test : true }}></a >
20
+
21
+ <value-element value =" test" ></value-element >
22
+ <value-element {...{value: " test" }}></value-element >
You can’t perform that action at this time.
0 commit comments