From df350cab0a01e19aaf831a7180eed5efe5f1bbee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 9 Jul 2023 12:47:05 +0200 Subject: [PATCH] extensionUtils: Always use manager to find current extension Now that we always have an extension manager object, we can use the same code path for use from extensions and prefs. For that, inject the D-Bus service's extensionManager instead of the current extension. Part-of: --- .../extensions/extensionPrefsDialog.js | 5 --- .../extensions/extensionsService.js | 2 ++ js/misc/extensionUtils.js | 35 ++++++------------- 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/js/dbusServices/extensions/extensionPrefsDialog.js b/js/dbusServices/extensions/extensionPrefsDialog.js index 546af60ba..f041cfd38 100644 --- a/js/dbusServices/extensions/extensionPrefsDialog.js +++ b/js/dbusServices/extensions/extensionPrefsDialog.js @@ -7,8 +7,6 @@ import GLib from 'gi://GLib'; import GObject from 'gi://GObject'; import Gtk from 'gi://Gtk?version=4.0'; -const ExtensionUtils = imports.misc.extensionUtils; - export const ExtensionPrefsDialog = GObject.registerClass({ GTypeName: 'ExtensionPrefsDialog', }, class ExtensionPrefsDialog extends Adw.PreferencesWindow { @@ -27,9 +25,6 @@ export const ExtensionPrefsDialog = GObject.registerClass({ } async _loadPrefs() { - // give extension prefs access to their own extension object - ExtensionUtils.setCurrentExtension(this._extension); - const {dir, metadata} = this._extension; const prefsJs = dir.get_child('prefs.js'); diff --git a/js/dbusServices/extensions/extensionsService.js b/js/dbusServices/extensions/extensionsService.js index 4af99f8e3..1cf922550 100644 --- a/js/dbusServices/extensions/extensionsService.js +++ b/js/dbusServices/extensions/extensionsService.js @@ -7,6 +7,7 @@ import {ExtensionPrefsDialog} from './extensionPrefsDialog.js'; import {ServiceImplementation} from './dbusService.js'; const {deserializeExtension} = imports.misc.extensionUtils; +const {setExtensionManager} = imports.misc.extensionUtils; const {loadInterfaceXML} = imports.misc.dbusUtils; const ExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions'); @@ -27,6 +28,7 @@ class ExtensionManager { } const extensionManager = new ExtensionManager(); +setExtensionManager(extensionManager); export const ExtensionsService = class extends ServiceImplementation { constructor() { diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js index f04d2a06b..9642734d6 100644 --- a/js/misc/extensionUtils.js +++ b/js/misc/extensionUtils.js @@ -2,7 +2,7 @@ /* exported ExtensionState, ExtensionType, getCurrentExtension, getSettings, initTranslations, gettext, ngettext, pgettext, openPrefs, isOutOfDate, serializeExtension, - deserializeExtension, setCurrentExtension */ + deserializeExtension, setExtensionManager */ // Common utils for the extension system and the extension // preferences tool @@ -14,18 +14,7 @@ const Gettext = imports.gettext; const Config = imports.misc.config; -let Main = null; - -try { - Main = imports.ui.main; -} catch (error) { - // Only log the error if it is not due to the - // missing import. - if (error?.name !== 'ImportError') - console.error(error); -} - -let _extension = null; +let _extensionManager = null; var ExtensionType = { SYSTEM: 1, @@ -58,13 +47,13 @@ const SERIALIZED_PROPERTIES = [ ]; /** - * @param {object} extension the extension object to use in utilities like `initTranslations()` + * @param {object} extensionManager to use in utilities like `initTranslations()` */ -function setCurrentExtension(extension) { - if (Main) - throw new Error('setCurrentExtension() can only be called from outside the shell'); +function setExtensionManager(extensionManager) { + if (_extensionManager) + throw new Error('Trying to override existing extension manager'); - _extension = extension; + _extensionManager = extensionManager; } /** @@ -74,9 +63,6 @@ function setCurrentExtension(extension) { * an extension. */ function getCurrentExtension() { - if (_extension) - return _extension; - const basePath = '/gnome-shell/extensions/'; // Search for an occurrence of an extension stack frame @@ -89,8 +75,9 @@ function getCurrentExtension() { return null; // local import, as the module is used from outside the gnome-shell process - // as well (not this function though) - let extensionManager = imports.ui.main.extensionManager; + // as well + if (!_extensionManager) + setExtensionManager(imports.ui.main.extensionManager); // The exact stack line differs depending on where the function // was called (function or module scope), and whether it's called @@ -106,7 +93,7 @@ function getCurrentExtension() { path = GLib.path_get_dirname(path); const dirName = GLib.path_get_basename(path); - const extension = extensionManager.lookup(dirName); + const extension = _extensionManager.lookup(dirName); if (extension !== undefined) return extension; } while (path !== '/');