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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user