fix(runtime-dom): patchDOMProps should not set _value if element is custom element (#4839)
Co-authored-by: Stefan Mayer <stefan.m.mayer@daimler.com>
This commit is contained in:
parent
aac0466cb8
commit
1701bf3968
@ -25,6 +25,40 @@ describe('runtime-dom: props patching', () => {
|
||||
expect((el as any)._value).toBe(obj)
|
||||
})
|
||||
|
||||
test('value for custom elements', () => {
|
||||
class TestElement extends HTMLElement {
|
||||
constructor() {
|
||||
super()
|
||||
}
|
||||
|
||||
// intentionally uses _value because this is used in "normal" HTMLElement for storing the object of the set property value
|
||||
private _value: any
|
||||
get value() {
|
||||
return this._value
|
||||
}
|
||||
|
||||
set value(val) {
|
||||
this._value = val
|
||||
this.setterCalled++
|
||||
}
|
||||
|
||||
public setterCalled: number = 0
|
||||
}
|
||||
window.customElements.define('test-element', TestElement)
|
||||
const el = document.createElement('test-element') as TestElement
|
||||
patchProp(el, 'value', null, 'foo')
|
||||
expect(el.value).toBe('foo')
|
||||
expect(el.setterCalled).toBe(1)
|
||||
patchProp(el, 'value', null, null)
|
||||
expect(el.value).toBe('')
|
||||
expect(el.setterCalled).toBe(2)
|
||||
expect(el.getAttribute('value')).toBe(null)
|
||||
const obj = {}
|
||||
patchProp(el, 'value', null, obj)
|
||||
expect(el.value).toBe(obj)
|
||||
expect(el.setterCalled).toBe(3)
|
||||
})
|
||||
|
||||
// For <input type="text">, setting el.value won't create a `value` attribute
|
||||
// so we need to add tests for other elements
|
||||
test('value for non-text input', () => {
|
||||
|
@ -26,7 +26,12 @@ export function patchDOMProp(
|
||||
return
|
||||
}
|
||||
|
||||
if (key === 'value' && el.tagName !== 'PROGRESS') {
|
||||
if (
|
||||
key === 'value' &&
|
||||
el.tagName !== 'PROGRESS' &&
|
||||
// custom elements may use _value internally
|
||||
!el.tagName.includes('-')
|
||||
) {
|
||||
// store value as _value as well since
|
||||
// non-string values will be stringified.
|
||||
el._value = value
|
||||
|
Loading…
Reference in New Issue
Block a user