about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/assets/javascripts/general.js42
-rw-r--r--src/assets/javascripts/imgur.js11
-rw-r--r--src/assets/javascripts/lbry.js6
-rw-r--r--src/assets/javascripts/maps.js17
-rw-r--r--src/assets/javascripts/medium.js5
-rw-r--r--src/assets/javascripts/peertube.js5
-rw-r--r--src/assets/javascripts/reddit.js5
-rw-r--r--src/assets/javascripts/search.js5
-rw-r--r--src/assets/javascripts/sendTargets.js5
-rw-r--r--src/assets/javascripts/tiktok.js5
-rw-r--r--src/assets/javascripts/translate/translate.js9
-rw-r--r--src/assets/javascripts/twitter.js7
-rw-r--r--src/assets/javascripts/utils.js19
-rw-r--r--src/assets/javascripts/wikipedia.js5
-rw-r--r--src/assets/javascripts/youtube/youtube.js5
-rw-r--r--src/assets/javascripts/youtubeMusic.js16
-rw-r--r--src/manifest.json3
-rw-r--r--src/pages/background/background.js63
-rw-r--r--src/pages/background/reset_warning.html13
-rw-r--r--src/pages/background/reset_warning.js11
-rw-r--r--src/pages/options/index.js9
-rw-r--r--src/pages/options/widgets/general.js89
-rw-r--r--src/pages/popup/popup.js1
23 files changed, 207 insertions, 149 deletions
diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js
index 199d884c..d85f308a 100644
--- a/src/assets/javascripts/general.js
+++ b/src/assets/javascripts/general.js
@@ -24,26 +24,28 @@ init();
 browser.storage.onChanged.addListener(init)
 
 async function initDefaults() {
-    await browser.storage.local.set({
-        exceptions: {
-            "url": [],
-            "regex": [],
-        },
-        theme: "DEFAULT",
-        popupFrontends: [
-            "youtube",
-            "twitter",
-            "instagram",
-            "tikTok",
-            "imgur",
-            "reddit",
-            "search",
-            "medium",
-            "translate",
-            "maps",
-        ],
-        autoRedirect: false,
-    })
+    return new Promise(resolve =>
+        browser.storage.local.set({
+            exceptions: {
+                "url": [],
+                "regex": [],
+            },
+            theme: "DEFAULT",
+            popupFrontends: [
+                "youtube",
+                "twitter",
+                "instagram",
+                "tikTok",
+                "imgur",
+                "reddit",
+                "search",
+                "medium",
+                "translate",
+                "maps",
+            ],
+            autoRedirect: false,
+        }, () => resolve())
+    )
 }
 
 const allPopupFrontends = [
diff --git a/src/assets/javascripts/imgur.js b/src/assets/javascripts/imgur.js
index d22430ee..e6097a67 100644
--- a/src/assets/javascripts/imgur.js
+++ b/src/assets/javascripts/imgur.js
@@ -32,14 +32,12 @@ function setRedirects() {
                 if (c > -1) rimgoI2pRedirectsChecks.splice(c, 1);
             }
 
-            await browser.storage.local.set({
+            browser.storage.local.set({
                 imgurRedirects: redirects,
                 rimgoNormalRedirectsChecks,
                 rimgoTorRedirectsChecks,
                 rimgoI2pRedirectsChecks,
-            });
-
-            resolve();
+            }, () => resolve());
         })
     })
 }
@@ -162,7 +160,7 @@ function initDefaults() {
                     const i = rimgoNormalRedirectsChecks.indexOf(instance);
                     if (i > -1) rimgoNormalRedirectsChecks.splice(i, 1);
                 }
-                await browser.storage.local.set({
+                browser.storage.local.set({
                     disableImgur: false,
                     imgurProtocol: 'normal',
                     imgurRedirects: redirects,
@@ -175,8 +173,7 @@ function initDefaults() {
 
                     rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p],
                     rimgoI2pCustomRedirects: [],
-                });
-                resolve();
+                }, () => resolve());
             });
         });
     });
diff --git a/src/assets/javascripts/lbry.js b/src/assets/javascripts/lbry.js
index d4f4359a..281ab2e5 100644
--- a/src/assets/javascripts/lbry.js
+++ b/src/assets/javascripts/lbry.js
@@ -129,7 +129,7 @@ function initDefaults() {
                 i = librarianNormalRedirectsChecks.indexOf(instance);
                 if (i > -1) librarianNormalRedirectsChecks.splice(i, 1);
             }
-            await browser.storage.local.set({
+            browser.storage.local.set({
                 disableLbryTargets: true,
                 lbryTargetsRedirects: {
                     'librarian': redirects.librarian
@@ -142,8 +142,8 @@ function initDefaults() {
                 librarianTorCustomRedirects: [],
 
                 lbryTargetsProtocol: "normal",
-            })
-            resolve();
+            }, () => resolve())
+
         })
     })
 }
diff --git a/src/assets/javascripts/maps.js b/src/assets/javascripts/maps.js
index 3ab5e2b6..245a5f85 100644
--- a/src/assets/javascripts/maps.js
+++ b/src/assets/javascripts/maps.js
@@ -197,13 +197,16 @@ function redirect(url, initiator) {
 }
 
 async function initDefaults() {
-  await browser.storage.local.set({
-    disableMaps: false,
-    mapsFrontend: 'osm',
-    mapsRedirects: redirects,
-    facilNormalRedirectsChecks: [...redirects.facil.normal],
-    facilNormalCustomRedirects: [],
-  })
+  return new Promise(resolve =>
+    browser.storage.local.set({
+      disableMaps: false,
+      mapsFrontend: 'osm',
+      mapsRedirects: redirects,
+      facilNormalRedirectsChecks: [...redirects.facil.normal],
+      facilNormalCustomRedirects: [],
+    }, () => resolve())
+  )
+
 }
 
 export default {
diff --git a/src/assets/javascripts/medium.js b/src/assets/javascripts/medium.js
index 06abd64e..7a926793 100644
--- a/src/assets/javascripts/medium.js
+++ b/src/assets/javascripts/medium.js
@@ -148,7 +148,7 @@ function initDefaults() {
             let i = scribeNormalRedirectsChecks.indexOf(instance);
             if (i > -1) scribeNormalRedirectsChecks.splice(i, 1);
           }
-          await browser.storage.local.set({
+          browser.storage.local.set({
             disableMedium: false,
             mediumRedirects: redirects,
 
@@ -159,8 +159,7 @@ function initDefaults() {
             scribeTorCustomRedirects: [],
 
             mediumProtocol: "normal",
-          })
-          resolve();
+          }, () => resolve())
         })
     })
   })
diff --git a/src/assets/javascripts/peertube.js b/src/assets/javascripts/peertube.js
index d1c06bf2..900048f7 100644
--- a/src/assets/javascripts/peertube.js
+++ b/src/assets/javascripts/peertube.js
@@ -128,7 +128,7 @@ function initDefaults() {
                     let i = simpleertubeNormalRedirectsChecks.indexOf(instance);
                     if (i > -1) simpleertubeNormalRedirectsChecks.splice(i, 1);
                 }
-                await browser.storage.local.set({
+                browser.storage.local.set({
                     peerTubeTargets: ['https://search.joinpeertube.org', ...dataJson.peertube],
                     disablePeertubeTargets: true,
                     peertubeRedirects: redirects,
@@ -140,8 +140,7 @@ function initDefaults() {
                     simpleertubeTorCustomRedirects: [],
 
                     peertubeTargetsProtocol: "normal",
-                })
-                resolve();
+                }, () => resolve());
             })
         })
     })
diff --git a/src/assets/javascripts/reddit.js b/src/assets/javascripts/reddit.js
index c10ebe2f..58ed813a 100644
--- a/src/assets/javascripts/reddit.js
+++ b/src/assets/javascripts/reddit.js
@@ -334,7 +334,7 @@ function initDefaults() {
           i = tedditNormalRedirectsChecks.indexOf(instance);
           if (i > -1) tedditNormalRedirectsChecks.splice(i, 1);
         }
-        await browser.storage.local.set({
+        browser.storage.local.set({
           disableReddit: false,
           redditProtocol: 'normal',
           redditFrontend: 'libreddit',
@@ -351,8 +351,7 @@ function initDefaults() {
 
           tedditTorRedirectsChecks: [...redirects.teddit.tor],
           tedditTorCustomRedirects: [],
-        });
-        resolve();
+        }, () => resolve());
       });
     });
   });
diff --git a/src/assets/javascripts/search.js b/src/assets/javascripts/search.js
index 6d6fd365..ded0ceef 100644
--- a/src/assets/javascripts/search.js
+++ b/src/assets/javascripts/search.js
@@ -410,7 +410,7 @@ function initDefaults() {
           i = searxngNormalRedirectsChecks.indexOf(instance);
           if (i > -1) searxngNormalRedirectsChecks.splice(i, 1);
         }
-        await browser.storage.local.set({
+        browser.storage.local.set({
           disableSearch: false,
           searchFrontend: 'searxng',
           searchRedirects: redirects,
@@ -443,8 +443,7 @@ function initDefaults() {
 
           searxngI2pRedirectsChecks: [...redirects.searxng.i2p],
           searxngI2pCustomRedirects: [],
-        })
-        resolve();
+        }, () => resolve())
       })
     })
   })
diff --git a/src/assets/javascripts/sendTargets.js b/src/assets/javascripts/sendTargets.js
index 72a153ec..dcc17b21 100644
--- a/src/assets/javascripts/sendTargets.js
+++ b/src/assets/javascripts/sendTargets.js
@@ -123,7 +123,7 @@ function initDefaults() {
                     let i = sendNormalRedirectsChecks.indexOf(instance);
                     if (i > -1) sendNormalRedirectsChecks.splice(i, 1);
                 }
-                await browser.storage.local.set({
+                browser.storage.local.set({
                     disableSendTarget: false,
                     sendTargetsRedirects: redirects,
 
@@ -134,8 +134,7 @@ function initDefaults() {
                     sendTorCustomRedirects: [],
 
                     sendTargetsProtocol: "normal",
-                })
-                resolve();
+                }, () => resolve())
             })
         })
     })
diff --git a/src/assets/javascripts/tiktok.js b/src/assets/javascripts/tiktok.js
index a462cec4..50347a93 100644
--- a/src/assets/javascripts/tiktok.js
+++ b/src/assets/javascripts/tiktok.js
@@ -142,7 +142,7 @@ function initDefaults() {
         fetch('/instances/data.json').then(response => response.text()).then(async data => {
             let dataJson = JSON.parse(data);
             redirects.proxiTok = dataJson.proxiTok;
-            await browser.storage.local.set({
+            browser.storage.local.set({
                 disableTiktok: false,
                 tiktokProtocol: "normal",
 
@@ -153,8 +153,7 @@ function initDefaults() {
 
                 proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
                 proxiTokTorCustomRedirects: [],
-            });
-            resolve();
+            }, () => resolve());
         });
     })
 }
diff --git a/src/assets/javascripts/translate/translate.js b/src/assets/javascripts/translate/translate.js
index efb42313..79fab753 100644
--- a/src/assets/javascripts/translate/translate.js
+++ b/src/assets/javascripts/translate/translate.js
@@ -264,14 +264,14 @@ function initDefaults() {
             const i = lingvaNormalRedirectsChecks.indexOf(instance);
             if (i > -1) lingvaNormalRedirectsChecks.splice(i, 1);
           }
-          await browser.storage.local.set({
+          browser.storage.local.set({
             translateDisable: false,
             translateFrontend: "simplyTranslate",
             translateProtocol: 'normal',
             translateRedirects: redirects,
 
-            simplyTranslateNormalRedirectsChecks: simplyTranslateNormalRedirectsChecks,
-            simplyTranslateNormalCustomRedirects: [...redirects.simplyTranslate.normal],
+            simplyTranslateNormalRedirectsChecks: [...redirects.simplyTranslate.normal],
+            simplyTranslateNormalCustomRedirects: [],
             simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
             simplyTranslateTorCustomRedirects: [],
 
@@ -279,8 +279,7 @@ function initDefaults() {
             lingvaNormalCustomRedirects: [],
             lingvaTorRedirectsChecks: [...redirects.lingva.tor],
             lingvaTorCustomRedirects: [],
-          })
-          resolve();
+          }, () => resolve())
         })
     })
   })
diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js
index 81a4513f..1ee7f755 100644
--- a/src/assets/javascripts/twitter.js
+++ b/src/assets/javascripts/twitter.js
@@ -210,18 +210,17 @@ function initDefaults() {
           let i = nitterNormalRedirectsChecks.indexOf(instance);
           if (i > -1) nitterNormalRedirectsChecks.splice(i, 1);
         }
-        await browser.storage.local.set({
+        browser.storage.local.set({
           disableTwitter: false,
           twitterRedirects: redirects,
           twitterProtocol: "normal",
 
-          nitterNormalRedirectsChecks,
+          nitterNormalRedirectsChecks: nitterNormalRedirectsChecks,
           nitterNormalCustomRedirects: [],
 
           nitterTorRedirectsChecks: [...redirects.nitter.tor],
           nitterTorCustomRedirects: [],
-        })
-        resolve();
+        }, () => resolve());
       })
     })
   })
diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
index 44247d96..a25bdc5a 100644
--- a/src/assets/javascripts/utils.js
+++ b/src/assets/javascripts/utils.js
@@ -69,7 +69,6 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
   }
   let latencyKey = `${name}Latency`;
   let instancesLatency;
-  await browser.storage.local.get(latencyKey, r => instancesLatency = r[latencyKey] ?? []);
   let nameProtocolElement = document.getElementById(name).getElementsByClassName(protocol)[0];
 
   let nameCustomInstances = [];
@@ -77,7 +76,6 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
 
   await initcloudflareBlackList();
 
-
   let nameDefaultRedirects;
 
   let redirectsChecks = `${name}${camelCase(protocol)}RedirectsChecks`;
@@ -92,11 +90,13 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
         [
           redirectsChecks,
           customRedirects,
-          redirectsKey
+          redirectsKey,
+          latencyKey
         ],
         r => {
           nameDefaultRedirects = r[redirectsChecks];
           nameCustomInstances = r[customRedirects];
+          instancesLatency = r[latencyKey] ?? [];
           redirects = r[redirectsKey];
           resolve();
         }
@@ -155,7 +155,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
     else
       nameDefaultRedirects = [];
 
-    await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects });
+    browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects });
     calcNameCheckBoxes();
   });
 
@@ -168,7 +168,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
           let index = nameDefaultRedirects.indexOf(element.className);
           if (index > -1) nameDefaultRedirects.splice(index, 1);
         }
-        await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects });
+        browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects });
         calcNameCheckBoxes();
       });
   }
@@ -191,7 +191,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
       nameProtocolElement.getElementsByClassName(`clear-${item}`)[0].addEventListener("click", async () => {
         let index = nameCustomInstances.indexOf(item);
         if (index > -1) nameCustomInstances.splice(index, 1);
-        await browser.storage.local.set({ [customRedirects]: nameCustomInstances });
+        browser.storage.local.set({ [customRedirects]: nameCustomInstances });
         calcNameCustomInstances();
       });
     }
@@ -205,7 +205,7 @@ async function processDefaultCustomInstances(target, name, protocol, document) {
     if (nameCustomInstanceInput.validity.valid && !redirects[name][protocol].includes(protocolHostVar)) {
       if (!nameCustomInstances.includes(protocolHostVar)) {
         nameCustomInstances.push(protocolHostVar)
-        await browser.storage.local.set({ [customRedirects]: nameCustomInstances });
+        browser.storage.local.set({ [customRedirects]: nameCustomInstances });
         nameCustomInstanceInput.value = '';
       }
       calcNameCustomInstances();
@@ -292,7 +292,6 @@ function copyCookie(frontend, targetUrl, urls, name) {
         browser.privacy.websites.firstPartyIsolate.get({},
           async firstPartyIsolate => {
             function setCookie(url, name, value, expirationDate) {
-              console.log('firstPartyDomain', firstPartyIsolate.value ? new URL(url).hostname : '')
               return new Promise(resolve =>
                 browser.cookies.set(
                   {
@@ -300,7 +299,7 @@ function copyCookie(frontend, targetUrl, urls, name) {
                     name: name,
                     value: value,
                     firstPartyDomain: firstPartyIsolate.value ? new URL(url).hostname : '',
-                    expirationDate: expirationDate,
+                    expirationDate: firstPartyIsolate.value ? null : expirationDate,
                   },
                   () => resolve()
                 )
@@ -334,7 +333,7 @@ function getCookiesFromStorage(frontend, urls, name) {
                 url: url,
                 name: cookie.name,
                 value: cookie.value,
-                expirationDate: cookie.expirationDate,
+                expirationDate: firstPartyIsolate.value ? null : cookie.expirationDate,
                 firstPartyDomain: firstPartyIsolate.value ? new URL(url).hostname : '',
               })
           })
diff --git a/src/assets/javascripts/wikipedia.js b/src/assets/javascripts/wikipedia.js
index db7bf20b..d211656b 100644
--- a/src/assets/javascripts/wikipedia.js
+++ b/src/assets/javascripts/wikipedia.js
@@ -186,7 +186,7 @@ function initDefaults() {
           let i = wikilessNormalRedirectsChecks.indexOf(instance);
           if (i > -1) wikilessNormalRedirectsChecks.splice(i, 1);
         }
-        await browser.storage.local.set({
+        browser.storage.local.set({
           disableWikipedia: true,
           wikipediaRedirects: redirects,
           wikipediaProtocol: "normal",
@@ -196,8 +196,7 @@ function initDefaults() {
           wikilessNormalCustomRedirects: [],
           wikilessTorCustomRedirects: [],
           wikilessI2pCustomRedirects: [],
-        })
-        resolve();
+        }, () => resolve());
       })
     })
   })
diff --git a/src/assets/javascripts/youtube/youtube.js b/src/assets/javascripts/youtube/youtube.js
index 468c4792..6f022e21 100644
--- a/src/assets/javascripts/youtube/youtube.js
+++ b/src/assets/javascripts/youtube/youtube.js
@@ -262,7 +262,7 @@ function initDefaults() {
           if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1);
         }
 
-        await browser.storage.local.set({
+        browser.storage.local.set({
           disableYoutube: false,
           enableYoutubeCustomSettings: false,
           onlyEmbeddedVideo: 'both',
@@ -291,8 +291,7 @@ function initDefaults() {
 
           youtubeEmbedFrontend: 'invidious',
           youtubeProtocol: 'normal',
-        })
-        resolve();
+        }, () => resolve())
       })
     })
   })
diff --git a/src/assets/javascripts/youtubeMusic.js b/src/assets/javascripts/youtubeMusic.js
index 90a02ecf..8d007e39 100644
--- a/src/assets/javascripts/youtubeMusic.js
+++ b/src/assets/javascripts/youtubeMusic.js
@@ -80,13 +80,15 @@ function redirect(url) {
 }
 
 async function initDefaults() {
-    await browser.storage.local.set({
-        disableYoutubeMusic: true,
-        youtubeMusicRedirects: redirects,
-
-        beatbumpNormalRedirectsChecks: [...redirects.beatbump.normal],
-        beatbumpNormalCustomRedirects: [],
-    })
+    return new Promise(resolve =>
+        browser.storage.local.set({
+            disableYoutubeMusic: true,
+            youtubeMusicRedirects: redirects,
+
+            beatbumpNormalRedirectsChecks: [...redirects.beatbump.normal],
+            beatbumpNormalCustomRedirects: [],
+        }, () => resolve())
+    )
 }
 
 export default {
diff --git a/src/manifest.json b/src/manifest.json
index a887eb1e..052d992f 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -1,7 +1,7 @@
 {
   "name": "__MSG_extensionName__",
   "description": "__MSG_extensionDescription__",
-  "version": "2.0.0",
+  "version": "2.1.0",
   "manifest_version": 2,
   "browser_specific_settings": {
     "gecko": {
@@ -25,7 +25,6 @@
     "storage",
     "unlimitedStorage",
     "cookies",
-    "browserSettings",
     "privacy",
     "contextMenus",
     "<all_urls>"
diff --git a/src/pages/background/background.js b/src/pages/background/background.js
index b8787f34..afb63c51 100644
--- a/src/pages/background/background.js
+++ b/src/pages/background/background.js
@@ -21,38 +21,59 @@ import lbryHelper from "../../assets/javascripts/lbry.js";
 
 window.browser = window.browser || window.chrome;
 
+function openResetWarning() {
+  return new Promise(resolve => {
+    browser.storage.local.get(null, r => {
+      const old = encodeURIComponent(JSON.stringify(r))
+      browser.tabs.create({ url: browser.runtime.getURL(`/pages/background/reset_warning.html?data=${old}`) });
+      resolve();
+    })
+  })
+}
+
+
 browser.runtime.onInstalled.addListener(
   async details => {
     // if (details.reason == 'install') {
-    if (details.reason == 'install' || details.reason == "update") {
-      if (details.reason == "update") browser.tabs.create({ url: browser.runtime.getURL("/pages/background/reset_warning.html") });
+    if (details.reason == 'install' || (details.reason == "update" && details.previousVersion != browser.runtime.getManifest().version)) {
+      if (details.reason == "update") await openResetWarning();
       fetch('/instances/blacklist.json').then(response => response.text()).then(async data => {
-        await browser.storage.local.clear();
-        await browser.storage.local.set({ cloudflareBlackList: JSON.parse(data).cloudflare })
-        await browser.storage.local.set({ authenticateBlackList: JSON.parse(data).authenticate })
-        generalHelper.initDefaults();
-        youtubeHelper.initDefaults();
-        youtubeMusicHelper.initDefaults();
-        twitterHelper.initDefaults();
-        instagramHelper.initDefaults();
-        mapsHelper.initDefaults();
-        searchHelper.initDefaults();
-        translateHelper.initDefaults();
-        mediumHelper.initDefaults();
-        redditHelper.initDefaults();
-        wikipediaHelper.initDefaults();
-        imgurHelper.initDefaults();
-        tiktokHelper.initDefaults();
-        sendTargetsHelper.initDefaults();
-        peertubeHelper.initDefaults();
-        lbryHelper.initDefaults();
+        browser.storage.local.clear(
+          () => {
+            browser.storage.local.set({ cloudflareBlackList: JSON.parse(data).cloudflare },
+              () => {
+                browser.storage.local.set({ authenticateBlackList: JSON.parse(data).authenticate },
+                  () => {
+                    generalHelper.initDefaults();
+                    youtubeHelper.initDefaults();
+                    youtubeMusicHelper.initDefaults();
+                    twitterHelper.initDefaults();
+                    instagramHelper.initDefaults();
+                    mapsHelper.initDefaults();
+                    searchHelper.initDefaults();
+                    translateHelper.initDefaults();
+                    mediumHelper.initDefaults();
+                    redditHelper.initDefaults();
+                    wikipediaHelper.initDefaults();
+                    imgurHelper.initDefaults();
+                    tiktokHelper.initDefaults();
+                    sendTargetsHelper.initDefaults();
+                    peertubeHelper.initDefaults();
+                    lbryHelper.initDefaults();
+                  })
+              })
+          });
+
       })
     }
   }
 )
 
 youtubeHelper.pasteInvidiousCookies();
+youtubeHelper.pastePipedLocalStorage();
+youtubeHelper.pastePipedMaterialLocalStorage();
 translateHelper.pasteSimplyTranslateCookies();
+translateHelper.pasteLingvaLocalStorage();
 twitterHelper.pasteNitterCookies();
 wikipediaHelper.pasteWikilessCookies();
 searchHelper.pasteSearxCookies();
diff --git a/src/pages/background/reset_warning.html b/src/pages/background/reset_warning.html
index a3feee72..d2d493e0 100644
--- a/src/pages/background/reset_warning.html
+++ b/src/pages/background/reset_warning.html
@@ -47,7 +47,20 @@
             previous version.</p>
         <p>Sorry for the inconvenience, but we're going in a fast development process and can't
             support nor convert older settings. It will reach a stable plateau though.</p>
+
+
+            <a id="export-settings" class="button button-inline">
+                <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
+                    fill="currentColor">
+                    <path
+                        d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z">
+                    </path>
+                </svg>
+                &nbsp;
+                <x data-localise="__MSG_exportSettings__">Export Settings</x>
+            </a>
     </div>
 </body>
+<script src="reset_warning.js"></script>
 
 </html>
\ No newline at end of file
diff --git a/src/pages/background/reset_warning.js b/src/pages/background/reset_warning.js
new file mode 100644
index 00000000..9c9e9800
--- /dev/null
+++ b/src/pages/background/reset_warning.js
@@ -0,0 +1,11 @@
+let params = new URLSearchParams(location.search);
+
+const resultString = JSON.stringify(
+    JSON.parse(decodeURIComponent(params.get('data'))),
+    null,
+    '  '
+);
+
+let exportSettingsElement = document.getElementById("export-settings");
+exportSettingsElement.href = 'data:application/json;base64,' + btoa(resultString);
+exportSettingsElement.download = 'libredirect-settings.json';
diff --git a/src/pages/options/index.js b/src/pages/options/index.js
index 39f9c8f3..b6fcf6b8 100644
--- a/src/pages/options/index.js
+++ b/src/pages/options/index.js
@@ -1,3 +1,12 @@
+import youtubeHelper from "../../assets/javascripts/youtube/youtube.js";
+import twitterHelper from "../../assets/javascripts/twitter.js";
+import redditHelper from "../../assets/javascripts/reddit.js";
+import searchHelper from "../../assets/javascripts/search.js";
+import translateHelper from "../../assets/javascripts/translate/translate.js";
+import wikipediaHelper from "../../assets/javascripts/wikipedia.js";
+import tiktokHelper from "../../assets/javascripts/tiktok.js";
+
+
 for (const a of document.getElementById('links').getElementsByTagName('a')) {
     a.addEventListener('click', e => {
         const path = a.getAttribute('href').replace('#', '');
diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js
index f2ed341a..f46c4011 100644
--- a/src/pages/options/widgets/general.js
+++ b/src/pages/options/widgets/general.js
@@ -63,30 +63,36 @@ importSettingsElement.addEventListener("change",
       if (
         "theme" in data &&
         "disableImgur" in data &&
-        "cloudflareBlackList" in data &&
         "imgurRedirects" in data
       ) {
-        await browser.storage.local.clear();
-        await browser.storage.local.set({ ...data })
-        await youtubeHelper.pasteInvidiousCookies();
-        await youtubeHelper.pastePipedLocalStorage();
-        await youtubeHelper.pastePipedMaterialLocalStorage();
+        browser.storage.local.clear(
+          () => {
+            browser.storage.local.set({ ...data },
+              async () => {
+                await youtubeHelper.pasteInvidiousCookies();
+                await youtubeHelper.pastePipedLocalStorage();
+                await youtubeHelper.pastePipedMaterialLocalStorage();
+
+                await translateHelper.pasteSimplyTranslateCookies();
+                await translateHelper.pasteLingvaLocalStorage();
+
+                await twitterHelper.pasteNitterCookies();
 
-        await translateHelper.pasteSimplyTranslateCookies();
-        await translateHelper.pasteLingvaLocalStorage();
+                await wikipediaHelper.pasteWikilessCookies();
 
-        await twitterHelper.pasteNitterCookies();
+                await searchHelper.pasteSearxCookies();
+                await searchHelper.pasteSearxngCookies();
 
-        await wikipediaHelper.pasteWikilessCookies();
+                await redditHelper.pasteLibredditCookies();
+                await redditHelper.pasteTedditCookies();
 
-        await searchHelper.pasteSearxCookies();
-        await searchHelper.pasteSearxngCookies();
+                await tiktokHelper.pasteProxiTokCookies();
+                
+                location.reload();
+              })
 
-        await redditHelper.pasteLibredditCookies();
-        await redditHelper.pasteTedditCookies();
+          });
 
-        await tiktokHelper.pasteProxiTokCookies();
-        location.reload();
       } else
         importError()
     }
@@ -103,28 +109,35 @@ const resetSettings = document.getElementById("reset-settings");
 resetSettings.addEventListener("click",
   async () => {
     resetSettings.innerHTML = '...'
-    await browser.storage.local.clear();
-    fetch('/instances/blacklist.json').then(response => response.text()).then(async data => {
-      await browser.storage.local.set({ cloudflareBlackList: JSON.parse(data).cloudflare })
-      await browser.storage.local.set({ authenticateBlackList: JSON.parse(data).authenticate })
-      await generalHelper.initDefaults();
-      await youtubeHelper.initDefaults();
-      await youtubeMusicHelper.initDefaults();
-      await twitterHelper.initDefaults();
-      await instagramHelper.initDefaults();
-      await mapsHelper.initDefaults();
-      await searchHelper.initDefaults();
-      await translateHelper.initDefaults();
-      await mediumHelper.initDefaults();
-      await redditHelper.initDefaults();
-      await wikipediaHelper.initDefaults();
-      await imgurHelper.initDefaults();
-      await tiktokHelper.initDefaults();
-      await sendTargetsHelper.initDefaults();
-      await peertubeHelper.initDefaults();
-      await lbryHelper.initDefaults();
-      location.reload();
-    })
+    browser.storage.local.clear(
+      () => {
+        fetch('/instances/blacklist.json').then(response => response.text()).then(async data => {
+          browser.storage.local.set({ cloudflareBlackList: JSON.parse(data).cloudflare },
+            () => {
+              browser.storage.local.set({ authenticateBlackList: JSON.parse(data).authenticate },
+                async () => {
+                  await generalHelper.initDefaults();
+                  await youtubeHelper.initDefaults();
+                  await youtubeMusicHelper.initDefaults();
+                  await twitterHelper.initDefaults();
+                  await instagramHelper.initDefaults();
+                  await mapsHelper.initDefaults();
+                  await searchHelper.initDefaults();
+                  await translateHelper.initDefaults();
+                  await mediumHelper.initDefaults();
+                  await redditHelper.initDefaults();
+                  await wikipediaHelper.initDefaults();
+                  await imgurHelper.initDefaults();
+                  await tiktokHelper.initDefaults();
+                  await sendTargetsHelper.initDefaults();
+                  await peertubeHelper.initDefaults();
+                  await lbryHelper.initDefaults();
+                  location.reload();
+                })
+            })
+        })
+      });
+
   }
 );
 
diff --git a/src/pages/popup/popup.js b/src/pages/popup/popup.js
index d4459917..17eeb2ca 100644
--- a/src/pages/popup/popup.js
+++ b/src/pages/popup/popup.js
@@ -34,7 +34,6 @@ utils.copyRaw(true).then(r => {
 
 document.getElementById("more-options").addEventListener("click", () => browser.runtime.openOptionsPage());
 
-
 let disableTwitterElement = document.getElementById("disable-nitter");
 let disableYoutubeElement = document.getElementById("disable-youtube");
 let disableYoutubeMusicElement = document.getElementById("disable-youtubeMusic");