From 520b3e16bf721e728adaca44ab8398196d9e3d18 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 27 Jun 2024 13:34:52 -0400 Subject: [PATCH] fix head stuff --- packages/svelte/src/internal/client/constants.js | 1 + .../src/internal/client/dom/blocks/svelte-head.js | 3 ++- .../svelte/src/internal/client/reactivity/effects.js | 10 +++++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/internal/client/constants.js b/packages/svelte/src/internal/client/constants.js index 4fc214d469..accdf05036 100644 --- a/packages/svelte/src/internal/client/constants.js +++ b/packages/svelte/src/internal/client/constants.js @@ -17,6 +17,7 @@ export const EFFECT_TRANSPARENT = 1 << 15; /** Svelte 4 legacy mode props need to be handled with deriveds and be recognized elsewhere, hence the dedicated flag */ export const LEGACY_DERIVED_PROP = 1 << 16; export const INSPECT_EFFECT = 1 << 17; +export const HEAD_EFFECT = 1 << 18; export const STATE_SYMBOL = Symbol('$state'); export const STATE_FROZEN_SYMBOL = Symbol('$state.frozen'); diff --git a/packages/svelte/src/internal/client/dom/blocks/svelte-head.js b/packages/svelte/src/internal/client/dom/blocks/svelte-head.js index 03d6038d69..d61c8fbe24 100644 --- a/packages/svelte/src/internal/client/dom/blocks/svelte-head.js +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-head.js @@ -2,6 +2,7 @@ import { hydrate_anchor, hydrate_nodes, hydrating, set_hydrate_nodes } from '../ import { empty } from '../operations.js'; import { block } from '../../reactivity/effects.js'; import { HYDRATION_END, HYDRATION_START } from '../../../../constants.js'; +import { HEAD_EFFECT } from '../../constants.js'; /** * @type {Node | undefined} @@ -47,7 +48,7 @@ export function head(render_fn) { } try { - block(null, 0, () => render_fn(anchor)); + block(null, HEAD_EFFECT, () => render_fn(anchor)); } finally { if (was_hydrating) { set_hydrate_nodes(/** @type {import('#client').TemplateNode[]} */ (previous_hydrate_nodes)); diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index 4a72d63bde..d5316b18c4 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -31,7 +31,8 @@ import { DERIVED, UNOWNED, CLEAN, - INSPECT_EFFECT + INSPECT_EFFECT, + HEAD_EFFECT } from '../constants.js'; import { set } from './sources.js'; import { remove } from '../dom/reconciler.js'; @@ -341,7 +342,7 @@ export function execute_effect_teardown(effect) { export function destroy_effect(effect, remove_dom = true) { var removed = false; - if (remove_dom) { + if (remove_dom || (effect.f & HEAD_EFFECT) !== 0) { var start = get_first_node(effect); var end = get_last_node(effect); @@ -391,7 +392,10 @@ export function get_first_node(effect) { } var child = effect.first; - while (child && (child.f & (BLOCK_EFFECT | BRANCH_EFFECT)) === 0) { + while ( + child && + ((child.f & (BLOCK_EFFECT | BRANCH_EFFECT)) === 0 || (child.f & HEAD_EFFECT) !== 0) + ) { child = child.next; }