[gnome-shell] extensionSystem: Always disable multiple extensions in reverse order
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] extensionSystem: Always disable multiple extensions in reverse order
- Date: Thu, 12 Sep 2019 10:34:00 +0000 (UTC)
commit bdcf3037ca2511118234c7d49001ceccbf4ef6f0
Author: Jonas Dreßler <verdre v0yd nl>
Date: Mon Nov 19 12:26:16 2018 +0100
extensionSystem: Always disable multiple extensions in reverse order
Since disabling an extension will lead to disabling and re-enabling all
following extensions in the list, always disable multiple extensions by
looping through the list in reverse order.
This lowers the execution time of the event handlers quite a bit if many
extensions are installed.
Thanks to Philippe Troin for identifying the problem and proposing the
initial patch to change the extension order when reloading.
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/177
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/96
js/ui/extensionSystem.js | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
---
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index 714537b5d2..7fe275ec7b 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -400,9 +400,9 @@ var ExtensionManager = class {
// Find and disable all the newly disabled extensions: UUIDs found in the
// old setting, but not in the new one.
- this._enabledExtensions.filter(
- item => !newEnabledExtensions.includes(item)
- ).forEach(uuid => {
+ this._extensionOrder.filter(
+ uuid => !newEnabledExtensions.includes(uuid)
+ ).reverse().forEach(uuid => {
this._callExtensionDisable(uuid);
});
@@ -417,20 +417,19 @@ var ExtensionManager = class {
}
_onVersionValidationChanged() {
- // we want to reload all extensions, but only enable
- // extensions when allowed by the sessionMode, so
- // temporarily disable them all
- this._enabledExtensions = [];
-
- // The loop modifies the extensions map, so iterate over a copy
- let extensions = [...this._extensions.values()];
- for (let extension of extensions)
- this.reloadExtension(extension);
- this._enabledExtensions = this._getEnabledExtensions();
+ // Disabling extensions modifies the order array, so use a copy
+ let extensionOrder = this._extensionOrder.slice();
- this._enabledExtensions.forEach(uuid => {
- this._callExtensionEnable(uuid);
+ // Disable enabled extensions in the reverse order first to avoid
+ // the "rebasing" done in _callExtensionDisable...
+ extensionOrder.slice().reverse().forEach(uuid => {
+ this._callExtensionDisable(uuid);
});
+
+ // ...and then reload and enable extensions in the correct order again.
+ [...this._extensions.values()].sort((a, b) => {
+ return extensionOrder.indexOf(a.uuid) - extensionOrder.indexOf(b.uuid);
+ }).forEach(extension => this.reloadExtension(extension));
}
_loadExtensions() {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]