fix: ensure if block paths retain correct template namespacing (#14685)

* fix: ensure if block paths retain correct template namespacing

* add tests

* address feedback

* address feedback

* simplify

---------

Co-authored-by: Rich Harris <rich.harris@vercel.com>
pull/14699/head
Dominic Gannaway 2 weeks ago committed by GitHub
parent 780041a51e
commit 2e0dcd7872
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: ensure if block paths retain correct template namespacing

@ -347,7 +347,24 @@ export function infer_namespace(namespace, parent, nodes) {
}
}
return namespace;
/** @type {Namespace | null} */
let new_namespace = null;
// Check the elements within the fragment and look for consistent namespaces.
// If we have no namespaces or they are mixed, then fallback to existing namespace
for (const node of nodes) {
if (node.type !== 'RegularElement') continue;
if (node.metadata.mathml) {
new_namespace = new_namespace === null || new_namespace === 'mathml' ? 'mathml' : 'html';
} else if (node.metadata.svg) {
new_namespace = new_namespace === null || new_namespace === 'svg' ? 'svg' : 'html';
} else {
return 'html';
}
}
return new_namespace ?? namespace;
}
/**

@ -0,0 +1,8 @@
{#if true}
<g>
<rect x="20" y="10" width="50" height="50" fill="yellow"/>
</g>
{:else}
<div>lol</div>
{/if}

@ -0,0 +1,14 @@
import { test, ok } from '../../test';
export default test({
html: `<svg height="200px" viewBox="0 0 100 100" width="200px"><g><rect fill="yellow" height="50" width="50" x="20" y="10"></rect></g></svg>`,
test({ assert, target }) {
const g = target.querySelector('g');
const rect = target.querySelector('rect');
ok(g);
ok(rect);
assert.equal(g.namespaceURI, 'http://www.w3.org/2000/svg');
assert.equal(rect.namespaceURI, 'http://www.w3.org/2000/svg');
}
});

@ -0,0 +1,7 @@
<script>
import Child from "./Child.svelte";
</script>
<svg viewBox="0 0 100 100" width="200px" height="200px">
<Child />
</svg>
Loading…
Cancel
Save