Blame SOURCES/0002-extensionSystem-Get-rid-of-_enabled-boolean-optimiza.patch

e45623
From b70cf463e08bff43b242b851fc7c79244f54e76b Mon Sep 17 00:00:00 2001
e45623
From: Ray Strode <rstrode@redhat.com>
e45623
Date: Tue, 10 Aug 2021 13:25:57 -0400
e45623
Subject: [PATCH 2/4] extensionSystem: Get rid of _enabled boolean optimization
e45623
e45623
At the moment a session mode either allows extensions or it doesn't.
e45623
If it allows extensions, then the entire available list of
e45623
configured extensions get enabled as soon as the session mode is
e45623
entered.
e45623
e45623
Since enabling or disabling extensions is an all or nothing situation,
e45623
the code tracks whether extensions are already enabled when entering
e45623
the session mode, and if so, avoids iterating through the extension list
e45623
needlessly. It does this using a boolean named _enabled.
e45623
e45623
In the future, the extensions themselves will be given some say on
e45623
whether or not they should be enabled in a given session mode. This
e45623
means, the configured extension list may contain extensions that
e45623
shouldn't be enabled for a given session mode, and the _enabled boolean
e45623
will no longer be appropriated.
e45623
e45623
This commit drops the _enabled boolean optimization.
e45623
---
e45623
 js/ui/extensionSystem.js | 13 -------------
e45623
 1 file changed, 13 deletions(-)
e45623
e45623
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
e45623
index 77929f2a6..05630ed54 100644
e45623
--- a/js/ui/extensionSystem.js
e45623
+++ b/js/ui/extensionSystem.js
e45623
@@ -1,53 +1,52 @@
e45623
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
e45623
 
e45623
 const { GLib, Gio, GObject, St } = imports.gi;
e45623
 const Signals = imports.signals;
e45623
 
e45623
 const ExtensionDownloader = imports.ui.extensionDownloader;
e45623
 const ExtensionUtils = imports.misc.extensionUtils;
e45623
 const FileUtils = imports.misc.fileUtils;
e45623
 const Main = imports.ui.main;
e45623
 const MessageTray = imports.ui.messageTray;
e45623
 
e45623
 const { ExtensionState, ExtensionType } = ExtensionUtils;
e45623
 
e45623
 const ENABLED_EXTENSIONS_KEY = 'enabled-extensions';
e45623
 const DISABLE_USER_EXTENSIONS_KEY = 'disable-user-extensions';
e45623
 const EXTENSION_DISABLE_VERSION_CHECK_KEY = 'disable-extension-version-validation';
e45623
 
e45623
 const UPDATE_CHECK_TIMEOUT = 24 * 60 * 60; // 1 day in seconds
e45623
 
e45623
 var ExtensionManager = class {
e45623
     constructor() {
e45623
         this._initted = false;
e45623
-        this._enabled = false;
e45623
         this._updateNotified = false;
e45623
 
e45623
         this._extensions = new Map();
e45623
         this._enabledExtensions = [];
e45623
         this._extensionOrder = [];
e45623
 
e45623
         Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
e45623
     }
e45623
 
e45623
     init() {
e45623
         this._installExtensionUpdates();
e45623
         this._sessionUpdated();
e45623
 
e45623
         GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, UPDATE_CHECK_TIMEOUT, () => {
e45623
             ExtensionDownloader.checkForUpdates();
e45623
             return GLib.SOURCE_CONTINUE;
e45623
         });
e45623
         ExtensionDownloader.checkForUpdates();
e45623
     }
e45623
 
e45623
     lookup(uuid) {
e45623
         return this._extensions.get(uuid);
e45623
     }
e45623
 
e45623
     getUuids() {
e45623
         return [...this._extensions.keys()];
e45623
     }
e45623
 
e45623
     _callExtensionDisable(uuid) {
e45623
         let extension = this.lookup(uuid);
e45623
@@ -375,63 +374,60 @@ var ExtensionManager = class {
e45623
         let hasError =
e45623
             extension.state == ExtensionState.ERROR ||
e45623
             extension.state == ExtensionState.OUT_OF_DATE;
e45623
 
e45623
         let isMode = this._getModeExtensions().includes(extension.uuid);
e45623
         let modeOnly = global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY);
e45623
 
e45623
         extension.canChange =
e45623
             !hasError &&
e45623
             global.settings.is_writable(ENABLED_EXTENSIONS_KEY) &&
e45623
             (isMode || !modeOnly);
e45623
     }
e45623
 
e45623
     _getEnabledExtensions() {
e45623
         let extensions = this._getModeExtensions();
e45623
 
e45623
         if (global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY))
e45623
             return extensions;
e45623
 
e45623
         return extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY));
e45623
     }
e45623
 
e45623
     _onUserExtensionsEnabledChanged() {
e45623
         this._onEnabledExtensionsChanged();
e45623
         this._onSettingsWritableChanged();
e45623
     }
e45623
 
e45623
     _onEnabledExtensionsChanged() {
e45623
         let newEnabledExtensions = this._getEnabledExtensions();
e45623
 
e45623
-        if (!this._enabled)
e45623
-            return;
e45623
-
e45623
         // Find and enable all the newly enabled extensions: UUIDs found in the
e45623
         // new setting, but not in the old one.
e45623
         newEnabledExtensions.filter(
e45623
             uuid => !this._enabledExtensions.includes(uuid)
e45623
         ).forEach(uuid => {
e45623
             this._callExtensionEnable(uuid);
e45623
         });
e45623
 
e45623
         // Find and disable all the newly disabled extensions: UUIDs found in the
e45623
         // old setting, but not in the new one.
e45623
         this._enabledExtensions.filter(
e45623
             item => !newEnabledExtensions.includes(item)
e45623
         ).forEach(uuid => {
e45623
             this._callExtensionDisable(uuid);
e45623
         });
e45623
 
e45623
         this._enabledExtensions = newEnabledExtensions;
e45623
     }
e45623
 
e45623
     _onSettingsWritableChanged() {
e45623
         for (let extension of this._extensions.values()) {
e45623
             this._updateCanChange(extension);
e45623
             this.emit('extension-state-changed', extension);
e45623
         }
e45623
     }
e45623
 
e45623
     _onVersionValidationChanged() {
e45623
         // we want to reload all extensions, but only enable
e45623
         // extensions when allowed by the sessionMode, so
e45623
         // temporarily disable them all
e45623
@@ -482,85 +478,76 @@ var ExtensionManager = class {
e45623
 
e45623
         this._enabledExtensions = this._getEnabledExtensions();
e45623
 
e45623
         let perUserDir = Gio.File.new_for_path(global.userdatadir);
e45623
         FileUtils.collectFromDatadirs('extensions', true, (dir, info) => {
e45623
             let fileType = info.get_file_type();
e45623
             if (fileType != Gio.FileType.DIRECTORY)
e45623
                 return;
e45623
             let uuid = info.get_name();
e45623
             let existing = this.lookup(uuid);
e45623
             if (existing) {
e45623
                 log(`Extension ${uuid} already installed in ${existing.path}. ${dir.get_path()} will not be loaded`);
e45623
                 return;
e45623
             }
e45623
 
e45623
             let extension;
e45623
             let type = dir.has_prefix(perUserDir)
e45623
                 ? ExtensionType.PER_USER
e45623
                 : ExtensionType.SYSTEM;
e45623
             try {
e45623
                 extension = this.createExtensionObject(uuid, dir, type);
e45623
             } catch (e) {
e45623
                 logError(e, `Could not load extension ${uuid}`);
e45623
                 return;
e45623
             }
e45623
             this.loadExtension(extension);
e45623
         });
e45623
     }
e45623
 
e45623
     _enableAllExtensions() {
e45623
-        if (this._enabled)
e45623
-            return;
e45623
-
e45623
         if (!this._initted) {
e45623
             this._loadExtensions();
e45623
             this._initted = true;
e45623
         } else {
e45623
             this._enabledExtensions.forEach(uuid => {
e45623
                 this._callExtensionEnable(uuid);
e45623
             });
e45623
         }
e45623
-        this._enabled = true;
e45623
     }
e45623
 
e45623
     _disableAllExtensions() {
e45623
-        if (!this._enabled)
e45623
-            return;
e45623
-
e45623
         if (this._initted) {
e45623
             this._extensionOrder.slice().reverse().forEach(uuid => {
e45623
                 this._callExtensionDisable(uuid);
e45623
             });
e45623
         }
e45623
-
e45623
-        this._enabled = false;
e45623
     }
e45623
 
e45623
     _sessionUpdated() {
e45623
         // For now sessionMode.allowExtensions controls extensions from both the
e45623
         // 'enabled-extensions' preference and the sessionMode.enabledExtensions
e45623
         // property; it might make sense to make enabledExtensions independent
e45623
         // from allowExtensions in the future
e45623
         if (Main.sessionMode.allowExtensions) {
e45623
             // Take care of added or removed sessionMode extensions
e45623
             this._onEnabledExtensionsChanged();
e45623
             this._enableAllExtensions();
e45623
         } else {
e45623
             this._disableAllExtensions();
e45623
         }
e45623
     }
e45623
 };
e45623
 Signals.addSignalMethods(ExtensionManager.prototype);
e45623
 
e45623
 class ExtensionUpdateSource extends MessageTray.Source {
e45623
     constructor() {
e45623
         const appSys = Shell.AppSystem.get_default();
e45623
         this._app = appSys.lookup_app('gnome-shell-extension-prefs.desktop');
e45623
 
e45623
         super(this._app.get_name());
e45623
     }
e45623
 
e45623
     getIcon() {
e45623
         return this._app.app_info.get_icon();
e45623
     }
e45623
 
e45623
-- 
e45623
2.27.0
e45623