From 8a19aaf0a873c10431572c2ead41e422bf21c455 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Wed, 22 Jan 2025 12:45:29 +0100 Subject: [PATCH 1/2] fix: don't throw for `undefined` non delegated event handlers --- .changeset/clever-cherries-hear.md | 5 +++++ .../svelte/src/internal/client/dom/elements/events.js | 2 +- .../samples/undefined-event-handler/_config.js | 9 +++++++++ .../samples/undefined-event-handler/main.svelte | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .changeset/clever-cherries-hear.md create mode 100644 packages/svelte/tests/runtime-runes/samples/undefined-event-handler/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/undefined-event-handler/main.svelte diff --git a/.changeset/clever-cherries-hear.md b/.changeset/clever-cherries-hear.md new file mode 100644 index 000000000000..df37943b4619 --- /dev/null +++ b/.changeset/clever-cherries-hear.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: don't throw for `undefined` non delegated event handlers diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index f2038f96ada3..b118afa7038c 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -63,7 +63,7 @@ export function create_event(event_name, dom, handler, options) { } if (!event.cancelBubble) { return without_reactive_context(() => { - return handler.call(this, event); + return handler?.call(this, event); }); } } diff --git a/packages/svelte/tests/runtime-runes/samples/undefined-event-handler/_config.js b/packages/svelte/tests/runtime-runes/samples/undefined-event-handler/_config.js new file mode 100644 index 000000000000..012fedb160dd --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/undefined-event-handler/_config.js @@ -0,0 +1,9 @@ +import { ok, test } from '../../test'; + +export default test({ + async test({ target }) { + const button = target.querySelector('button'); + ok(button); + button.dispatchEvent(new window.MouseEvent('mouseenter')); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/undefined-event-handler/main.svelte b/packages/svelte/tests/runtime-runes/samples/undefined-event-handler/main.svelte new file mode 100644 index 000000000000..ea4b4443e996 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/undefined-event-handler/main.svelte @@ -0,0 +1 @@ + From ea99f27c28aed6b4cc158267b8d8fb973f83d718 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Wed, 22 Jan 2025 14:25:55 +0100 Subject: [PATCH 2/2] chore: update typings --- .../svelte/src/internal/client/dom/elements/events.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index b118afa7038c..363b8e1ed501 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -49,10 +49,10 @@ export function replay_events(dom) { /** * @param {string} event_name * @param {EventTarget} dom - * @param {EventListener} handler - * @param {AddEventListenerOptions} options + * @param {EventListener} [handler] + * @param {AddEventListenerOptions} [options] */ -export function create_event(event_name, dom, handler, options) { +export function create_event(event_name, dom, handler, options = {}) { /** * @this {EventTarget} */ @@ -108,8 +108,8 @@ export function on(element, type, handler, options = {}) { /** * @param {string} event_name * @param {Element} dom - * @param {EventListener} handler - * @param {boolean} capture + * @param {EventListener} [handler] + * @param {boolean} [capture] * @param {boolean} [passive] * @returns {void} */