From e0a5e4fa35ea19350960a0f1110d826bf80f47a1 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 31 Mar 2026 14:47:53 +0200 Subject: [PATCH] fix: pass all the args to custom renderer events --- .../svelte/src/internal/client/dom/elements/events.js | 6 ++++-- .../samples/event-handler-no-propagation/_config.js | 10 +++++----- .../samples/event-handler-no-propagation/main.svelte | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/elements/events.js b/packages/svelte/src/internal/client/dom/elements/events.js index 58217a7b9d..e662101621 100644 --- a/packages/svelte/src/internal/client/dom/elements/events.js +++ b/packages/svelte/src/internal/client/dom/elements/events.js @@ -69,15 +69,17 @@ export function create_event(event_name, dom, handler, options = {}) { /** * @this {EventTarget} + * @param {...any} args */ - function target_handler(/** @type {Event} */ event) { + function target_handler(...args) { if (is_custom_renderer) { // Custom renderers don't use DOM event propagation/delegation, // so just call the handler directly return without_reactive_context(() => { - return handler?.call(this, event); + return handler?.apply(this, /** @type {any} */ (args)); }); } + var event = /** @type {Event} */ (args[0]); if (!options.capture) { // Only call in the bubble phase, else delegated events would be called before the capturing events handle_event_propagation.call(dom, event); diff --git a/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/_config.js b/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/_config.js index b902b602e6..085ca682d8 100644 --- a/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/_config.js +++ b/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/_config.js @@ -11,14 +11,14 @@ export default test({ const listeners = button.listeners?.click; assert.ok(listeners, 'button should have click listeners'); - // Call the handler with a plain object that is NOT a DOM Event. - // If handle_event_propagation is called, it will fail because - // it tries to access DOM-specific properties like composedPath, ownerDocument, etc. + // Call the handler with multiple arguments. + // Custom renderers may pass multiple arguments to event handlers, + // so we need to make sure all arguments are forwarded. for (const { handler } of listeners) { - handler.call(button, { type: 'click' }); + handler.call(button, { type: 'click' }, 'extra', 42); } flushSync(); - assert.deepEqual(logs, [{ type: 'click' }]); + assert.deepEqual(logs, [{ type: 'click' }, 'extra', 42]); } }); diff --git a/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/main.svelte b/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/main.svelte index c5c7626fb2..67a6e6ce92 100644 --- a/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/main.svelte +++ b/packages/svelte/tests/custom-renderers/samples/event-handler-no-propagation/main.svelte @@ -1,6 +1,6 @@