From 54ee728aa088f12cfb67e006cf75d9bbe5964b7a Mon Sep 17 00:00:00 2001 From: Sebastian Keller Date: Mon, 29 Aug 2022 04:19:28 +0200 Subject: [PATCH] signalTracker: Don't try to create a new SignalTracker for disconnecting After the next commit, when some classes, such as PopupMenuManager try to disconnect via a destroy handler, the SignalTracker might have already been destroyed, so trying to get it from the SignalManager will cause it to create a new one, which will then try to connect to the destroy signal of the already destroyed object. This could for example be triggered by changing backgrounds. Fix this by not doing anything in disconnectObject if there is no SignalTracker for that object. Part-of: --- js/misc/signalTracker.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/js/misc/signalTracker.js b/js/misc/signalTracker.js index 1c3f4f9df..c72abd265 100644 --- a/js/misc/signalTracker.js +++ b/js/misc/signalTracker.js @@ -57,6 +57,14 @@ class SignalManager { } return signalTracker; } + + /** + * @param {Object} obj - object to get signal tracker for + * @returns {?SignalTracker} - the signal tracker for object if it exists + */ + maybeGetSignalTracker(obj) { + return this._signalTrackers.get(obj) ?? null; + } } class SignalTracker { @@ -225,7 +233,7 @@ function connectObject(thisObj, ...args) { * @returns {void} */ function disconnectObject(thisObj, obj) { - SignalManager.getDefault().getSignalTracker(thisObj).untrack(obj); + SignalManager.getDefault().maybeGetSignalTracker(thisObj)?.untrack(obj); } /**