diff --git a/packages/runtime-dom/__tests__/patchProps.spec.ts b/packages/runtime-dom/__tests__/patchProps.spec.ts
index ce30f911..fc5fdde0 100644
--- a/packages/runtime-dom/__tests__/patchProps.spec.ts
+++ b/packages/runtime-dom/__tests__/patchProps.spec.ts
@@ -6,6 +6,7 @@ describe('runtime-dom: props patching', () => {
const el = document.createElement('div')
patchProp(el, 'id', null, 'foo')
expect(el.id).toBe('foo')
+ // prop with string value should be set to empty string on null values
patchProp(el, 'id', null, null)
expect(el.id).toBe('')
})
@@ -75,4 +76,20 @@ describe('runtime-dom: props patching', () => {
expect(root.innerHTML).toBe(`
bar
`)
expect(fn).toHaveBeenCalled()
})
+
+ // #1049
+ test('set value as-is for non string-value props', () => {
+ const el = document.createElement('video')
+ // jsdom doesn't really support video playback. srcObject in a real browser
+ // should default to `null`, but in jsdom it's `undefined`.
+ // anyway, here we just want to make sure Vue doesn't set non-string props
+ // to an empty string on nullish values - it should reset to its default
+ // value.
+ const intiialValue = el.srcObject
+ const fakeObject = {}
+ patchProp(el, 'srcObject', null, fakeObject)
+ expect(el.srcObject).not.toBe(fakeObject)
+ patchProp(el, 'srcObject', null, null)
+ expect(el.srcObject).toBe(intiialValue)
+ })
})
diff --git a/packages/runtime-dom/src/modules/props.ts b/packages/runtime-dom/src/modules/props.ts
index 0b36578e..4a9b34c5 100644
--- a/packages/runtime-dom/src/modules/props.ts
+++ b/packages/runtime-dom/src/modules/props.ts
@@ -31,7 +31,10 @@ export function patchDOMProp(
if (value === '' && typeof el[key] === 'boolean') {
// e.g.