[gnome-shell/wip/appdisplay-leak: 1/8] appDisplay: don't leak duplicate items in AppView



commit 2ad1d11ad8950f570d577b830c7d90a948355463
Author: Ray Strode <rstrode redhat com>
Date:   Mon Jul 15 13:52:58 2019 -0400

    appDisplay: don't leak duplicate items in AppView
    
    If an icon already exists in an app view with the same id, the
    duplicate is not added on a call to addItem.  Unfortunately,
    since it's not added, the icon actor gets orphaned and leaked.
    
    This commit address the problem by introducing a new hasItem
    method and disallowing callers to call addItem with a duplicate
    in the first place.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628

 js/ui/appDisplay.js | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 60322f81a..dd9bb19b9 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -128,10 +128,14 @@ class BaseAppView {
         return this._allItems;
     }
 
+    hasItem(id) {
+        return this._items[id] !== undefined;
+    }
+
     addItem(icon) {
         let id = icon.id;
-        if (this._items[id] !== undefined)
-            return;
+       if (this.hasItem(id))
+            throw new Error(`icon with id ${id} already added to view`)
 
         this._allItems.push(icon);
         this._items[id] = icon;
@@ -371,6 +375,8 @@ var AllView = class AllView extends BaseAppView {
 
         let folders = this._folderSettings.get_strv('folder-children');
         folders.forEach(id => {
+            if (this.hasItem(id))
+                return;
             let path = this._folderSettings.path + 'folders/' + id + '/';
             let icon = new FolderIcon(id, path, this);
             icon.connect('name-changed', this._itemNameChanged.bind(this));
@@ -1150,6 +1156,9 @@ var FolderIcon = class FolderIcon {
         let excludedApps = this._folder.get_strv('excluded-apps');
         let appSys = Shell.AppSystem.get_default();
         let addAppId = appId => {
+            if (this.view.hasItem(appId))
+                return;
+
             if (excludedApps.includes(appId))
                 return;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]