diff options
| -rw-r--r-- | bg/Storage.js | 79 | ||||
| -rw-r--r-- | main_background.js | 46 | 
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(); | 
