Skip to content

Commit ae8e8ff

Browse files
authored
fix: removing a <title> should not render all previous <title>s (#53)
1 parent 72c603c commit ae8e8ff

File tree

3 files changed

+45
-15
lines changed

3 files changed

+45
-15
lines changed

.changeset/wide-clubs-serve.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solidjs/meta": patch
3+
---
4+
5+
Fix removing one <title> renders all previous <title>s

src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ function initClientProvider() {
155155
for (let i = index - 1; i >= 0; i--) {
156156
if (t[i] != null) {
157157
document.head.appendChild(t[i].ref);
158+
break;
158159
}
159160
}
160161
}

test/index.spec.tsx

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,35 @@ test("unmount middle child, should show only the last title", () => {
8989
dispose();
9090
});
9191

92+
test("unmount last child, should show only the second last title", () => {
93+
let div = document.createElement("div");
94+
const snapshot1 = "<title>Title 3</title>";
95+
const snapshot2 = "<title>Title 2</title>";
96+
const [visible, setVisible] = createSignal(true);
97+
const dispose = render(
98+
() => (
99+
<MetaProvider>
100+
<div>
101+
<Title>Title 1</Title>
102+
</div>
103+
<div>
104+
<Title>Title 2</Title>
105+
</div>
106+
<Show when={visible()}>
107+
<div>
108+
<Title>Title 3</Title>
109+
</div>
110+
</Show>
111+
</MetaProvider>
112+
),
113+
div
114+
);
115+
expect(document.head.innerHTML).toBe(snapshot1);
116+
setVisible(false);
117+
expect(document.head.innerHTML).toBe(snapshot2);
118+
dispose();
119+
});
120+
92121
test("hydrates only the last title", () => {
93122
hydrationScript();
94123
let div = document.createElement("div");
@@ -218,7 +247,7 @@ test("renders only the last meta with the same name", () => {
218247
const snapshot1 = '<meta><meta name="name1">';
219248
const snapshot2 = '<meta><meta name="name1">';
220249
const snapshot3 = '<meta name="name1"><meta>';
221-
250+
222251
const [visible1, setVisible1] = createSignal(false);
223252
const [visible2, setVisible2] = createSignal(false);
224253
const dispose = render(
@@ -279,16 +308,8 @@ test("renders both meta with the same name/property but different other attribut
279308
const dispose = render(
280309
() => (
281310
<MetaProvider>
282-
<Meta
283-
name="theme-color"
284-
media="(prefers-color-scheme: light)"
285-
content="#fff"
286-
/>
287-
<Meta
288-
name="theme-color"
289-
media="(prefers-color-scheme: dark)"
290-
content="#000"
291-
/>
311+
<Meta name="theme-color" media="(prefers-color-scheme: light)" content="#fff" />
312+
<Meta name="theme-color" media="(prefers-color-scheme: dark)" content="#000" />
292313
</MetaProvider>
293314
),
294315
div
@@ -307,7 +328,7 @@ test("throws error if head tag is rendered without MetaProvider", () => {
307328
test("doesn't create any effect on removal", () => {
308329
let div = document.createElement("div");
309330

310-
const [ show, setShow ] = createSignal(true);
331+
const [show, setShow] = createSignal(true);
311332
const showAndTest = () => {
312333
expect(getOwner()?.owner).toBeTruthy();
313334
return show();
@@ -317,7 +338,9 @@ test("doesn't create any effect on removal", () => {
317338
() => (
318339
<MetaProvider>
319340
<Show when={show()}>
320-
<Title>Something {showAndTest()} that forces the Solid compiler to create a memo here</Title>
341+
<Title>
342+
Something {showAndTest()} that forces the Solid compiler to create a memo here
343+
</Title>
321344
</Show>
322345
</MetaProvider>
323346
),
@@ -330,7 +353,8 @@ test("doesn't create any effect on removal", () => {
330353

331354
test("Escaping the title tag", () => {
332355
let div = document.createElement("div");
333-
const snapshot = '<title>Hello&lt;/title&gt;&lt;script&gt;alert("inject");&lt;/script&gt;&lt;title&gt; World</title>';
356+
const snapshot =
357+
'<title>Hello&lt;/title&gt;&lt;script&gt;alert("inject");&lt;/script&gt;&lt;title&gt; World</title>';
334358
const dispose = render(
335359
() => (
336360
<MetaProvider>
@@ -361,4 +385,4 @@ test("Escaping the title meta", () => {
361385
);
362386
expect(document.head.innerHTML).toBe(snapshot);
363387
dispose();
364-
});
388+
});

0 commit comments

Comments
 (0)