From 4b6a8e17c5a0558a680e30c73df9afbfe7476607 Mon Sep 17 00:00:00 2001 From: Mohamed Feddad Date: Wed, 21 Aug 2024 01:00:54 +0400 Subject: [PATCH] fix: failsafe JavaScript event emitter `notifyListeners` (#3695) * fix: failsafe JavaScript event emitter `notifyListeners` * chore: update change log --- v2/internal/frontend/runtime/desktop/events.js | 12 ++++++------ .../frontend/runtime/runtime_debug_desktop.js | 8 ++++---- website/src/pages/changelog.mdx | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/v2/internal/frontend/runtime/desktop/events.js b/v2/internal/frontend/runtime/desktop/events.js index 9548cbc34..619ff5f06 100644 --- a/v2/internal/frontend/runtime/desktop/events.js +++ b/v2/internal/frontend/runtime/desktop/events.js @@ -90,17 +90,17 @@ function notifyListeners(eventData) { // Get the event name let eventName = eventData.name; - // Check if we have any listeners for this event - if (eventListeners[eventName]) { + // Keep a list of listener indexes to destroy + const newEventListenerList = eventListeners[eventName]?.slice() || []; - // Keep a list of listener indexes to destroy - const newEventListenerList = eventListeners[eventName].slice(); + // Check if we have any listeners for this event + if (newEventListenerList.length) { // Iterate listeners - for (let count = eventListeners[eventName].length - 1; count >= 0; count -= 1) { + for (let count = newEventListenerList.length - 1; count >= 0; count -= 1) { // Get next listener - const listener = eventListeners[eventName][count]; + const listener = newEventListenerList[count]; let data = eventData.data; diff --git a/v2/internal/frontend/runtime/runtime_debug_desktop.js b/v2/internal/frontend/runtime/runtime_debug_desktop.js index bd8c27bed..5e95680b8 100644 --- a/v2/internal/frontend/runtime/runtime_debug_desktop.js +++ b/v2/internal/frontend/runtime/runtime_debug_desktop.js @@ -83,10 +83,10 @@ } function notifyListeners(eventData) { let eventName = eventData.name; - if (eventListeners[eventName]) { - const newEventListenerList = eventListeners[eventName].slice(); - for (let count = eventListeners[eventName].length - 1; count >= 0; count -= 1) { - const listener = eventListeners[eventName][count]; + const newEventListenerList = eventListeners[eventName]?.slice() || []; + if (newEventListenerList.length) { + for (let count = newEventListenerList.length - 1; count >= 0; count -= 1) { + const listener = newEventListenerList[count]; let data = eventData.data; const destroy = listener.Callback(data); if (destroy) { diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 00bf64d14..13c67172c 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 + Modified `ZoomFactor` and `IsZoomControlEnabled` options to be Windows-only options in PR[#3644](https://github.com/wailsapp/wails/pull/3644) by @levinit - Added nil check for Drag-n-Drop on Windows. Fixed by in [PR](https://github.com/wailsapp/wails/pull/3597) by @leaanthony based on the suggestion by @Alpa-1 in [#3596](https://github.com/wailsapp/wails/issues/3596). - Fixed typos in various .mdx files. [PR #3628](https://github.com/wailsapp/wails/pull/3628) by [@deining](https://github.com/deining) +- Fixed `notifyListeners()` race condition when terminated mid-emission [PR](https://github.com/wailsapp/wails/pull/3695) by [@mrf345](https://github.com/mrf345) ## v2.9.1 - 2024-06-18