about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/assets/javascripts/services.js134
-rw-r--r--src/pages/background/background.js8
-rw-r--r--src/pages/options_src/General/SettingsButtons.svelte28
-rw-r--r--src/pages/options_src/Services/Services.svelte2
-rw-r--r--src/pages/popup_src/App.svelte2
5 files changed, 76 insertions, 98 deletions
diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js
index 417f66c3..9b6ef325 100644
--- a/src/assets/javascripts/services.js
+++ b/src/assets/javascripts/services.js
@@ -831,99 +831,86 @@ const defaultInstances = {
   ytify: ["https://ytify.netlify.app"],
 }
 
+async function getDefaults() {
+  let config = await utils.getConfig()
+  let options = {}
+  for (const service in config.services) {
+    options[service] = {}
+    for (const defaultOption in config.services[service].options) {
+      options[service][defaultOption] = config.services[service].options[defaultOption]
+    }
+    for (const frontend in config.services[service].frontends) {
+      if (config.services[service].frontends[frontend].instanceList) {
+        options[frontend] = []
+      }
+    }
+  }
+  options.exceptions = {
+    url: [],
+    regex: [],
+  }
+  options.theme = "detect"
+  options.popupServices = ["youtube", "tiktok", "imgur", "reddit", "quora", "translate", "maps"]
+  options.fetchInstances = "github"
+  options.redirectOnlyInIncognito = false
+  options = { ...options, ...defaultInstances }
+  return options
+}
+
 function initDefaults() {
   return new Promise(resolve => {
     browser.storage.local.clear(async () => {
-      let config = await utils.getConfig()
-      let options = {}
-      for (const service in config.services) {
-        options[service] = {}
-        for (const defaultOption in config.services[service].options) {
-          options[service][defaultOption] = config.services[service].options[defaultOption]
-        }
-        for (const frontend in config.services[service].frontends) {
-          if (config.services[service].frontends[frontend].instanceList) {
-            options[frontend] = []
-          }
-        }
-      }
-      options.exceptions = {
-        url: [],
-        regex: [],
-      }
-      options.theme = "detect"
-      options.popupServices = ["youtube", "tiktok", "imgur", "reddit", "quora", "translate", "maps"]
-      options.fetchInstances = "github"
-      options.redirectOnlyInIncognito = false
-
-      options = { ...options, ...defaultInstances }
-
+      options = await getDefaults()
       browser.storage.local.set({ options }, () => resolve())
     })
   })
 }
 
-function upgradeOptions() {
-  return new Promise(async resolve => {
-    let options = await utils.getOptions()
-
-    browser.storage.local.clear(() => {
-      browser.storage.local.set({ options }, () => {
-        resolve()
-      })
-    })
-  })
-}
-
-function processUpdate() {
+function processUpdate(_options) {
   return new Promise(async resolve => {
-    let frontends = []
     const config = await utils.getConfig()
-    let options = await utils.getOptions()
-    for (const service in config.services) {
-      if (!options[service]) options[service] = {}
+    let options = _options ?? await utils.getOptions()
 
-      if (!(options[service].frontend in config.services[service].frontends)) {
-        options[service] = config.services[service].options // Reset settings for service
-        delete options[options[service].frontend] // Remove deprecated frontend
-      }
+    const defaults = await getDefaults()
 
-      for (const defaultOption in config.services[service].options) {
-        if (!(defaultOption in options[service])) {
-          options[service][defaultOption] = config.services[service].options[defaultOption]
+    // Remove any unknown option or subOption
+    for (const optionName in options) {
+      if (!(optionName in defaults)) delete options[optionName]
+      else if (typeof optionName === 'object' && optionName !== null) {
+        for (const subOptionName in options[optionName]) {
+          if (!(subOptionName in defaults[optionName])) delete options[optionName][subOptionName]
         }
       }
+    }
+
+    // Remove any unknwon popupService
+    options.popupServices = options.popupServices.filter(service => service in config.services)
+
+    // Add missing options
+    for (const [defaultName, defaultValue] of Object.entries(defaults)) {
+      if (!(defaultName in options)) {
+        options[defaultName] = defaultValue
+      }
+    }
 
-      for (const frontend in config.services[service].frontends) {
-        frontends.push(frontend)
-        if (!(frontend in options) && config.services[service].frontends[frontend].instanceList) {
-          options[frontend] = defaultInstances[frontend] || []
-        }
+    for (const [serviceName, serviceValue] of Object.entries(config.services)) {
+      // Reset service options if selected frontend is deprecated
+      if (!(options[serviceName].frontend in serviceValue.frontends)) {
+        options[serviceName] = serviceValue.options
       }
 
-      for (const frontend of options.popupServices) {
-        if (!Object.keys(config.services).includes(frontend)) {
-          const i = options.popupServices.indexOf(frontend)
-          if (i > -1) options.popupServices.splice(i, 1)
+      // Add a default service option if it's not present
+      for (const optionName in serviceValue.options) {
+        if (!(optionName in options[serviceName])) {
+          options[serviceName][optionName] = serviceValue.options[optionName]
         }
       }
     }
-    const general = ["theme", "popupServices", "fetchInstances", "redirectOnlyInIncognito"]
-    const combined = [
-      ...Object.keys(config.services),
-      ...frontends,
-      ...general,
-      "exceptions",
-      "popupServices",
-      "version",
-    ]
-    for (const key in options) {
-      if (combined.indexOf(key) < 0) {
-        delete options[key] // Remove any unknown settings in options
-      }
-    }
-    browser.storage.local.set({ options }, () => {
-      resolve()
+
+    browser.storage.local.clear(() => {
+      browser.storage.local.set({ options }, () => {
+        resolve(options)
+      })
     })
   })
 }
@@ -973,7 +960,6 @@ export default {
   computeService,
   reverse,
   initDefaults,
-  upgradeOptions,
   processUpdate,
   copyRaw,
   switchInstance,
diff --git a/src/pages/background/background.js b/src/pages/background/background.js
index d42e5027..576365bd 100644
--- a/src/pages/background/background.js
+++ b/src/pages/background/background.js
@@ -13,14 +13,8 @@ browser.runtime.onInstalled.addListener(async details => {
       if (!(await utils.getOptions())) {
         await servicesHelper.initDefaults()
       }
-      browser.runtime.openOptionsPage()
     } else if (details.reason == "update") {
-      if (details.previousVersion == "2.5.2") {
-        await servicesHelper.upgradeOptions()
-        await servicesHelper.processUpdate()
-      } else {
-        await servicesHelper.processUpdate()
-      }
+      await servicesHelper.processUpdate()
     }
   }
 })
diff --git a/src/pages/options_src/General/SettingsButtons.svelte b/src/pages/options_src/General/SettingsButtons.svelte
index 2f574199..29b756d2 100644
--- a/src/pages/options_src/General/SettingsButtons.svelte
+++ b/src/pages/options_src/General/SettingsButtons.svelte
@@ -20,14 +20,12 @@
     const reader = new FileReader()
     reader.readAsText(importSettingsFiles[0])
     reader.onload = async () => {
-      const data = JSON.parse(reader.result)
-      if ("theme" in data && data.version == browser.runtime.getManifest().version) {
-        browser.storage.local.clear(async () => {
-          options.set(data)
-        })
-      } else {
-        alert("Incompatible settings")
+      let data = JSON.parse(reader.result)
+      if (data.version != browser.runtime.getManifest().version) {
+        alert("Importing from a previous version. Be careful")
       }
+      data = await servicesHelper.processUpdate(data)
+      options.set(data)
     }
     reader.onerror = error => {
       console.log("error", error)
@@ -51,20 +49,20 @@
   }
 
   async function importSettingsSync() {
-    browser.storage.sync.get({ options }, r => {
-      const optionsSync = r.options
-      if (optionsSync.version == browser.runtime.getManifest().version) {
-        options.set(optionsSync)
-      } else {
-        alert("Error")
+    browser.storage.sync.get({ options }, async r => {
+      let data = r.options
+      if (data.version != browser.runtime.getManifest().version) {
+        alert("Importing from a previous version. Be careful")
       }
+      data = await servicesHelper.processUpdate(data)
+      options.set(data)
     })
   }
 
   async function resetSettings() {
     browser.storage.local.clear(async () => {
-      await servicesHelper.initDefaults()
-      options.set(await utils.getOptions())
+      const data = await servicesHelper.initDefaults()
+      options.set(data)
     })
   }
 </script>
diff --git a/src/pages/options_src/Services/Services.svelte b/src/pages/options_src/Services/Services.svelte
index 481afb83..6b16e824 100644
--- a/src/pages/options_src/Services/Services.svelte
+++ b/src/pages/options_src/Services/Services.svelte
@@ -72,7 +72,7 @@
             <ServiceIcon details={selection} />
             {selection.label}
           {:else}
-            {browser.i18n.getMessage("search_service") || "Search Service"}
+            {browser.i18n.getMessage("searchService") || "Search Service"}
           {/if}
         </div>
         <div style="font-size: 10px;" slot="chevron-icon">🮦</div>
diff --git a/src/pages/popup_src/App.svelte b/src/pages/popup_src/App.svelte
index 3409052d..2bd16169 100644
--- a/src/pages/popup_src/App.svelte
+++ b/src/pages/popup_src/App.svelte
@@ -88,7 +88,7 @@
 
 <style>
   :global(html, body) {
-    width: 300px;
+    width: 280px;
     height: min-content;
     min-height: auto;
     margin: 0;