From ad08b0426b95861bd4471140860c1632cfcc37fa Mon Sep 17 00:00:00 2001
From: Thomas Rientjes <synzvato@protonmail.com>
Date: Sat, 9 Mar 2019 09:48:02 +0100
Subject: [PATCH] Optimize environment update mechanism

---
 core/main.js          |  6 ++---
 core/state-manager.js | 61 +++++++++++++++++++++++++------------------
 2 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/core/main.js b/core/main.js
index f351f40..58283af 100644
--- a/core/main.js
+++ b/core/main.js
@@ -41,10 +41,10 @@ main._initializeSettings = function () {
             items = settingDefaults; // Restore setting defaults.
         }
 
-        if (items.blockMissing === true) {
-            stateManager.setExtensionEnvironment('staging');
+        if (items.blockMissing === true || items.enforceStaging === true) {
+            stateManager.updateEnvironment('staging');
         } else {
-            stateManager.setExtensionEnvironment('stable');
+            stateManager.updateEnvironment('stable');
         }
 
         if (items.disablePrefetch !== false) {
diff --git a/core/state-manager.js b/core/state-manager.js
index 40c6405..f5e1147 100644
--- a/core/state-manager.js
+++ b/core/state-manager.js
@@ -68,25 +68,44 @@ stateManager.registerInjection = function (tabIdentifier, injection) {
     }
 };
 
-stateManager.setExtensionEnvironment = function (environment) {
+stateManager.setEnvironment = function (environment) {
+
+    if (environment === 'stable') {
+
+        // Strike a balance between coverage and website stability.
+        files.active = files.stable;
+
+    } else if (environment === 'staging') {
+
+        // Improve coverage at the expense of website stability.
+        files.active = Object.assign({}, files.stable, files.staging);
+    }
+};
+
+stateManager.updateEnvironment = function (preferredEnvironment) {
 
     return new Promise((resolve) => {
 
-        chrome.storage.local.get(Setting.ENFORCE_STAGING, function (items) {
+        if (preferredEnvironment === 'stable') {
+
+            let requiredItems = [Setting.BLOCK_MISSING, Setting.ENFORCE_STAGING];
 
-            if (environment === 'staging' || items.enforceStaging === true) {
+            chrome.storage.local.get(requiredItems, function (items) {
 
-                // Improve coverage at the expense of website stability.
-                files.active = Object.assign({}, files.stable, files.staging);
+                if (items.blockMissing === true || items.enforceStaging === true) {
+                    stateManager.setEnvironment('staging');
+                } else {
+                    stateManager.setEnvironment('stable');
+                }
 
-            } else {
+                resolve();
+            });
 
-                // Find a balance between coverage and website stability.
-                files.active = files.stable;
-            }
+        } else if (preferredEnvironment === 'staging') {
 
+            stateManager.setEnvironment('staging');
             resolve();
-        });
+        }
     });
 };
 
@@ -186,27 +205,19 @@ stateManager._handleStorageChanged = function (changes) {
     if (Setting.BLOCK_MISSING in changes) {
 
         if (changes.blockMissing.newValue === true) {
-            stateManager.setExtensionEnvironment('staging');
+            stateManager.updateEnvironment('staging');
         } else {
-            stateManager.setExtensionEnvironment('stable');
+            stateManager.updateEnvironment('stable');
         }
     }
 
     if (Setting.ENFORCE_STAGING in changes) {
 
-        chrome.storage.local.get(Setting.BLOCK_MISSING, function (items) {
-
-            if (changes.enforceStaging.newValue === true) {
-                stateManager.setExtensionEnvironment('staging');
-            } else {
-
-                if (items.blockMissing === true) {
-                    stateManager.setExtensionEnvironment('staging');
-                } else {
-                    stateManager.setExtensionEnvironment('stable');
-                }
-            }
-        });
+        if (changes.enforceStaging.newValue === true) {
+            stateManager.updateEnvironment('staging');
+        } else {
+            stateManager.updateEnvironment('stable');
+        }
     }
 
     if (Setting.SHOW_ICON_BADGE in changes) {
-- 
GitLab