Skip to content

Commit 8705d44

Browse files
authored
fix: ensure svg namespace for <a> elements is correct (#14756)
* fix: ensure svg namespace persists from parent of if blocks * better fix * better fix * address feedback
1 parent bfa0b34 commit 8705d44

File tree

4 files changed

+40
-1
lines changed

4 files changed

+40
-1
lines changed

.changeset/nine-buses-own.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: ensure svg namespace for `<a>` elements is correct

packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,23 @@ export function RegularElement(node, context) {
8686
(attribute) => attribute.type === 'SpreadAttribute'
8787
);
8888

89-
node.metadata.svg = is_svg(node.name);
89+
const is_svg_element = () => {
90+
if (is_svg(node.name)) {
91+
return true;
92+
}
93+
if (node.name === 'a') {
94+
for (let i = context.path.length - 1; i >= 0; i--) {
95+
const ancestor = context.path[i];
96+
if (ancestor.type === 'RegularElement') {
97+
return ancestor.metadata.svg;
98+
}
99+
}
100+
}
101+
102+
return false;
103+
};
104+
105+
node.metadata.svg = is_svg_element();
90106
node.metadata.mathml = is_mathml(node.name);
91107

92108
if (is_custom_element_node(node) && node.attributes.length > 0) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { test, ok } from '../../test';
2+
3+
export default test({
4+
html: `<svg><a href="/docs"><text class="small" x="20" y="40"></text></a></svg>`,
5+
test({ assert, target }) {
6+
const a = target.querySelector('a');
7+
ok(a);
8+
9+
assert.equal(a.namespaceURI, 'http://www.w3.org/2000/svg');
10+
}
11+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<svg>
2+
{#if true}
3+
<a href="/docs">
4+
<text x="20" y="40" class="small">{name}</text>
5+
</a>
6+
{/if}
7+
</svg>

0 commit comments

Comments
 (0)