From ff1ae81343b4b676df7802ef776dab29ccca2fe5 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 23 Feb 2024 10:09:28 +0100 Subject: [PATCH] better changeset, use owner_document, comment --- .changeset/fresh-impalas-bow.md | 2 +- packages/svelte/src/internal/client/render.js | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.changeset/fresh-impalas-bow.md b/.changeset/fresh-impalas-bow.md index c3686ce076..c0f1601afe 100644 --- a/.changeset/fresh-impalas-bow.md +++ b/.changeset/fresh-impalas-bow.md @@ -2,4 +2,4 @@ "svelte": patch --- -fix: trigger again when window listener already handled +fix: prevent window listeners from triggering events twice diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index 2181c6bf81..fd6bf57b39 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -1383,6 +1383,7 @@ export function delegate(events) { * @returns {void} */ function handle_event_propagation(handler_element, event) { + const owner_document = handler_element.ownerDocument; const event_name = event.type; const path = event.composedPath?.() || []; let current_target = /** @type {null | Element} */ (path[0] || event.target); @@ -1402,9 +1403,11 @@ function handle_event_propagation(handler_element, event) { const handled_at = event.__root; if (handled_at) { const at_idx = path.indexOf(handled_at); - // @ts-ignore - if (at_idx !== -1 && (handler_element === document || handler_element === window)) { - // This is the fallback document/window listener but the event was already handled + if ( + at_idx !== -1 && + (handler_element === owner_document || handler_element === /** @type {any} */ (window)) + ) { + // This is the fallback document listener or a window listener, but the event was already handled // -> ignore, but set handle_at to document/window so that we're resetting the event // chain in case someone manually dispatches the same event object again. // @ts-expect-error @@ -1434,8 +1437,7 @@ function handle_event_propagation(handler_element, event) { define_property(event, 'currentTarget', { configurable: true, get() { - // TODO: ensure correct document? - return current_target || document; + return current_target || owner_document; } });