diff --git a/.changeset/calm-taxis-promise.md b/.changeset/calm-taxis-promise.md new file mode 100644 index 000000000000..138e5a758c49 --- /dev/null +++ b/.changeset/calm-taxis-promise.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: ensure event delegation stops after an error diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index 330bcc266128..8e4fc93307ac 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -131,11 +131,19 @@ export function handle_event_propagation(handler_element, event) { var delegated = current_target[internal_prop_name]; if (delegated !== undefined && !(/** @type {any} */ (current_target).disabled)) { - if (is_array(delegated)) { - var [fn, ...data] = delegated; - fn.apply(current_target, [event, ...data]); - } else { - delegated.call(current_target, event); + try { + if (is_array(delegated)) { + var [fn, ...data] = delegated; + fn.apply(current_target, [event, ...data]); + } else { + delegated.call(current_target, event); + } + } catch (e) { + // @ts-expect-error ensure we don't run other handlers. Strictly speaking this is different + // from attaching multiple separate event listeners because those above would still run, + // but it's impossible for us to simulate this behavior here. + event.__root = document; + throw e; } } diff --git a/packages/svelte/tests/runtime-runes/samples/event-attribute-error/_config.js b/packages/svelte/tests/runtime-runes/samples/event-attribute-error/_config.js new file mode 100644 index 000000000000..816afe8afe27 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/event-attribute-error/_config.js @@ -0,0 +1,11 @@ +import { test } from '../../test'; + +export default test({ + async test({ assert, target }) { + const btn = target.querySelector('button'); + + await btn?.click(); + assert.htmlEqual(target.innerHTML, `
`); + }, + runtime_error: 'nope' +}); diff --git a/packages/svelte/tests/runtime-runes/samples/event-attribute-error/main.svelte b/packages/svelte/tests/runtime-runes/samples/event-attribute-error/main.svelte new file mode 100644 index 000000000000..978002edada2 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/event-attribute-error/main.svelte @@ -0,0 +1,19 @@ + + +