[gnome-shell] extensionSystem: Add methods to enable/disable extensions



commit 4589da957b30e9b3e99075782ab3253bce790ebb
Author: Didier Roche <didrocks ubuntu com>
Date:   Wed Jan 17 13:43:11 2018 +0100

    extensionSystem: Add methods to enable/disable extensions
    
    Extensions are currently enabled or disabled by directly changing the
    list in the 'enabled-extensions' GSettings key. As we will soon add
    an overriding 'disabled-extensions' key as well, it makes sense to
    offer explicit API for enabling/disabling to avoid duplicating the
    logic.
    
    For the corresponding D-Bus API, the methods were even mentioned in
    the GSettings schema, albeit unimplemented until now.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=789852

 .../dbus-interfaces/org.gnome.Shell.Extensions.xml | 24 ++++++++++++++++++++
 js/ui/extensionDownloader.js                       | 10 ++-------
 js/ui/extensionSystem.js                           | 26 ++++++++++++++++++++++
 js/ui/shellDBus.js                                 |  8 +++++++
 4 files changed, 60 insertions(+), 8 deletions(-)
---
diff --git a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml 
b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
index 34a65af44..309a9f207 100644
--- a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
+++ b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml
@@ -173,6 +173,30 @@
       <arg type="s" direction="in" name="uuid"/>
     </method>
 
+    <!--
+        EnableExtension:
+        @uuid: The UUID of the extension
+        @success: Whether the operation was successful
+
+        Enable an extension.
+    -->
+    <method name="EnableExtension"> \
+      <arg type="s" direction="in" name="uuid"/> \
+      <arg type="b" direction="out" name="success"/> \
+    </method> \
+
+    <!--
+        DisableExtension:
+        @uuid: The UUID of the extension
+        @success: Whether the operation was successful
+
+        Disable an extension.
+    -->
+    <method name="DisableExtension"> \
+      <arg type="s" direction="in" name="uuid"/> \
+      <arg type="b" direction="out" name="success"/> \
+    </method> \
+
     <!--
         LaunchExtensionPrefs:
         @uuid: The UUID of the extension
diff --git a/js/ui/extensionDownloader.js b/js/ui/extensionDownloader.js
index 25027a3aa..aa5d7b94d 100644
--- a/js/ui/extensionDownloader.js
+++ b/js/ui/extensionDownloader.js
@@ -5,7 +5,6 @@ const { Clutter, Gio, GLib, GObject, Soup } = imports.gi;
 const Config = imports.misc.config;
 const Dialog = imports.ui.dialog;
 const ExtensionUtils = imports.misc.extensionUtils;
-const ExtensionSystem = imports.ui.extensionSystem;
 const FileUtils = imports.misc.fileUtils;
 const Main = imports.ui.main;
 const ModalDialog = imports.ui.modalDialog;
@@ -225,16 +224,11 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
         }
 
         function callback() {
-            // Add extension to 'enabled-extensions' for the user, always...
-            let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
-            if (!enabledExtensions.includes(uuid)) {
-                enabledExtensions.push(uuid);
-                global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
-            }
-
             try {
                 let extension = ExtensionUtils.createExtensionObject(uuid, dir, 
ExtensionUtils.ExtensionType.PER_USER);
                 Main.extensionManager.loadExtension(extension);
+                if (!Main.extensionManager.enableExtension(uuid))
+                    throw new Error(`Cannot add ${uuid} to enabled extensions gsettings key`);
             } catch (e) {
                 uninstallExtension(uuid);
                 errback('LoadExtensionError', e);
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index a16aa22f0..0b22783cc 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -126,6 +126,32 @@ var ExtensionManager = class {
         }
     }
 
+    enableExtension(uuid) {
+        if (!ExtensionUtils.extensions[uuid])
+            return false;
+
+        let enabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY);
+        if (!enabledExtensions.includes(uuid)) {
+            enabledExtensions.push(uuid);
+            global.settings.set_strv(ENABLED_EXTENSIONS_KEY, enabledExtensions);
+        }
+
+        return true;
+    }
+
+    disableExtension(uuid) {
+        if (!ExtensionUtils.extensions[uuid])
+            return false;
+
+        let enabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY);
+        if (enabledExtensions.includes(uuid)) {
+            enabledExtensions = enabledExtensions.filter(item => item !== uuid);
+            global.settings.set_strv(ENABLED_EXTENSIONS_KEY, enabledExtensions);
+        }
+
+        return true;
+    }
+
     logExtensionError(uuid, error) {
         let extension = ExtensionUtils.extensions[uuid];
         if (!extension)
diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js
index 7976eeaae..fad3cf0a2 100644
--- a/js/ui/shellDBus.js
+++ b/js/ui/shellDBus.js
@@ -320,6 +320,14 @@ var GnomeShellExtensions = class {
         return ExtensionDownloader.uninstallExtension(uuid);
     }
 
+    EnableExtension(uuid) {
+        return Main.extensionManager.enableExtension(uuid);
+    }
+
+    DisableExtension(uuid) {
+        return Main.extensionManager.disableExtension(uuid);
+    }
+
     LaunchExtensionPrefs(uuid) {
         let appSys = Shell.AppSystem.get_default();
         let app = appSys.lookup_app('gnome-shell-extension-prefs.desktop');


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