diff --git a/.vscode/settings.json b/.vscode/settings.json index e2bd649..4ada536 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,6 +28,7 @@ "spodermenpls", "unticking", "webgl", + "whitelisted", "yfdyh" ], "cSpell.language": "en,de,en-GB" diff --git a/_locales/de/messages.json b/_locales/de/messages.json index e802506..2f28af8 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -13,7 +13,11 @@ "description": "" }, "browserAction_title_notified": { - "message": "CanvasBlocker \n\nSchutz erfolgreich für:", + "message": " \n\nSchutz erfolgreich für:", + "description": "" + }, + "browserAction_title_whitelisted": { + "message": " (APIs erlaubt für {url})", "description": "" }, "browserAction_title_protectedAPIs": { diff --git a/_locales/en/messages.json b/_locales/en/messages.json index b27ae12..e8c9cbb 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -13,7 +13,11 @@ "description": "" }, "browserAction_title_notified": { - "message": "CanvasBlocker \n\nprotection successful for:", + "message": " \n\nprotection successful for:", + "description": "" + }, + "browserAction_title_whitelisted": { + "message": " (APIs whitelisted for {url})", "description": "" }, "browserAction_title_protectedAPIs": { diff --git a/icons/browserAction-whitelisted.svg b/icons/browserAction-whitelisted.svg new file mode 100644 index 0000000..bcf5f1a --- /dev/null +++ b/icons/browserAction-whitelisted.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/lib/main.js b/lib/main.js index bf7d323..5c0b389 100644 --- a/lib/main.js +++ b/lib/main.js @@ -65,7 +65,7 @@ notification.show(port.sender.tab.id, url, data["canvasBlocker-notify"].api); } if (data.hasOwnProperty("canvasBlocker-clear-page-action")){ - notification.hide(port.sender.tab.id); + notification.hide(port.sender.tab.id, url); } verbose("got data", data, "from port", port); }); diff --git a/lib/notification.js b/lib/notification.js index 0878cab..941285c 100644 --- a/lib/notification.js +++ b/lib/notification.js @@ -17,6 +17,27 @@ const lists = require("./lists"); const logging = require("./logging"); + function isWhitelisted(url){ + if (!(url instanceof URL)){ + url = new URL(url); + } + return lists.get("white").match(url) || + lists.get("sessionWhite").match(url) || + settings.get("blockMode", url).startsWith("allow"); + } + + function getBrowserActionIconName(tabData, notified){ + if (tabData.whitelisted){ + return "whitelisted"; + } + else if (notified) { + return settings.highlightBrowserAction; + } + else { + return "none"; + } + } + const paths = { pageAction: { none: "icons/pageAction-printed.svg", @@ -26,7 +47,8 @@ browserAction: { none: "icons/browserAction-notPrinted.svg", color: "icons/browserAction-printed.svg", - blink: "icons/browserAction-printedBlink.svg" + blink: "icons/browserAction-printedBlink.svg", + whitelisted: "icons/browserAction-whitelisted.svg" } }; @@ -34,12 +56,25 @@ color: "rgba(255, 0, 0, 0.6)" }); - const apiMap = new Map(); + const tabsData = new Map(); + function getTabData(tabId){ + let data = tabsData.get(tabId); + if (!data){ + data = { + url: "", + apis: new Set(), + whitelisted: false + }; + tabsData.set(tabId, data); + } + return data; + } scope.show = function showNotification(tabId, url, api){ if (settings.ignoredAPIs[api]){ return; } logging.notice("Show notification for tab", tabId); + const tabData = getTabData(tabId); if ( settings.get("showNotifications", url) && !lists.get("ignore").match(url) @@ -52,15 +87,11 @@ } browser.browserAction.setIcon({ tabId: tabId, - path: paths.browserAction[settings.highlightBrowserAction] + path: paths.browserAction[getBrowserActionIconName(tabData, true)] }); - let apis = apiMap.get(tabId); - if (!apis){ - apis = new Set(); - } + const apis = tabData.apis; apis.add(api); - apiMap.set(tabId, apis); if (settings.get("displayBadge", url)){ browser.browserAction.setBadgeText({ tabId: tabId, @@ -72,15 +103,27 @@ apis.forEach(function(api){ apiList += browser.i18n.getMessage("browserAction_title_protectedAPIs").replace(/{api}/g, api); }); + + let browserActionTitle = browser.i18n.getMessage("browserAction_title_default"); + if (tabData.whitelisted){ + browserActionTitle += browser.i18n.getMessage("browserAction_title_whitelisted").replace(/{url}/g, tabData.url); + } + browserActionTitle += browser.i18n.getMessage("browserAction_title_notified"); + browserActionTitle += apiList; browser.browserAction.setTitle({ tabId: tabId, - title: browser.i18n.getMessage("browserAction_title_notified") + apiList + title: browserActionTitle }); }; - scope.hide = function hideNotification(tabId){ + scope.hide = function hideNotification(tabId, url){ logging.notice("Hide page action for tab", tabId); - apiMap.delete(tabId); + // clear old data + tabsData.delete(tabId); + const tabData = getTabData(tabId); + tabData.url = url; + tabData.whitelisted = isWhitelisted(url); + browser.pageAction.hide(tabId); browser.pageAction.setIcon({ tabId: tabId, @@ -88,15 +131,19 @@ }); browser.browserAction.setIcon({ tabId: tabId, - path: paths.browserAction.none + path: paths.browserAction[getBrowserActionIconName(tabData, false)] }); browser.browserAction.setBadgeText({ tabId: tabId, text: "" }); + let browserActionTitle = browser.i18n.getMessage("browserAction_title_default"); + if (tabData.whitelisted){ + browserActionTitle += browser.i18n.getMessage("browserAction_title_whitelisted").replace(/{url}/g, url); + } browser.browserAction.setTitle({ tabId: tabId, - title: browser.i18n.getMessage("browserAction_title_default") + title: browserActionTitle }); }; @@ -112,7 +159,7 @@ }); browser.tabs.onRemoved.addListener(function(tabId){ - apiMap.delete(tabId); + tabsData.delete(tabId); }); settings.on("displayBadge", function({newValue}){ if (!newValue){ diff --git a/releaseNotes.txt b/releaseNotes.txt index 7a22846..49ee283 100644 --- a/releaseNotes.txt +++ b/releaseNotes.txt @@ -10,6 +10,7 @@ Version 0.5.4: - added protection for DOMRect (getClientRects) - added setting to control if notification details should be stored - state of the arrow for url specific values is saved + - browser action icon gets grayed out if the page is whitelisted fixes: - window and audio API were always blocked when using any of the "block ..." modes