about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorSimon Brazell <simon.brazell@gmail.com>2019-10-07 23:01:42 +1100
committerSimon Brazell <simon.brazell@gmail.com>2019-10-07 23:01:42 +1100
commit29f6713cf55895da8e272a3629eec0b0b65db8ae (patch)
treed495be3bdbe5d580253eecc1e4c4ebdeb876ddde
parentFix spelling mistakes, add more icon files. (diff)
parentComplete options & popup menus (diff)
downloadlibredirect-29f6713cf55895da8e272a3629eec0b0b65db8ae.zip
Merge branch 'options'
-rw-r--r--background.js59
-rw-r--r--images/Screen Shot 1.png (renamed from img/Screen Shot 1.png)bin415406 -> 415406 bytes
-rw-r--r--images/Screen Shot 2.png (renamed from img/Screen Shot 2.png)bin811174 -> 811174 bytes
-rw-r--r--images/icon128.png (renamed from img/icon128.png)bin3197 -> 3197 bytes
-rw-r--r--images/icon16.png (renamed from img/icon16.png)bin976 -> 976 bytes
-rw-r--r--images/icon32.png (renamed from img/icon32.png)bin1983 -> 1983 bytes
-rw-r--r--images/icon48.png (renamed from img/icon48.png)bin1063 -> 1063 bytes
-rw-r--r--images/logo.pngbin0 -> 31646 bytes
-rw-r--r--images/small-tile.png (renamed from img/small-tile.png)bin35583 -> 35583 bytes
-rw-r--r--manifest.json34
-rw-r--r--pages/options/options.html47
-rw-r--r--pages/options/options.js26
-rw-r--r--pages/popup/popup.html47
-rw-r--r--pages/popup/popup.js28
-rw-r--r--pages/styles.css146
15 files changed, 369 insertions, 18 deletions
diff --git a/background.js b/background.js
index 2fb698f1..d5c8346a 100644
--- a/background.js
+++ b/background.js
@@ -1,19 +1,56 @@
-const nitter = "https://nitter.net";
-const invidious = "https://invidio.us";
-const youtubeRegex = /((www|m)\.)?youtube(-nocookie)?\.com/
+'use strict';
+
+const nitterDefault = 'https://nitter.net';
+const invidiousDefault = 'https://invidio.us';
+const youtubeRegex = /((www|m)\.)?youtube(-nocookie)?\.com/;
+const pathRegex = /^https?:\/\/[^\/]+([\S\s]*)/;
+
+let nitterInstance;
+let invidiousInstance;
+let disableNitter;
+let disableInvidious;
+
+chrome.storage.sync.get(
+  ['disableNitter', 'disableInvidious', 'nitterInstance', 'invidiousInstance'],
+  (result) => {
+    disableNitter = result.disableNitter;
+    disableInvidious = result.disableInvidious;
+    nitterInstance = result.nitterInstance || nitterDefault;
+    invidiousInstance = result.invidiousInstance || invidiousDefault;
+  }
+);
+
+chrome.storage.onChanged.addListener(function (changes) {
+  if ('nitterInstance' in changes) {
+    nitterInstance = changes.nitterInstance.newValue || nitterDefault;
+  }
+  if ('invidiousInstance' in changes) {
+    invidiousInstance = changes.invidiousInstance.newValue || invidiousDefault;
+  }
+  if ('disableNitter' in changes) {
+    disableNitter = changes.disableNitter.newValue;
+  }
+  if ('disableInvidious' in changes) {
+    disableInvidious = changes.disableInvidious.newValue;
+  }
+});
 
 chrome.webRequest.onBeforeRequest.addListener(
   function (details) {
     if (details.url.match(youtubeRegex)) {
-      return {
-        redirectUrl:
-          invidious + details.url.match(/^https?:\/\/[^\/]+([\S\s]*)/)[1]
-      };
+      if (!disableInvidious) {
+        return {
+          redirectUrl:
+            invidiousInstance + details.url.match(pathRegex)[1]
+        };
+      }
     } else {
-      return {
-        redirectUrl:
-          nitter + details.url.match(/^https?:\/\/[^\/]+([\S\s]*)/)[1]
-      };
+      if (!disableNitter) {
+        return {
+          redirectUrl:
+            nitterInstance + details.url.match(pathRegex)[1]
+        };
+      }
     }
   },
   {
diff --git a/img/Screen Shot 1.png b/images/Screen Shot 1.png
index 7363026a..7363026a 100644
--- a/img/Screen Shot 1.png
+++ b/images/Screen Shot 1.png
Binary files differdiff --git a/img/Screen Shot 2.png b/images/Screen Shot 2.png
index f131363d..f131363d 100644
--- a/img/Screen Shot 2.png
+++ b/images/Screen Shot 2.png
Binary files differdiff --git a/img/icon128.png b/images/icon128.png
index ccd689cc..ccd689cc 100644
--- a/img/icon128.png
+++ b/images/icon128.png
Binary files differdiff --git a/img/icon16.png b/images/icon16.png
index 1c510cb7..1c510cb7 100644
--- a/img/icon16.png
+++ b/images/icon16.png
Binary files differdiff --git a/img/icon32.png b/images/icon32.png
index d001aab6..d001aab6 100644
--- a/img/icon32.png
+++ b/images/icon32.png
Binary files differdiff --git a/img/icon48.png b/images/icon48.png
index 4ddd22eb..4ddd22eb 100644
--- a/img/icon48.png
+++ b/images/icon48.png
Binary files differdiff --git a/images/logo.png b/images/logo.png
new file mode 100644
index 00000000..db4030ff
--- /dev/null
+++ b/images/logo.png
Binary files differdiff --git a/img/small-tile.png b/images/small-tile.png
index a3ed077b..a3ed077b 100644
--- a/img/small-tile.png
+++ b/images/small-tile.png
Binary files differdiff --git a/manifest.json b/manifest.json
index b73bf658..d2c20b0b 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,20 +1,22 @@
 {
   "name": "Privacy Redirect",
   "description": "Redirects Twitter & Youtube requests to privacy friendly alternatives (Nitter & Invidious).",
-  "version": "1.0.1",
+  "version": "1.1.1",
   "manifest_version": 2,
   "background": {
     "scripts": [
       "background.js"
-    ]
+    ],
+    "persistent": true
   },
   "icons": {
-    "16": "img/icon16.png",
-    "32": "img/icon32.png",
-    "48": "img/icon48.png",
-    "128": "img/icon128.png"
+    "16": "images/icon16.png",
+    "32": "images/icon32.png",
+    "48": "images/icon48.png",
+    "128": "images/icon128.png"
   },
   "permissions": [
+    "storage",
     "webRequest",
     "webRequestBlocking",
     "*://twitter.com/*",
@@ -25,5 +27,23 @@
     "*://youtube-nocookie.com/*",
     "*://www.youtube-nocookie.com/*",
     "*://m.youtube.com/"
-  ]
+  ],
+  "browser_action": {
+    "default_popup": "pages/popup/popup.html",
+    "default_icon": {
+      "16": "images/icon16.png",
+      "32": "images/icon32.png",
+      "48": "images/icon48.png",
+      "128": "images/icon128.png"
+    }
+  },
+  "options_ui": {
+    "page": "pages/options/options.html",
+    "open_in_tab": false
+  },
+  "browser_specific_settings": {
+    "gecko": {
+      "id": "{b7f9d2cd-d772-4302-8c3f-eb941af36f76}"
+    }
+  }
 }
\ No newline at end of file
diff --git a/pages/options/options.html b/pages/options/options.html
new file mode 100644
index 00000000..124aa4bf
--- /dev/null
+++ b/pages/options/options.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <title></title>
+  <link href="../styles.css" rel="stylesheet">
+  <title>Privacy Redirect Options</title>
+</head>
+
+<body>
+
+  <section class="options settings_block">
+    <div class="onoffswitch switch" aria-label="Toggle Nitter redirects">
+      <h1>Nitter Redirects</h1>
+      <input aria-hidden="true" id="disableNitter" type="checkbox" checked>&nbsp;
+      <label for="disableNitter" class="checkbox-label">
+      </label>
+    </div>
+  </section>
+
+  <section class="options settings_block">
+    <div class="onoffswitch switch" aria-label="Toggle Invidious redirects">
+      <h1>Invidious Redirects</h1>
+      <input aria-hidden="true" id="disableInvidious" type="checkbox" checked>&nbsp;
+      <label for="disableInvidious" class="checkbox-label">
+      </label>
+    </div>
+  </section>
+
+  <section class="options settings_block">
+    <h1>Nitter Instance</h1>
+    <input id="nitterInstance" type="url" placeholder="https://nitter.net">
+    <h1>Invidious Instance</h1>
+    <input id="invidiousInstance" type="url" placeholder="https://invidio.us">
+  </section>
+
+  <footer>
+    <a class="button" id="save">Save</a>
+  </footer>
+
+  <script src="./options.js"></script>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/pages/options/options.js b/pages/options/options.js
new file mode 100644
index 00000000..b5c097d7
--- /dev/null
+++ b/pages/options/options.js
@@ -0,0 +1,26 @@
+'use strict';
+
+let disableNitter = document.querySelector('#disableNitter');
+let disableInvidious = document.querySelector('#disableInvidious');
+let nitterInstance = document.querySelector('#nitterInstance');
+let invidiousInstance = document.querySelector('#invidiousInstance');
+
+chrome.storage.sync.get(
+  ['disableNitter', 'disableInvidious', 'nitterInstance', 'invidiousInstance'],
+  (result) => {
+    disableNitter.checked = !result.disableNitter;
+    disableInvidious.checked = !result.disableInvidious;
+    nitterInstance.value = result.nitterInstance || '';
+    invidiousInstance.value = result.invidiousInstance || '';
+  }
+);
+
+document.querySelector('#save').addEventListener('click', () => {
+  chrome.storage.sync.set({
+    disableNitter: !disableNitter.checked,
+    disableInvidious: !disableInvidious.checked,
+    nitterInstance: nitterInstance.value,
+    invidiousInstance: invidiousInstance.value
+  });
+  window.close();
+});
\ No newline at end of file
diff --git a/pages/popup/popup.html b/pages/popup/popup.html
new file mode 100644
index 00000000..889ffcde
--- /dev/null
+++ b/pages/popup/popup.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <title></title>
+  <link href="../styles.css" rel="stylesheet">
+</head>
+
+<body>
+  <header>
+    <div class="logo-container">
+      <img src="../../images/logo.png" alt="Privacy Redirect logo">
+    </div>
+    <small>
+      <span>Version</span>: 1.1.1</span>
+    </small>
+  </header>
+
+  <section class="options settings_block">
+    <div class="onoffswitch switch" aria-label="Toggle Nitter redirects">
+      <h1>Nitter Redirects</h1>
+      <input aria-hidden="true" id="disableNitter" type="checkbox" checked>&nbsp;
+      <label for="disableNitter" class="checkbox-label">
+      </label>
+    </div>
+  </section>
+
+  <section class="options settings_block">
+    <div class="onoffswitch switch" aria-label="Toggle Invidious redirects">
+      <h1>Invidious Redirects</h1>
+      <input aria-hidden="true" id="disableInvidious" type="checkbox" checked>&nbsp;
+      <label for="disableInvidious" class="checkbox-label">
+      </label>
+    </div>
+  </section>
+
+  <footer>
+    <a class="button" id="options" target="_blank">Options</a>
+  </footer>
+
+  <script src="./popup.js"></script>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/pages/popup/popup.js b/pages/popup/popup.js
new file mode 100644
index 00000000..2837cdb2
--- /dev/null
+++ b/pages/popup/popup.js
@@ -0,0 +1,28 @@
+'use strict';
+
+let disableNitter = document.querySelector('#disableNitter');
+let disableInvidious = document.querySelector('#disableInvidious');
+
+chrome.storage.sync.get(
+  ['disableNitter', 'disableInvidious'],
+  (result) => {
+    disableNitter.checked = !result.disableNitter;
+    disableInvidious.checked = !result.disableInvidious;
+  }
+);
+
+disableNitter.addEventListener('change', (event) => {
+  chrome.storage.sync.set({ disableNitter: !event.target.checked });
+});
+
+disableInvidious.addEventListener('change', (event) => {
+  chrome.storage.sync.set({ disableInvidious: !event.target.checked });
+});
+
+document.querySelector('#options').addEventListener('click', () => {
+  if (chrome.runtime.openOptionsPage) {
+    chrome.runtime.openOptionsPage();
+  } else {
+    window.open(chrome.runtime.getURL('../options/options.html'));
+  }
+});
\ No newline at end of file
diff --git a/pages/styles.css b/pages/styles.css
new file mode 100644
index 00000000..5a233524
--- /dev/null
+++ b/pages/styles.css
@@ -0,0 +1,146 @@
+:root {
+  --text-main: #FFF;
+  --text-secondary: #000;
+  --dark-grey: #3C4043;
+  --white: #FFF;
+  --active: #FF5B56;
+  --space: 5px;
+}
+
+body {
+  color: var(--text-secondary);
+  margin: 0;
+  max-width: 400px;
+  min-width: 240px;
+  background-color: var(--dark-grey)
+}
+
+header {
+  background-color: var(--white);
+  color: var(--text-secondary);
+  display: flex;
+  padding: var(--space);
+}
+
+header h1 {
+  font-size: 2em;
+}
+
+header .logo-container {
+  margin: var(--space);
+}
+
+header .logo-container img {
+  width: 100%;
+}
+
+header small {
+  display: block;
+  font-size: .70em;
+  font-weight: bold;
+  margin: 1%;
+  width: 100%;
+  text-align: right;
+}
+
+h1 {
+  font-size: 14px;
+  margin: var(--space) auto
+}
+
+h2 {
+  clear: both;
+  font-size: 12px;
+  font-weight: normal;
+  margin: 0;
+}
+
+h3 {
+  font-size: 16px;
+}
+
+h1,
+h2 {
+  color: var(--text-main);
+}
+
+footer {
+  width: 100%;
+}
+
+footer a.button {
+  margin: var(--space);
+}
+
+/* Elements */
+
+input[type=url] {
+  width: 100%;
+  margin-bottom: 5px;
+}
+
+input[type=checkbox] {
+  opacity: 0;
+}
+
+.checkbox-label {
+  background: grey;
+  border-radius: 25px;
+  color: var(--text-main);
+  cursor: pointer;
+  display: block;
+  float: right;
+  font-weight: bold;
+  height: 30px;
+  position: relative;
+  text-indent: -400px;
+  width: 50px;
+}
+
+.checkbox-label:after {
+  background: #fff;
+  border-radius: 90px;
+  content: '';
+  height: 20px;
+  left: 5px;
+  position: absolute;
+  top: 5px;
+  transition: 0.3s; /* Acts on transform below */
+  width: 20px;
+}
+input:checked+label {
+  background: var(--active);
+}
+/* position  when active*/
+input:checked+label:after {
+  left: calc(100% - 5px);
+  transform: translateX(-100%);
+}
+
+.settings_block {
+  display: block;
+  padding: 5px 1em 20px 1em;
+  border-bottom: var(--dark-grey) solid 1px;
+}
+
+.settings_block h1 {
+  float: left;
+}
+
+.button {
+  border: var(--active) solid 1px;
+  color: var(--text-main);
+  display: block;
+  font-size: 12px;
+  font-weight: bold;
+  margin: var(--space) auto;
+  padding: 10px;
+  text-align: center;
+  text-decoration: none;
+}
+
+.button:hover {
+  background-color: var(--active);
+  color: #fff
+}
+