From 565ae5409943b41e59fc0ca83d7e5c777a02f8dd Mon Sep 17 00:00:00 2001 From: 7nik Date: Mon, 4 Aug 2025 19:30:00 +0300 Subject: [PATCH] check for any error and better node removal --- .../internal/client/dom/blocks/svelte-head.js | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) 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 b6f6bc09a4..b7ed6d4deb 100644 --- a/packages/svelte/src/internal/client/dom/blocks/svelte-head.js +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-head.js @@ -62,20 +62,25 @@ export function head(render_fn) { check_end(); } catch (error) { // Remount only this svelte:head - if (was_hydrating && head_anchor && error === HYDRATION_ERROR) { + if (was_hydrating && head_anchor != null) { + hydration_mismatch(); // Here head_anchor is the node next after HYDRATION_START /** @type {Node | null} */ - let node = head_anchor.previousSibling; + var node = head_anchor.previousSibling; // Remove nodes that failed to hydrate + var depth = 0; while (node !== null) { - const removed = node; + var prev = /** @type {TemplateNode} */ (node); node = get_next_sibling(node); - document.head.removeChild(removed); - if ( - removed.nodeType === COMMENT_NODE && - /** @type {Comment} */ (removed).data === HYDRATION_END - ) { - break; + prev.remove(); + if (prev.nodeType === COMMENT_NODE) { + var data = /** @type {Comment} */ (prev).data; + if (data === HYDRATION_END) { + depth -= 1; + if (depth === 0) break; + } else if (data === HYDRATION_START) { + depth += 1; + } } } // Setup hydration for the next svelte:head