Skip to content

Commit

Permalink
fix(runtime-dom): should patch svg innerHtml (#956)
Browse files Browse the repository at this point in the history
  • Loading branch information
underfin authored Apr 13, 2020
1 parent 33ccfc0 commit 27b5c71
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
16 changes: 16 additions & 0 deletions packages/runtime-dom/__tests__/patchProps.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,22 @@ describe('runtime-dom: props patching', () => {
expect(fn).toHaveBeenCalled()
})

// #954
test('(svg) innerHTML unmount prev children', () => {
const fn = jest.fn()
const comp = {
render: () => 'foo',
unmounted: fn
}
const root = document.createElement('div')
render(h('div', null, [h(comp)]), root)
expect(root.innerHTML).toBe(`<div>foo</div>`)

render(h('svg', { innerHTML: '<g></g>' }), root)
expect(root.innerHTML).toBe(`<svg><g></g></svg>`)
expect(fn).toHaveBeenCalled()
})

test('textContent unmount prev children', () => {
const fn = jest.fn()
const comp = {
Expand Down
16 changes: 11 additions & 5 deletions packages/runtime-dom/src/patchProp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { patchStyle } from './modules/style'
import { patchAttr } from './modules/attrs'
import { patchDOMProp } from './modules/props'
import { patchEvent } from './modules/events'
import { isOn, isString } from '@vue/shared'
import { isOn, isString, isFunction } from '@vue/shared'
import { RendererOptions } from '@vue/runtime-core'

const nativeOnRE = /^on[a-z]/
Expand Down Expand Up @@ -34,10 +34,16 @@ export const patchProp: RendererOptions<Node, Element>['patchProp'] = (
patchEvent(el, key, prevValue, nextValue, parentComponent)
}
} else if (
!isSVG &&
key in el &&
// onclick="foo" needs to be set as an attribute to work
!(nativeOnRE.test(key) && isString(nextValue))
isSVG
? // most keys must be set as attribute on svg elements to work
// ...except innerHTML
key === 'innerHTML' ||
// or native onclick with function values
(key in el && nativeOnRE.test(key) && isFunction(nextValue))
: // for normal html elements, set as a property if it exists
key in el &&
// except native onclick with string values
!(nativeOnRE.test(key) && isString(nextValue))
) {
patchDOMProp(
el,
Expand Down

0 comments on commit 27b5c71

Please sign in to comment.