From adea3ca6c98572991df93482e472a4bf3aa1985e Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 6 Feb 2024 17:15:56 +0100 Subject: [PATCH 1/3] fix: handle nested script tags fixes #9484 --- .changeset/loud-ravens-drop.md | 5 ++ .../3-transform/client/transform-client.js | 5 +- .../phases/3-transform/client/types.d.ts | 17 +++++- .../3-transform/client/visitors/template.js | 49 +++++++++++---- .../svelte/src/internal/client/reconciler.js | 31 ++++++++-- packages/svelte/src/internal/client/render.js | 60 +++++++++++++++---- .../samples/nested-script-tag/_config.js | 28 +++++++++ .../samples/nested-script-tag/main.svelte | 5 ++ 8 files changed, 172 insertions(+), 28 deletions(-) create mode 100644 .changeset/loud-ravens-drop.md create mode 100644 packages/svelte/tests/runtime-runes/samples/nested-script-tag/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/nested-script-tag/main.svelte diff --git a/.changeset/loud-ravens-drop.md b/.changeset/loud-ravens-drop.md new file mode 100644 index 000000000000..59fb1618c5b9 --- /dev/null +++ b/.changeset/loud-ravens-drop.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: handle nested script tags diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 124eee0a52c0..5102e62c0948 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -84,7 +84,10 @@ export function client_component(source, analysis, options) { }, legacy_reactive_statements: new Map(), metadata: { - template_needs_import_node: false, + context: { + template_needs_import_node: false, + template_contains_script_tag: false + }, namespace: options.namespace, bound_contenteditable: false }, diff --git a/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts b/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts index 14b628a89d54..96fce18986a5 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts +++ b/packages/svelte/src/compiler/phases/3-transform/client/types.d.ts @@ -47,9 +47,22 @@ export interface ComponentClientTransformState extends ClientTransformState { readonly template: string[]; readonly metadata: { namespace: Namespace; - /** `true` if the HTML template needs to be instantiated with `importNode` */ - template_needs_import_node: boolean; bound_contenteditable: boolean; + /** + * Stuff that is set within the children of one `create_block` that is relevant + * to said `create_block`. Shouldn't be destructured or otherwise spread unless + * inside `create_block` to keep the object reference intact (it's also nested + * within `metadata` for this reason). + */ + context: { + /** `true` if the HTML template needs to be instantiated with `importNode` */ + template_needs_import_node: boolean; + /** + * `true` if HTML template contains a ` + From 2c7d95d88169fe3fe4035e835d926fbf784d50d0 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 6 Feb 2024 17:27:14 +0100 Subject: [PATCH 2/3] copy over all attributes --- packages/svelte/src/internal/client/reconciler.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/internal/client/reconciler.js b/packages/svelte/src/internal/client/reconciler.js index 4f581373e571..ce3dd5f00c0f 100644 --- a/packages/svelte/src/internal/client/reconciler.js +++ b/packages/svelte/src/internal/client/reconciler.js @@ -19,11 +19,10 @@ export function create_fragment_with_script_from_html(html) { var scripts = content.querySelectorAll('script'); for (const script of scripts) { var newScript = document.createElement('script'); - if (script.src) { - newScript.src = script.src; - } else { - newScript.textContent = script.textContent; + for (var i = 0; i < script.attributes.length; i++) { + newScript.setAttribute(script.attributes[i].name, script.attributes[i].value); } + newScript.textContent = script.textContent; /** @type {Node} */ (script.parentNode).replaceChild(newScript, script); } return content; From 954b4fdfec18d0bfb5ca09e302c62679f8b46d45 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 6 Feb 2024 17:30:31 +0100 Subject: [PATCH 3/3] lint --- packages/svelte/src/internal/client/reconciler.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/internal/client/reconciler.js b/packages/svelte/src/internal/client/reconciler.js index ce3dd5f00c0f..848e7205a3f4 100644 --- a/packages/svelte/src/internal/client/reconciler.js +++ b/packages/svelte/src/internal/client/reconciler.js @@ -18,12 +18,12 @@ export function create_fragment_with_script_from_html(html) { var content = create_fragment_from_html(html); var scripts = content.querySelectorAll('script'); for (const script of scripts) { - var newScript = document.createElement('script'); + var new_script = document.createElement('script'); for (var i = 0; i < script.attributes.length; i++) { - newScript.setAttribute(script.attributes[i].name, script.attributes[i].value); + new_script.setAttribute(script.attributes[i].name, script.attributes[i].value); } - newScript.textContent = script.textContent; - /** @type {Node} */ (script.parentNode).replaceChild(newScript, script); + new_script.textContent = script.textContent; + /** @type {Node} */ (script.parentNode).replaceChild(new_script, script); } return content; }