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:
Stefan Mayer 2021-11-25 11:30:32 +01:00 committed by GitHub
parent aac0466cb8
commit 1701bf3968
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 1 deletions

View File

@ -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', () => {

View File

@ -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