CanvasBlocker/lib/lists.js

130 lines
2.9 KiB
JavaScript
Raw Normal View History

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
2017-06-25 22:33:12 +02:00
(function(){
"use strict";
2017-06-25 22:33:12 +02:00
2019-11-28 01:26:35 +01:00
let scope;
2017-06-25 22:33:12 +02:00
if ((typeof exports) !== "undefined"){
scope = exports;
}
else {
2019-03-12 22:24:23 +01:00
scope = require.register("./lists", {});
2017-06-25 22:33:12 +02:00
}
2019-11-28 01:26:35 +01:00
const settings = require("./settings");
2017-06-25 22:33:12 +02:00
function getDomainRegExpList(domainList){
2019-11-28 01:26:35 +01:00
const list = domainList
2017-06-25 22:33:12 +02:00
.split(",")
.map(function(entry){
return entry.replace(/^\s+|\s+$/g, "");
})
.filter(function(entry){
return !!entry.length;
})
.map(function(entry){
2019-11-28 01:26:35 +01:00
let regExp;
const domain = !!entry.match(/^[A-Za-z0-9_.-]+$/);
2017-06-25 22:33:12 +02:00
if (domain){
2017-10-03 15:35:31 +02:00
regExp = new RegExp("(?:^|\\.)" + entry.replace(/([\\+*?[^\]$(){}=!|.])/g, "\\$1") + "\\.?$", "i");
2017-06-25 22:33:12 +02:00
}
else {
regExp = new RegExp(entry, "i");
}
return {
match: function(url){
if (domain){
return (url.hostname || "").match(regExp);
}
else {
return url.href.match(regExp);
}
}
};
});
2017-06-25 22:33:12 +02:00
2018-07-17 13:07:50 +02:00
return addMatchToList(list);
}
function addMatchToList(list){
2017-10-05 19:00:00 +02:00
list.match = function(url){
return this.some(function(entry){
return entry.match(url);
});
};
return list;
2017-06-25 22:33:12 +02:00
}
2019-11-28 01:26:35 +01:00
const lists = {
2017-06-25 22:33:12 +02:00
white: [],
2018-07-17 13:07:50 +02:00
sessionWhite: [],
2017-06-25 22:33:12 +02:00
"ignore": [],
black: []
};
function updateList(type, value){
if (typeof value === "undefined"){
2017-11-07 00:36:44 +01:00
value = settings[type + "List"];
}
lists[type] = getDomainRegExpList(value);
return lists[type];
2017-06-25 22:33:12 +02:00
}
Object.keys(lists).forEach(function(type){
2017-11-07 00:36:44 +01:00
settings.on(type + "List", function({newValue}){
updateList(type, newValue);
2017-06-25 22:33:12 +02:00
});
2017-11-07 00:36:44 +01:00
updateList(type, settings[type + "List"]);
});
function updateStackList(value){
2019-11-28 01:26:35 +01:00
let list;
2017-06-25 22:33:12 +02:00
try {
2019-11-28 01:26:35 +01:00
let data = JSON.parse(value);
2017-06-25 22:33:12 +02:00
if (!Array.isArray(data)){
data = [data];
}
list = data.filter(function(entry){
return typeof entry === "object" && typeof entry.url === "string";
});
2015-12-31 13:37:27 +01:00
}
2019-11-28 01:26:35 +01:00
catch(error){
2017-06-25 22:33:12 +02:00
list = [];
}
list.match = function(stack){
return this.some(function(stackRule){
return stack.match(stackRule);
});
};
lists.stack = list;
2015-12-31 13:37:27 +01:00
}
2017-06-25 22:33:12 +02:00
lists.stack = [];
2017-11-07 00:36:44 +01:00
settings.on("stackList", function({newValue}){
updateStackList(newValue);
2017-06-25 22:33:12 +02:00
});
2017-11-07 00:36:44 +01:00
updateStackList(settings.stackList);
2015-12-31 13:37:27 +01:00
2017-06-25 22:33:12 +02:00
scope.get = function getList(type){
2018-07-17 13:07:50 +02:00
if (type === "white"){
2019-11-28 01:26:35 +01:00
const combined = lists.white.slice().concat(lists.sessionWhite);
2018-07-17 13:07:50 +02:00
return addMatchToList(combined);
}
2017-06-25 22:33:12 +02:00
return lists[type];
};
2019-12-28 23:23:55 +01:00
scope.appendTo = async function appendToList(type, entry){
2019-11-28 01:26:35 +01:00
const oldValue = settings[type + "List"];
2019-12-28 23:23:55 +01:00
await settings.set(type + "List", oldValue + (oldValue? ",": "") + entry);
return updateList(type);
2017-06-25 22:33:12 +02:00
};
scope.update = updateList;
scope.updateAll = function updateAllLists(){
updateList("white");
updateList("ignore");
updateList("black");
2017-11-07 00:36:44 +01:00
updateStackList(settings.stackList);
};
2017-11-07 00:36:44 +01:00
settings.onloaded(scope.updateAll);
2017-06-25 22:33:12 +02:00
}());