diff --git a/js/misc/signalTracker.js b/js/misc/signalTracker.js index c72abd265..3b71fbc59 100644 --- a/js/misc/signalTracker.js +++ b/js/misc/signalTracker.js @@ -65,6 +65,14 @@ class SignalManager { maybeGetSignalTracker(obj) { return this._signalTrackers.get(obj) ?? null; } + + /* + * @param {Object} obj - object to remove signal tracker for + * @returns {void} + */ + removeSignalTracker(obj) { + this._signalTrackers.delete(obj); + } } class SignalTracker { @@ -124,6 +132,16 @@ class SignalTracker { this._disconnectSignalForProto(this._getObjectProto(obj), obj, id); } + _removeTracker() { + if (this._ownerDestroyId) + this._disconnectSignal(this._owner, this._ownerDestroyId); + + SignalManager.getDefault().removeSignalTracker(this._owner); + + delete this._ownerDestroyId; + delete this._owner; + } + /** * @param {Object} obj - tracked object * @param {...number} handlerIds - tracked handler IDs @@ -149,6 +167,9 @@ class SignalTracker { this._disconnectSignalForProto(ownerProto, this._owner, id)); if (destroyId) this._disconnectSignal(obj, destroyId); + + if (this._map.size === 0) + this._removeTracker(); } /** @@ -163,12 +184,7 @@ class SignalTracker { */ destroy() { this.clear(); - - if (this._ownerDestroyId) - this._disconnectSignal(this._owner, this._ownerDestroyId); - - delete this._ownerDestroyId; - delete this._owner; + this._removeTracker(); } }