From b23f5ff4c35a15168f3d48d8da541092d099911f Mon Sep 17 00:00:00 2001 From: javoski Date: Sun, 31 Dec 2017 20:52:30 +0800 Subject: [PATCH 1/4] add failed test case --- test/unit/modules/vdom/create-element.spec.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/unit/modules/vdom/create-element.spec.js b/test/unit/modules/vdom/create-element.spec.js index f2fddcf6d14..26e182ce3ad 100644 --- a/test/unit/modules/vdom/create-element.spec.js +++ b/test/unit/modules/vdom/create-element.spec.js @@ -141,7 +141,7 @@ describe('create-element', () => { expect(vnode.children[0].children[0].ns).toBeUndefined() }) - // #6642 + // #6642 #7330 it('render svg foreignObject component with correct namespace', () => { const vm = new Vue({ template: ` @@ -154,6 +154,7 @@ describe('create-element', () => { template: `

+
` } @@ -165,6 +166,8 @@ describe('create-element', () => { expect(testComp._vnode.ns).toBe('svg') expect(testComp._vnode.children[0].tag).toBe('p') expect(testComp._vnode.children[0].ns).toBeUndefined() + expect(testComp._vnode.children[1].tag).toBe('svg') + expect(testComp._vnode.children[1].ns).toBe('svg') }) // #6506 From 7769c7382c84b4c04a78e268b46f156ab7a1ab71 Mon Sep 17 00:00:00 2001 From: javoski Date: Sun, 31 Dec 2017 21:17:06 +0800 Subject: [PATCH 2/4] fix failed test case --- test/unit/modules/vdom/create-element.spec.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/unit/modules/vdom/create-element.spec.js b/test/unit/modules/vdom/create-element.spec.js index 26e182ce3ad..8a8ee984002 100644 --- a/test/unit/modules/vdom/create-element.spec.js +++ b/test/unit/modules/vdom/create-element.spec.js @@ -135,10 +135,11 @@ describe('create-element', () => { it('render svg foreignObject with correct namespace', () => { const vm = new Vue({}) const h = vm.$createElement - const vnode = h('svg', [h('foreignObject', [h('p')])]) + const vnode = h('svg', [h('foreignObject', [h('p'), h('svg')])]) expect(vnode.ns).toBe('svg') expect(vnode.children[0].ns).toBe('svg') expect(vnode.children[0].children[0].ns).toBeUndefined() + expect(vnode.children[0].children[1].ns).toBe('svg') }) // #6642 #7330 @@ -154,7 +155,6 @@ describe('create-element', () => { template: `

-
` } @@ -166,8 +166,6 @@ describe('create-element', () => { expect(testComp._vnode.ns).toBe('svg') expect(testComp._vnode.children[0].tag).toBe('p') expect(testComp._vnode.children[0].ns).toBeUndefined() - expect(testComp._vnode.children[1].tag).toBe('svg') - expect(testComp._vnode.children[1].ns).toBe('svg') }) // #6506 From 98db471b6c00eab63367246defd22ce3e5174c4d Mon Sep 17 00:00:00 2001 From: javoski Date: Sun, 31 Dec 2017 21:25:13 +0800 Subject: [PATCH 3/4] fix(vdom): svg inside foreignObject should be rendered with correct namespace --- src/core/vdom/create-element.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/vdom/create-element.js b/src/core/vdom/create-element.js index 248bcff18f9..c5cde2c6424 100644 --- a/src/core/vdom/create-element.js +++ b/src/core/vdom/create-element.js @@ -139,7 +139,8 @@ function applyNS (vnode, ns, force) { if (isDef(vnode.children)) { for (let i = 0, l = vnode.children.length; i < l; i++) { const child = vnode.children[i] - if (isDef(child.tag) && (isUndef(child.ns) || isTrue(force))) { + if (isDef(child.tag) && ( + isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) { applyNS(child, ns, force) } } From 725cc1beaa59fc37a7d979addb2f550c9eca5861 Mon Sep 17 00:00:00 2001 From: javoski Date: Sun, 31 Dec 2017 21:33:44 +0800 Subject: [PATCH 4/4] adjust comments --- test/unit/modules/vdom/create-element.spec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/modules/vdom/create-element.spec.js b/test/unit/modules/vdom/create-element.spec.js index 8a8ee984002..16a5e4a8a7c 100644 --- a/test/unit/modules/vdom/create-element.spec.js +++ b/test/unit/modules/vdom/create-element.spec.js @@ -139,10 +139,11 @@ describe('create-element', () => { expect(vnode.ns).toBe('svg') expect(vnode.children[0].ns).toBe('svg') expect(vnode.children[0].children[0].ns).toBeUndefined() + // #7330 expect(vnode.children[0].children[1].ns).toBe('svg') }) - // #6642 #7330 + // #6642 it('render svg foreignObject component with correct namespace', () => { const vm = new Vue({ template: `