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)
|
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
|
// For <input type="text">, setting el.value won't create a `value` attribute
|
||||||
// so we need to add tests for other elements
|
// so we need to add tests for other elements
|
||||||
test('value for non-text input', () => {
|
test('value for non-text input', () => {
|
||||||
|
@ -26,7 +26,12 @@ export function patchDOMProp(
|
|||||||
return
|
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
|
// store value as _value as well since
|
||||||
// non-string values will be stringified.
|
// non-string values will be stringified.
|
||||||
el._value = value
|
el._value = value
|
||||||
|
Loading…
Reference in New Issue
Block a user