[gnome-shell/wip/rstrode/login-screen-extensions: 41/134] extensionSystem: Add canChange property to extensions




commit 6ffa763897fb48297c42e18f10656b0b9bc189f5
Author: Didier Roche <didrocks ubuntu com>
Date:   Tue Dec 4 09:31:27 2018 +0100

    extensionSystem: Add canChange property to extensions
    
    Whether or not an extension can be enabled/disabled depends on various
    factors: Whether the extension is in error state, whether user extensions
    are disabled and whether the underlying GSettings keys are writable.
    
    This is complex enough to share the logic, so add it to the extension
    properties that are exposed over D-Bus.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=789852

 js/misc/extensionUtils.js |  3 ++-
 js/ui/extensionSystem.js  | 44 ++++++++++++++++++++++++++++++++++++++------
 2 files changed, 40 insertions(+), 7 deletions(-)
---
diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js
index bc9c36f4e9..025cd042e3 100644
--- a/js/misc/extensionUtils.js
+++ b/js/misc/extensionUtils.js
@@ -31,7 +31,7 @@ var ExtensionState = {
     UNINSTALLED: 99
 };
 
-const SERIALIZED_PROPERTIES = ['type', 'state', 'path', 'error', 'hasPrefs'];
+const SERIALIZED_PROPERTIES = ['type', 'state', 'path', 'error', 'hasPrefs', 'canChange'];
 
 // Maps uuid -> metadata object
 var extensions = {};
@@ -222,6 +222,7 @@ function createExtensionObject(uuid, dir, type) {
     extension.path = dir.get_path();
     extension.error = '';
     extension.hasPrefs = dir.get_child('prefs.js').query_exists(null);
+    extension.canChange = false;
 
     extensions[uuid] = extension;
 
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index 98eaf5259c..a83e53c83c 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -189,6 +189,7 @@ var ExtensionManager = class {
             }
         }
 
+        this._updateCanChange(extension);
         this.emit('extension-state-changed', extension);
     }
 
@@ -267,12 +268,28 @@ var ExtensionManager = class {
         return true;
     }
 
-    _getEnabledExtensions() {
-        let extensions;
+    _getModeExtensions() {
         if (Array.isArray(Main.sessionMode.enabledExtensions))
-            extensions = Main.sessionMode.enabledExtensions;
-        else
-            extensions = [];
+            return Main.sessionMode.enabledExtensions;
+        return [];
+    }
+
+    _updateCanChange(extension) {
+        let hasError =
+            extension.state == ExtensionState.ERROR ||
+            extension.state == ExtensionState.OUT_OF_DATE;
+
+        let isMode = this._getModeExtensions().includes(extension.uuid);
+        let modeOnly = global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY);
+
+        extension.canChange =
+            !hasError &&
+            global.settings.is_writable(ENABLED_EXTENSIONS_KEY) &&
+            (isMode || !modeOnly);
+    }
+
+    _getEnabledExtensions() {
+        let extensions = this._getModeExtensions();
 
         if (global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY))
             return extensions;
@@ -280,6 +297,11 @@ var ExtensionManager = class {
         return extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY));
     }
 
+    _onUserExtensionsEnabledChanged() {
+        this._onEnabledExtensionsChanged();
+        this._onSettingsWritableChanged();
+    }
+
     _onEnabledExtensionsChanged() {
         let newEnabledExtensions = this._getEnabledExtensions();
 
@@ -305,6 +327,14 @@ var ExtensionManager = class {
         this._enabledExtensions = newEnabledExtensions;
     }
 
+    _onSettingsWritableChanged() {
+        for (let uuid in ExtensionUtils.extensions) {
+            let extension = ExtensionUtils.extensions[uuid];
+            this._updateCanChange(extension);
+            this.emit('extension-state-changed', extension);
+        }
+    }
+
     _onVersionValidationChanged() {
         // we want to reload all extensions, but only enable
         // extensions when allowed by the sessionMode, so
@@ -325,9 +355,11 @@ var ExtensionManager = class {
         global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`,
             this._onEnabledExtensionsChanged.bind(this));
         global.settings.connect(`changed::${DISABLE_USER_EXTENSIONS_KEY}`,
-            this._onEnabledExtensionsChanged.bind(this));
+            this._onUserExtensionsEnabledChanged.bind(this));
         global.settings.connect(`changed::${EXTENSION_DISABLE_VERSION_CHECK_KEY}`,
             this._onVersionValidationChanged.bind(this));
+        global.settings.connect(`writable-changed::${ENABLED_EXTENSIONS_KEY}`,
+            this._onSettingsWritableChanged.bind(this));
 
         this._enabledExtensions = this._getEnabledExtensions();
 


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