aboutsummaryrefslogtreecommitdiff
path: root/main_background.js
diff options
context:
space:
mode:
Diffstat (limited to 'main_background.js')
-rw-r--r--main_background.js119
1 files changed, 53 insertions, 66 deletions
diff --git a/main_background.js b/main_background.js
index b02c639..62ff18e 100644
--- a/main_background.js
+++ b/main_background.js
@@ -181,7 +181,12 @@ function createReport(initializer = null) {
"unknown": [],
url: "",
};
- return initializer ? Object.assign(template, initializer) : template;
+ if (initializer) {
+ template = Object.assign(template, initializer);
+ }
+ template.site = ListStore.siteItem(template.url);
+ template.siteStatus = listManager.getStatus(template.site);
+ return template;
}
/**
@@ -189,19 +194,12 @@ function createReport(initializer = null) {
* by opening a new tab with whatever HTML is in the popup
* at the moment.
*/
-function open_popup_tab(data){
- dbg_print(data);
- function gotPopup(popupURL){
- var creating = webex.tabs.create({"url":popupURL},function(a){
- dbg_print("[TABID:"+a["id"]+"] creating unused data entry from parent window's content");
- unused_data[a["id"]] = createReport(data);
- });
- }
-
- var gettingPopup = webex.browserAction.getPopup({},gotPopup);
+async function openReportInTab(data) {
+ let popupURL = await browser.browserAction.getPopup({});
+ let tab = await browser.tabs.create({url: `${popupURL}#fromTab=${data.tabId}`});
+ unused_data[tab.id] = createReport(data);
}
-
/**
*
* Clears local storage (the persistent data)
@@ -246,10 +244,10 @@ function debug_print_local(){
*/
function updateReport(tabId, oldReport, updateUI = false){
let {url} = oldReport;
- let newReport = createReport({url});
+ let newReport = createReport({url, tabId});
for (let property of Object.keys(oldReport)) {
- if (property === "url") continue;
let entries = oldReport[property];
+ if (!Array.isArray(entries)) continue;
let defValue = property === "accepted" || property === "blocked" ? property : "unknown";
for (let script of entries) {
let status = listManager.getStatus(script[0], defValue);
@@ -278,7 +276,7 @@ function updateReport(tabId, oldReport, updateUI = false){
* "url": "https://example.com/js/jquery.js"
* }
*
-* Returns either "wl" (whitelisted), "bl" (blacklisted) or "unknown".
+* Returns either "whitelisted, "blacklisted", "blocked", "accepted" or "unknown"
*
* NOTE: This WILL break if you provide inconsistent URLs to it.
* Make sure it will use the right URL when refering to a certain script.
@@ -308,11 +306,10 @@ async function addReportEntry(tabId, scriptHashOrUrl, action, update = false) {
return true;
}
- let entryType, res;
+ let entryType;
let scriptName = actionValue[0];
try {
entryType = listManager.getStatus(scriptName, type);
- res = entryType.substring(0, 2);
let entries = unused_data[tabId][entryType];
if(isNew(entries, scriptName)){
dbg_print(unused_data);
@@ -322,9 +319,18 @@ async function addReportEntry(tabId, scriptHashOrUrl, action, update = false) {
}
} catch (e) {
console.error("action %o, type %s, entryType %s", action, type, entryType, e);
- res = "unknown";
+ entryType = "unknown";
+ }
+
+ if (active_connections[tabId]) {
+ try {
+ active_connections[tabId].postMessage({show_info: unused_data[tabId]});
+ } catch(e) {
+ console.error(e);
+ }
}
- return res;
+
+ return entryType;
}
@@ -364,14 +370,15 @@ function connected(p) {
for (let action of ["whitelist", "blacklist", "forget"]) {
if (m[action]) {
- await listManager[action](m[action][0]);
+ let [key] = m[action];
+ if (m.site) key = ListStore.siteItem(key);
+ await listManager[action](key);
update = true;
}
}
- //
- if(m["open_popup_tab"] !== undefined){
- open_popup_tab(m["open_popup_tab"]);
+ if(m.report_tab){
+ openReportInTab(m.report_tab);
}
// a debug feature
if(m["printlocalstorage"] !== undefined){
@@ -388,17 +395,7 @@ function connected(p) {
console.log("Delete local storage");
debug_delete_local();
}
- // Add this domain to the whitelist
- if(m.allow_all){
- await listManager.whitelist(ListStore.siteItem(m.allow_all.url));
- update = true;
- }
- // Remove this domain from the whitelist
- if(m.block_all){
- await listManager.forget(ListStore.siteItem(m.block_all.url));
- update = true;
- }
-
+
let tabs = await browser.tabs.query({active: true, currentWindow: true});
if(contact_finder){
@@ -406,11 +403,11 @@ function connected(p) {
dbg_print(`[TABID:${tab.id}] Injecting contact finder`);
//inject_contact_finder(tabs[0]["id"]);
}
- if(update){
- let tab = tabs.pop();
- dbg_print(`%c updating tab ${tab.id}`, "color: red;");
- active_connections[tab.id] = p;
- await updateReport(tab.id, unused_data[tab.id], true);
+ if (update || m.update && unused_data[m.tabId]) {
+ let tabId = "tabId" in m ? m.tabId : tabs.pop().id;
+ dbg_print(`%c updating tab ${tabId}`, "color: red;");
+ active_connections[tabId] = p;
+ await updateReport(tabId, unused_data[tabId], true);
} else {
for(let tab of tabs) {
if(unused_data[tab.id]){
@@ -419,7 +416,7 @@ function connected(p) {
p.postMessage({"show_info": unused_data[tab.id]});
} else{
// create a new entry
- let report = unused_data[tab.id] = createReport({"url": tab.url});
+ let report = unused_data[tab.id] = createReport({"url": tab.url, tabId: tab.id});
p.postMessage({show_info: report});
dbg_print(`[TABID: ${tab.id}] No data found, creating a new entry for this window.`);
}
@@ -757,14 +754,15 @@ async function get_script(response, url, tabId, whitelisted = false, index = -1)
function result(scriptSource) {
return index === -1 ? scriptSource : [scriptSource, index];
}
- let report = unused_data[tabId] || (unused_data[tabId] = createReport({url}));
+ let report = unused_data[tabId] || (unused_data[tabId] = createReport({url, tabId}));
let scriptName = url.split("/").pop();
if (whitelisted) {
+ let site = ListStore.siteItem(url);
// Accept without reading script, it was explicitly whitelisted
- let reason = response.whitelistedSite
- ? "Site ${response.whitelistedSite} whitelisted by user"
- : "Page whitelisted by user";
+ let reason = whitelist.contains(site)
+ ? `All ${site} whitelisted by user`
+ : "Address whitelisted by user";
addReportEntry(tabId, url, {"whitelisted": [url, reason], url});
return result(`/* LibreJS: script whitelisted by user preference. */\n${response}`);
}
@@ -783,13 +781,14 @@ async function get_script(response, url, tabId, whitelisted = false, index = -1)
tabId
});
}
- let listVerdict = await addReportEntry(tabId, sourceHash, {"url": domain, [verdict ? "accepted" : "blocked"]: [url, reason]});
- switch(listVerdict) {
- case "wl": case "bl":
- let verdictText = listVerdict === "wl" ? "whitelisted" : "blacklisted";
- return result(`/* LibreJS: script ${verdictText} by user. */\n${response}`);
+ let category = await addReportEntry(tabId, sourceHash, {"url": domain, [verdict ? "accepted" : "blocked"]: [url, reason]});
+ let scriptSource = verdict ? response : editedSource;
+ switch(category) {
+ case "blacklisted":
+ case "whitelisted":
+ return result(`/* LibreJS: script ${category} by user. */\n${scriptSource}`);
default:
- return result(`/* LibreJS: script aknowledged. */\n${editedSource}`);
+ return result(`/* LibreJS: script ${category}. */\n${scriptSource}`);
}
}
@@ -849,6 +848,7 @@ var ResponseHandler = {
let blacklistedSite = blacklist.contains(site);
let blacklisted = blacklistedSite || blacklist.contains(url);
let topUrl = request.frameAncestors && request.frameAncestors.pop() || request.documentUrl;
+
if (blacklisted) {
if (type === "script") {
// abort the request before the response gets fetched
@@ -863,7 +863,6 @@ var ResponseHandler = {
});
} else {
let whitelistedSite = whitelist.contains(site);
- if (whitelistedSite) response.whitelistedSite = site;
if ((response.whitelisted = (whitelistedSite || whitelist.contains(url)))
&& type === "script") {
// accept the script and stop processing
@@ -872,6 +871,7 @@ var ResponseHandler = {
return ResponseProcessor.ACCEPT;
}
}
+
// it's a page (it's too early to report) or an unknown script:
// let's keep processing
return ResponseProcessor.CONTINUE;
@@ -893,7 +893,8 @@ var ResponseHandler = {
async function handle_script(response, whitelisted){
let {text, request} = response;
let {url, tabId} = request;
- return await get_script(text, url, tabId, whitelisted, -2);
+ let edited = await get_script(text, url, tabId, whitelisted, -2);
+ return Array.isArray(edited) ? edited[0] : edited;
}
/**
@@ -1128,18 +1129,4 @@ function inject_contact_finder(tab_id){
var executing = webex.tabs.executeScript(tab_id, {file: "/contact_finder.js"}, executed);
}
-/**
-* Adds given domain to the whitelist in options
-*/
-async function add_csv_whitelist(domain){
- return await whitelist.store(`${domain}*`);
-}
-
-/**
-* removes given domain from the whitelist in options
-*/
-async function remove_csv_whitelist(domain) {
- return whitelist.remove(`${domain}*`);
-}
-
init_addon();