Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix] 1.@html in template set inner html, 2. with sibling error closes [#7315, #7319] #7364

Merged
merged 8 commits into from Feb 28, 2023
9 changes: 5 additions & 4 deletions src/runtime/internal/dom.ts
Expand Up @@ -698,7 +698,7 @@ export class HtmlTag {
// html tag nodes
n: ChildNode[];
// target
t: HTMLElement | SVGElement;
t: HTMLElement | SVGElement | DocumentFragment;
// anchor
a: HTMLElement | SVGElement;

Expand All @@ -718,8 +718,9 @@ export class HtmlTag {
) {
if (!this.e) {
if (this.is_svg) this.e = svg_element(target.nodeName as keyof SVGElementTagNameMap);
else this.e = element(target.nodeName as keyof HTMLElementTagNameMap);
this.t = target;
/** #7364 target for <template> may be provided as #document-fragment(11) */
else this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName) as keyof HTMLElementTagNameMap);
this.t = target.tagName !== 'TEMPLATE' ? target : (target as HTMLTemplateElement).content;
this.c(html);
}

Expand All @@ -728,7 +729,7 @@ export class HtmlTag {

h(html: string) {
this.e.innerHTML = html;
this.n = Array.from(this.e.childNodes);
this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? (this.e as HTMLTemplateElement).content.childNodes : this.e.childNodes);
}

i(anchor) {
Expand Down
12 changes: 12 additions & 0 deletions test/runtime/samples/template/_config.js
Expand Up @@ -6,6 +6,7 @@ export default {
<div>foo</div>
</template>
<template id="t2">123</template>
<template id="t3">1<b>B</b>1</template>
`,

test({ assert, target }) {
Expand All @@ -27,5 +28,16 @@ export default {
assert.equal(template2.content.firstChild.textContent, '123');
assert.htmlEqual(template2.innerHTML, '123');

const template3 = target.querySelector('#t3');
assert.equal(template3.childNodes.length, 0);
assert.equal(template3.content.childNodes.length, 3);
// test: (with hydration from ssr rendered html)
// out of order render.
// <template>1{@html '2'}3</template> may render as <template>321</template> for ssr+hydration case.
// we bypass it by using symmetric siblings. hence <template> is not fully stable for this edge case.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm.. this sounds like a bug to be investigate further

assert.equal(template3.content.childNodes[0].textContent, '1');
assert.equal(template3.content.childNodes[1].outerHTML, '<b>B</b>');
assert.equal(template3.content.childNodes[2].textContent, '1');

}
};
3 changes: 2 additions & 1 deletion test/runtime/samples/template/main.svelte
@@ -1,4 +1,5 @@
<template id="t1">
<div>foo</div>
</template>
<template id="t2">123</template>
<template id="t2">123</template>
<template id="t3">1{@html '<b>B</b>'}1</template>