From c9f514718990a5819440214d6889eeb15b68f904 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Sat, 2 Nov 2024 11:52:51 +0100 Subject: [PATCH 1/4] fix: reset title element to previous value on removal fixes #7656 --- .../3-transform/client/visitors/TitleElement.js | 5 ++--- .../svelte/src/internal/client/dom/elements/misc.js | 12 ++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js index a71deaf539..67958ee600 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js @@ -14,11 +14,10 @@ export function TitleElement(node, context) { context.state ); - const statement = b.stmt(b.assignment('=', b.id('$.document.title'), value)); + context.state.init.push(b.stmt(b.call('$.title', value))); if (has_state) { + const statement = b.stmt(b.assignment('=', b.id('$.document.title'), value)); context.state.update.push(statement); - } else { - context.state.init.push(statement); } } diff --git a/packages/svelte/src/internal/client/dom/elements/misc.js b/packages/svelte/src/internal/client/dom/elements/misc.js index 61e513903f..3e0207c302 100644 --- a/packages/svelte/src/internal/client/dom/elements/misc.js +++ b/packages/svelte/src/internal/client/dom/elements/misc.js @@ -1,3 +1,4 @@ +import { teardown } from '../../reactivity/effects.js'; import { hydrating } from '../hydration.js'; import { clear_text_content, get_first_child } from '../operations.js'; import { queue_micro_task } from '../task.js'; @@ -56,3 +57,14 @@ export function add_form_reset_listener() { ); } } + +/** + * @param {string} text + */ +export function title(text) { + const previous = document.title; + document.title = text; + teardown(() => { + document.title = previous; + }); +} From 326502123e4313b857894c0a5b245c642ac07f0d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 4 Nov 2024 13:32:50 -0500 Subject: [PATCH 2/4] export $.title --- packages/svelte/src/internal/client/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/index.js b/packages/svelte/src/internal/client/index.js index c401867a0f..51d3f2f079 100644 --- a/packages/svelte/src/internal/client/index.js +++ b/packages/svelte/src/internal/client/index.js @@ -37,7 +37,7 @@ export { } from './dom/elements/attributes.js'; export { set_class, set_svg_class, set_mathml_class, toggle_class } from './dom/elements/class.js'; export { apply, event, delegate, replay_events } from './dom/elements/events.js'; -export { autofocus, remove_textarea_child } from './dom/elements/misc.js'; +export { autofocus, remove_textarea_child, title } from './dom/elements/misc.js'; export { set_style } from './dom/elements/style.js'; export { animation, transition } from './dom/elements/transitions.js'; export { bind_active_element } from './dom/elements/bindings/document.js'; From 2072638d183c3b3b41766e85434ae57b61550861 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 3 Dec 2024 22:00:21 -0500 Subject: [PATCH 3/4] fixes --- .../phases/3-transform/client/visitors/TitleElement.js | 5 +++-- .../runtime-runes/samples/if-dependency-order-2/_config.js | 4 ++-- .../runtime-runes/samples/if-dependency-order-2/main.svelte | 4 ++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js index ff3101289f..aa0940a6e4 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js @@ -14,10 +14,11 @@ export function TitleElement(node, context) { context.state ); - context.state.init.push(b.stmt(b.call('$.title', value))); + const statement = b.stmt(b.call('$.title', value)); if (has_state) { - const statement = b.stmt(b.assignment('=', b.id('$.document.title'), value)); context.state.update.push(statement); + } else { + context.state.init.push(statement); } } diff --git a/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/_config.js b/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/_config.js index 83b58d0f7b..08c54ee100 100644 --- a/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/_config.js @@ -5,7 +5,7 @@ export default test({ async test({ assert, target, window }) { const [btn1] = target.querySelectorAll('button'); - assert.htmlEqual(window.document.head.innerHTML, ``); + assert.htmlEqual(window.document.head.innerHTML, `initial`); flushSync(() => { btn1.click(); @@ -17,6 +17,6 @@ export default test({ btn1.click(); }); - assert.htmlEqual(window.document.head.innerHTML, `hello world`); + assert.htmlEqual(window.document.head.innerHTML, `initial`); } }); diff --git a/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/main.svelte b/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/main.svelte index 188762cdd5..4227fc932d 100644 --- a/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/if-dependency-order-2/main.svelte @@ -8,6 +8,10 @@ } + + initial + + From 3904b8f36c3ab1d87beea29989379b8513b4b600 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 3 Dec 2024 22:02:29 -0500 Subject: [PATCH 4/4] belt and braces --- .../svelte/src/internal/client/dom/elements/misc.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/elements/misc.js b/packages/svelte/src/internal/client/dom/elements/misc.js index 3e0207c302..b102168377 100644 --- a/packages/svelte/src/internal/client/dom/elements/misc.js +++ b/packages/svelte/src/internal/client/dom/elements/misc.js @@ -1,4 +1,4 @@ -import { teardown } from '../../reactivity/effects.js'; +import { render_effect } from '../../reactivity/effects.js'; import { hydrating } from '../hydration.js'; import { clear_text_content, get_first_child } from '../operations.js'; import { queue_micro_task } from '../task.js'; @@ -62,9 +62,12 @@ export function add_form_reset_listener() { * @param {string} text */ export function title(text) { - const previous = document.title; - document.title = text; - teardown(() => { - document.title = previous; + render_effect(() => { + const previous = document.title; + document.title = text; + + return () => { + document.title = previous; + }; }); }