aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bg/Storage.js79
-rw-r--r--main_background.js46
2 files changed, 89 insertions, 36 deletions
diff --git a/bg/Storage.js b/bg/Storage.js
new file mode 100644
index 0000000..1386538
--- /dev/null
+++ b/bg/Storage.js
@@ -0,0 +1,79 @@
+/**
+* GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+*
+* Copyright (C) 2018 Giorgio Maone <giorgio@maone.net>
+*
+* This file is part of GNU LibreJS.
+*
+* GNU LibreJS is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* GNU LibreJS is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with GNU LibreJS. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ A tiny wrapper around extensions storage API, supporting CSV serialization for
+ retro-compatibility
+*/
+
+var Storage = {
+ ARRAY: {
+ async load(key) {
+ let array = (await browser.storage.local.get(key))[key];
+ return array ? new Set(array) : new Set();
+ },
+ async save(key, list) {
+ return await browser.storage.local.set({[key]: [...list]});
+ },
+ },
+
+ CSV: {
+ async load(key) {
+ let csv = (await browser.storage.local.get(key))[key];
+ return csv ? new Set(csv.split(/\s*,\s*/)) : new Set();
+ },
+
+ async save(key, list) {
+ return await browser.storage.local.set({[key]: [...list].join(",")});
+ }
+ }
+};
+
+/**
+ A class to hold and persist blacklists and whitelists
+*/
+
+class ListStore {
+ constructor(key, storage = Storage.ARRAY) {
+ this.key = key;
+ this.storage = storage;
+ this.items = new Set();
+ }
+
+ async save() {
+ return await this.storage.save(this.key, this.items);
+ }
+
+ async load() {
+ return await this.storage.load(this.key);
+ }
+
+ async store(item) {
+ let size = this.items.size;
+ return (size !== this.items.add(item).size) && await this.save();
+ }
+
+ async remove(item) {
+ return this.items.delete(item) && await this.save();
+ }
+}
+
+module.exports = { ListStore, Storage };
diff --git a/main_background.js b/main_background.js
index ff68479..95ae39d 100644
--- a/main_background.js
+++ b/main_background.js
@@ -26,6 +26,7 @@ var jssha = require('jssha');
var walk = require("acorn/dist/walk");
var legacy_license_lib = require("./legacy_license_check.js");
var {ResponseProcessor} = require("./bg/ResponseProcessor");
+var {Storage, ListStore} = require("./bg/Storage");
console.log("main_background.js");
/**
@@ -502,6 +503,7 @@ function connected(p) {
return;
}
p.onMessage.addListener(function(m) {
+ console.debug("LibreJS BG: received message", m);
/**
* Updates the entry of the current URL in storage
*/
@@ -1271,12 +1273,14 @@ async function handle_html(response, whitelisted) {
return await edit_html(text, url, tabId, false);
}
+var pageWhitelist = new ListStore("pref_whitelist", Storage.CSV);
+
/**
* Initializes various add-on functions
* only meant to be called once when the script starts
*/
-function init_addon(){
-
+async function init_addon(){
+ await pageWhitelist.load();
set_webex();
webex.runtime.onConnect.addListener(connected);
webex.storage.onChanged.addListener(options_listener);
@@ -1352,45 +1356,15 @@ function inject_contact_finder(tab_id){
/**
* Adds given domain to the whitelist in options
*/
-function add_csv_whitelist(domain){
- function storage_got(items){
- if(items["pref_whitelist"] == ""){
- items["pref_whitelist"] = domain + "*";
- } else if(items["pref_whitelist"] == "undefined"){
- items["pref_whitelist"] = domain + "*";
- } else{
- items["pref_whitelist"] += "," + domain + "*";
- }
- dbg_print("New CSV whitelist:");
- dbg_print(items["pref_whitelist"]);
- webex.storage.local.set({"pref_whitelist":items["pref_whitelist"]});
- }
- webex.storage.local.get(storage_got);
+async function add_csv_whitelist(domain){
+ await pageWhitelist.store(`${domain}*`);
}
/**
* removes given domain from the whitelist in options
*/
-function remove_csv_whitelist(domain){
- function storage_got(items){
- if(items["pref_whitelist"] != ""){
- domain = domain + "\\*";
- domain.replace(/\./g,"\.");
- // remove domain
- dbg_print(new RegExp(domain,"g"));
- items["pref_whitelist"] = items["pref_whitelist"].replace(new RegExp(domain,"g"),"")
- // if an entry was deleted, it will leave an extra comma
- items["pref_whitelist"] = items["pref_whitelist"].replace(/,+/g,",");
- // remove trailing comma if the last one was deleted
- if(items["pref_whitelist"].charAt(items["pref_whitelist"].length-1) == ","){
- items["pref_whitelist"] = items["pref_whitelist"].substr(0,items["pref_whitelist"].length-2);
- }
- }
- dbg_print("New CSV whitelist:");
- dbg_print(items["pref_whitelist"]);
- webex.storage.local.set({"pref_whitelist":items["pref_whitelist"]});
- }
- webex.storage.local.get(storage_got);
+async function remove_csv_whitelist(domain) {
+ return pageWhitelist.remove(`${domain}*`);
}
init_addon();