[gnome-shell] objectManager: handle proxies coming and going



commit 1ef626213952ea8568bb35ec0e96788a696d1fee
Author: Ray Strode <rstrode redhat com>
Date:   Fri Oct 7 15:40:14 2016 -0400

    objectManager: handle proxies coming and going
    
    Ever since commit b8e29ae8c78658917c8a8ddd391667d7d9e36971
    (I think), start up is littered with this message:
    
     Gjs-WARNING **: JS ERROR: could not get remote objects for service
     org.gnome.SettingsDaemon.Smartcard path
    
    since gnome-shell is now started before gnome-settings-daemon.
    
    This commit addresses the problem by making the object manager code
    not try to autostart its proxy, and instead wait for it to appear.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=772589

 js/misc/objectManager.js |   34 ++++++++++++++++++++++++++++++++--
 1 files changed, 32 insertions(+), 2 deletions(-)
---
diff --git a/js/misc/objectManager.js b/js/misc/objectManager.js
index 2252043..c1f8341 100644
--- a/js/misc/objectManager.js
+++ b/js/misc/objectManager.js
@@ -46,7 +46,7 @@ const ObjectManager = new Lang.Class({
                                                  g_interface_info: ObjectManagerInfo,
                                                  g_name: this._serviceName,
                                                  g_object_path: this._managerPath,
-                                                 g_flags: Gio.DBusProxyFlags.NONE });
+                                                 g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 
         this._interfaceInfos = {};
         this._objects = {};
@@ -65,6 +65,9 @@ const ObjectManager = new Lang.Class({
     },
 
     _tryToCompleteLoad: function() {
+        if (this._numLoadInhibitors == 0)
+            return;
+
         this._numLoadInhibitors--;
         if (this._numLoadInhibitors == 0) {
             if (this._onLoaded)
@@ -86,7 +89,7 @@ const ObjectManager = new Lang.Class({
                                        g_object_path: objectPath,
                                        g_interface_name: interfaceName,
                                        g_interface_info: info,
-                                       g_flags: Gio.DBusProxyFlags.NONE });
+                                       g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
 
         proxy.init_async(GLib.PRIORITY_DEFAULT,
                          this._cancellable,
@@ -181,6 +184,18 @@ const ObjectManager = new Lang.Class({
             return;
         }
 
+        this._managerProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
+            if (this._dbusProxy.g_name_owner)
+                this._onNameAppeared();
+            else
+                this._onNameVanished();
+        }));
+
+        if (this._dbusProxy.g_name_owner)
+            this._onNameAppeared();
+    },
+
+    _onNameAppeared: function() {
         this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
             if (!result) {
                 if (error) {
@@ -213,6 +228,21 @@ const ObjectManager = new Lang.Class({
         }));
     },
 
+    _onNameVanished: function() {
+        let objectPaths = Object.keys(this._objects);
+        for (let i = 0; i < objectPaths.length; i++) {
+            let object = this._objects[objectPaths];
+
+            let interfaceNames = Object.keys(object);
+            for (let j = 0; i < interfaceNames.length; i++) {
+                let interfaceName = interfaceNames[i];
+
+                if (object[interfaceName])
+                    this._removeInterface(objectPath, interfaceName);
+            }
+        }
+    },
+
     _registerInterfaces: function(interfaces) {
         for (let i = 0; i < interfaces.length; i++) {
             let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);


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