From c69e195441a691429d7b0e16f81e80ff062f1590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sat, 31 Aug 2019 23:40:52 +0200 Subject: [PATCH] search: Remove updateSearch later on destruction When the GridSearchBase actor is destroyed we should remove the ongoing later that might try to access to invalid resources. To do this, add an _onDestroy() callback function to SearchResultsBase and override it in GridSearchBase. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/700 --- js/ui/search.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/js/ui/search.js b/js/ui/search.js index d55021ac9..d4de5ece2 100644 --- a/js/ui/search.js +++ b/js/ui/search.js @@ -158,10 +158,15 @@ var SearchResultsBase = class { this._clipboard = St.Clipboard.get_default(); this._cancellable = new Gio.Cancellable(); + + this.actor.connect('destroy', this._onDestroy.bind(this)); } destroy() { this.actor.destroy(); + } + + _onDestroy() { this._terms = []; } @@ -341,14 +346,30 @@ var GridSearchResults = class extends SearchResultsBase { this._resultDisplayBin.set_child(this._bin); } + _onDestroy() { + if (this._updateSearchLater) { + Meta.later_remove(this._updateSearchLater); + delete this._updateSearchLater; + } + + super._onDestroy(); + } + updateSearch(...args) { if (this._notifyAllocationId) this.actor.disconnect(this._notifyAllocationId); + if (this._updateSearchLater) { + Meta.later_remove(this._updateSearchLater); + delete this._updateSearchLater; + } // Make sure the maximum number of results calculated by // _getMaxDisplayedResults() is updated after width changes. this._notifyAllocationId = this.actor.connect('notify::allocation', () => { - Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + if (this._updateSearchLater) + return; + this._updateSearchLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { + delete this._updateSearchLater; super.updateSearch(...args); return GLib.SOURCE_REMOVE; });