diff --git a/.changeset/curvy-lobsters-decide.md b/.changeset/curvy-lobsters-decide.md new file mode 100644 index 000000000000..64dddab811a4 --- /dev/null +++ b/.changeset/curvy-lobsters-decide.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: claim svg tags in raw mustache tags correctly diff --git a/packages/svelte/src/runtime/internal/dom.js b/packages/svelte/src/runtime/internal/dom.js index e1969c5514b7..57d3b2793e80 100644 --- a/packages/svelte/src/runtime/internal/dom.js +++ b/packages/svelte/src/runtime/internal/dom.js @@ -796,7 +796,7 @@ export function claim_html_tag(nodes, is_svg) { const start_index = find_comment(nodes, 'HTML_TAG_START', 0); const end_index = find_comment(nodes, 'HTML_TAG_END', start_index); if (start_index === end_index) { - return new HtmlTagHydration(undefined, is_svg); + return new HtmlTagHydration(is_svg); } init_claim_info(nodes); const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1); @@ -807,7 +807,7 @@ export function claim_html_tag(nodes, is_svg) { n.claim_order = nodes.claim_info.total_claimed; nodes.claim_info.total_claimed += 1; } - return new HtmlTagHydration(claimed_nodes, is_svg); + return new HtmlTagHydration(is_svg, claimed_nodes); } /** @@ -1134,13 +1134,11 @@ export class HtmlTag { } } -/** - * @extends HtmlTag */ export class HtmlTagHydration extends HtmlTag { - // hydration claimed nodes - /** */ + /** @type {Element[]} hydration claimed nodes */ l = undefined; - constructor(claimed_nodes, is_svg = false) { + + constructor(is_svg = false, claimed_nodes) { super(is_svg); this.e = this.n = null; this.l = claimed_nodes; diff --git a/packages/svelte/test/hydration/samples/raw-svg/_after.html b/packages/svelte/test/hydration/samples/raw-svg/_after.html new file mode 100644 index 000000000000..801d9627cd2e --- /dev/null +++ b/packages/svelte/test/hydration/samples/raw-svg/_after.html @@ -0,0 +1,3 @@ + diff --git a/packages/svelte/test/hydration/samples/raw-svg/_before.html b/packages/svelte/test/hydration/samples/raw-svg/_before.html new file mode 100644 index 000000000000..2a1285938dfe --- /dev/null +++ b/packages/svelte/test/hydration/samples/raw-svg/_before.html @@ -0,0 +1,5 @@ + diff --git a/packages/svelte/test/hydration/samples/raw-svg/_config.js b/packages/svelte/test/hydration/samples/raw-svg/_config.js new file mode 100644 index 000000000000..ffcc89e7ffa5 --- /dev/null +++ b/packages/svelte/test/hydration/samples/raw-svg/_config.js @@ -0,0 +1,14 @@ +export default { + snapshot(target) { + const svg = target.querySelector('svg'); + + return { + svg, + circle: svg.querySelector('circle') + }; + }, + test(assert, _, snapshot) { + assert.instanceOf(snapshot.svg, SVGElement); + assert.instanceOf(snapshot.circle, SVGElement); + } +}; diff --git a/packages/svelte/test/hydration/samples/raw-svg/main.svelte b/packages/svelte/test/hydration/samples/raw-svg/main.svelte new file mode 100644 index 000000000000..1b9310e09b36 --- /dev/null +++ b/packages/svelte/test/hydration/samples/raw-svg/main.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/svelte/test/hydration/samples/raw/_after.html b/packages/svelte/test/hydration/samples/raw/_after.html index d58c6f9d4d19..f465f3094fb6 100644 --- a/packages/svelte/test/hydration/samples/raw/_after.html +++ b/packages/svelte/test/hydration/samples/raw/_after.html @@ -1,4 +1,2 @@ -
this is some html
and so is this
- diff --git a/packages/svelte/test/hydration/samples/raw/_before.html b/packages/svelte/test/hydration/samples/raw/_before.html index f465f3094fb6..de20b90f6c04 100644 --- a/packages/svelte/test/hydration/samples/raw/_before.html +++ b/packages/svelte/test/hydration/samples/raw/_before.html @@ -1,2 +1,4 @@ +this is some html
and so is this
+ diff --git a/packages/svelte/test/hydration/samples/raw/_config.js b/packages/svelte/test/hydration/samples/raw/_config.js index 14ba7b12c1eb..829079d4f06c 100644 --- a/packages/svelte/test/hydration/samples/raw/_config.js +++ b/packages/svelte/test/hydration/samples/raw/_config.js @@ -1,6 +1,4 @@ export default { - skip: true, // existing nodes are blown away - props: { raw: 'this is some html
and so is this
' }, diff --git a/packages/svelte/test/hydration/samples/raw/main.svelte b/packages/svelte/test/hydration/samples/raw/main.svelte index 105e9e05817e..94278521ddeb 100644 --- a/packages/svelte/test/hydration/samples/raw/main.svelte +++ b/packages/svelte/test/hydration/samples/raw/main.svelte @@ -1 +1,5 @@ -{@html raw} \ No newline at end of file + + +{@html raw} diff --git a/packages/svelte/test/runtime/samples/raw-svg/_config.js b/packages/svelte/test/runtime/samples/raw-svg/_config.js new file mode 100644 index 000000000000..7744c8bdd125 --- /dev/null +++ b/packages/svelte/test/runtime/samples/raw-svg/_config.js @@ -0,0 +1,10 @@ +export default { + html: '', + + test({ assert, component, target }) { + component.show = true; + assert.equal(target.innerHTML, ''); + assert.instanceOf(target.querySelector('svg'), SVGElement); + assert.instanceOf(target.querySelector('circle'), SVGElement); + } +}; diff --git a/packages/svelte/test/runtime/samples/raw-svg/main.svelte b/packages/svelte/test/runtime/samples/raw-svg/main.svelte new file mode 100644 index 000000000000..248fa9125dea --- /dev/null +++ b/packages/svelte/test/runtime/samples/raw-svg/main.svelte @@ -0,0 +1,7 @@ + + +{#if show} + +{/if}