From 3b4e3af6fad277705eba03b3c47dbc9503ef51a8 Mon Sep 17 00:00:00 2001 From: Sundeep Mediratta Date: Wed, 11 Oct 2023 06:31:19 -0400 Subject: [PATCH] extensionSystem: Sort extensions before loading When an extension is disabled, we "rebase" all extensions that were enabled afterwards, in case they override the same method. This can be fairly expensive, in particular when disabling many extensions at once, for instance when locking the screen. Help with that by sorting extensions by the number of session-modes, as extensions that support multiple modes are less likely to be disabled on session mode changes. Part-of: --- js/ui/extensionSystem.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js index 3592e5b3a..a03d0f10f 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js @@ -583,6 +583,8 @@ export class ExtensionManager extends Signals.EventEmitter { if (!global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY)) extensions = extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY)); + extensions.sort((a, b) => this._compareExtensions(this.lookup(a), this.lookup(b))); + // filter out 'disabled-extensions' which takes precedence let disabledExtensions = global.settings.get_strv(DISABLED_EXTENSIONS_KEY); return extensions.filter(item => !disabledExtensions.includes(item)); @@ -700,6 +702,12 @@ export class ExtensionManager extends Signals.EventEmitter { } } + _compareExtensions(a, b) { + const modesA = a?.sessionModes ?? []; + const modesB = b?.sessionModes ?? []; + return modesB.length - modesA.length; + } + async _loadExtensions() { global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`, () => { this._onEnabledExtensionsChanged(); @@ -748,7 +756,7 @@ export class ExtensionManager extends Signals.EventEmitter { } return extension; - }).filter(extension => extension !== null); + }).filter(extension => extension !== null).sort(this._compareExtensions.bind(this)); // after updating to a new major version, // update extensions before loading them