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



commit 059650485753e4ffd7c7621d630def4d8a8c7411
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 | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 60322f81a..258add8fd 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));
@@ -388,6 +394,8 @@ var AllView = class AllView extends BaseAppView {
         let favoritesWritable = global.settings.is_writable('favorite-apps');
 
         apps.forEach(appId => {
+            if (this.hasItem(appId))
+                return;
             let app = appSys.lookup_app(appId);
 
             let icon = new AppIcon(app,
@@ -1150,6 +1158,8 @@ var FolderIcon = class FolderIcon {
         let excludedApps = this._folder.get_strv('excluded-apps');
         let appSys = Shell.AppSystem.get_default();
         let addAppId = appId => {
+            if (this.hasItem(appId))
+                return;
             if (excludedApps.includes(appId))
                 return;
 


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