diff --git a/lib/main.js b/lib/main.js index 39a0fba..fc3a46b 100644 --- a/lib/main.js +++ b/lib/main.js @@ -5,131 +5,141 @@ (function(){ "use strict"; - console.log("start main script"); - browser.runtime.onMessage.addListener(function(data){ - console.log("got data", data); - }); - browser.runtime.onConnect.addListener(function(port){ - console.log("got port", port); - port.postMessage({tabId: port.sender.tab.id}); - port.onMessage.addListener(function(data){ - browser.storage.local.get("showNotifications").then(function(data){ - // TODO: handle ignore list - if (!data.hasOwnProperty("showNotifications") || data.showNotifications){ - browser.pageAction.show(port.sender.tab.id); + function log(...args){ + args.unshift("main script:"); + args.unshift(new Date()); + console.log.apply(console, args); + } + + log("start"); + log("loading storage"); + browser.storage.local.get().then(function(data){ + Object.keys(data).forEach(function(key){ + settings[key] = data[key]; + }); + return settings; + }).then(function(settings){ + log("everything loaded"); + const lists = require("./lists"); + lists.updateAll(); + + log("build persistent storage"); + var persistentRnd = Object.create(null); + try { + let storedData = JSON.parse(settings.persistentRndStorage); + for (var domain in storedData){ + var value = storedData[domain]; + if ( + Array.isArray(value) && + value.length === 128 && + value.every(function(value){return typeof value === "number" && value >= 0 && value < 256;}) + ){ + persistentRnd[domain] = value; } - }) - console.log("got data", data, "from port", port); + } + } + catch(e){} + + function updateContentScripts(){ + log("update content scripts"); + log("build settings blob"); + var settingsBlob = new Blob( + [ + "var settings = " + JSON.stringify(settings) + ";", + "var persistentRnd = " + JSON.stringify(persistentRnd) + ";" + ], + { + type: "text/javascript" + } + ); + log("TODO: register content scripts -> have to wait for the API to be released"); + } + updateContentScripts(); + + log("register non port message listener"); + browser.runtime.onMessage.addListener(function(data){ + log("got data without port", data); + if (data["canvasBlocker-new-domain-rnd"]){ + log("got new domain rnd"); + data["canvasBlocker-set-domain-rnd"] = data["canvasBlocker-new-domain-rnd"]; + persistentRnd[data["canvasBlocker-new-domain-rnd"].domain] = data["canvasBlocker-new-domain-rnd"].rnd; + browser.storage.local.get("storePersistentRnd").then(function(prefs){ + if (prefs.storePersistentRnd){ + browser.storage.local.set({persistentRndStorage: JSON.stringify(persistentRnd)}); + } + }); + updateContentScripts(); + } + log("pass the message to the tabs"); + browser.tabs.query({}).then(function(tabs){ + tabs.forEach(function(tab){ + browser.tabs.sendMessage(tab.id, data); + }); + }); + }); + + log("register port listener"); + browser.runtime.onConnect.addListener(function(port){ + log("got port", port); + log("send back the tab id", port.sender.tab.id); + port.postMessage({tabId: port.sender.tab.id}); + var url = new URL(port.sender.url); + port.onMessage.addListener(function(data){ + browser.storage.local.get("showNotifications").then(function(data){ + if ( + ( + !data.hasOwnProperty("showNotifications") || + data.showNotifications + ) && + !lists.get("ignore").match(url) + ){ + browser.pageAction.show(port.sender.tab.id); + } + }) + log("got data", data, "from port", port); + }); + }); + + log("register storage change event listener"); + browser.storage.onChanged.addListener(function(change, area){ + if (area === "local"){ + log("settings changed", change); + log("update settings object"); + Object.keys(change).forEach(function(key){ + settings[key] = change[key].newValue; + }); + updateContentScripts(); + + if (change.hasOwnProperty("showNotifications") && !change.showNotifications.newValue){ + log("notifications were disabled -> hide all page actions"); + browser.tabs.query({}).then(function(tabs){ + tabs.forEach(function(tab){ + browser.pageAction.hide(tab.id); + }); + }); + } + if (change.hasOwnProperty("storePersistentRnd")){ + browser.storage.local.set({ + persistentRndStorage: change.storePersistentRnd.newValue? JSON.stringify(persistentRnd): "" + }); + } + } + }); + + // hide page action when a tab is refreshed + browser.tabs.onUpdated.addListener(function(tabId, data){ + if (data.status === "loading"){ + browser.pageAction.hide(tabId); + } }); }); - // hide all page actions when showNotifications is set to false - browser.storage.onChanged.addListener(function(change, area){ - if (area === "local" && change.hasOwnProperty("showNotifications") && !change.showNotifications.newValue){ - browser.tabs.query({}).then(function(tabs){ - tabs.forEach(function(tab){ - browser.pageAction.hide(tab.id); - }); - }); - } - }); - - // hide page action when a tab is refreshed - browser.tabs.onUpdated.addListener(function(tabId, data){ - if (data.status === "loading"){ - browser.pageAction.hide(tabId); - } - }); + log("TODO: register unload events - do not know how"); + // old code + // const {when: unload} = require("sdk/system/unload"); + // unload(function(){ + // processes.port.emit("canvasBlocker-unload"); + // }); - console.log("end main script"); - return null; - require("./stylePreferencePane"); - - - const {when: unload} = require("sdk/system/unload"); - const {notify} = require("./notifications"); - - const _ = require("sdk/l10n").get; - const lists = require("./lists"); - const preferences = require("sdk/simple-prefs"); - const prefs = preferences.prefs; - - require("./webExtension"); - - const notificationPref = { - doShow: function(){ - return prefs.showNotifications; - }, - setShow: function(value){ - prefs.showNotifications = value; - prefService.set("extensions.CanvasBlocker@kkapsner.de.showNotifications", prefs.showNotifications); - }, - displayTime: function(){ - return prefs.notificationDisplayTime; - } - }; - - const {processes, frames, remoteRequire} = require("sdk/remote/parent"); - // remoteRequire("./frame.js", module); // currently not working due to a regression in the SDK - var framePath = require("sdk/self").data.url("").replace(/data\/$/, "") + "lib/frame.js"; - remoteRequire(framePath); - - frames.port.on("canvasBlocker-notify", function(frame, data){ - notify(data, {lists, _, notificationPref, browser: frame.frameElement}); - }); - unload(function(){ - processes.port.emit("canvasBlocker-unload"); - }); - - // persistent rng - var persistentRnd = Object.create(null); - try { - let storedData = JSON.parse(prefs.persistentRndStorage); - for (var domain in storedData){ - var value = storedData[domain]; - if ( - Array.isArray(value) && - value.length === 128 && - value.every(function(value){return typeof value === "number" && value >= 0 && value < 256;}) - ){ - persistentRnd[domain] = value; - } - } - } - catch(e){} - - processes.port.on("canvasBlocker-new-domain-rnd", function(process, data){ - processes.port.emit("canvasBlocker-set-domain-rnd", data); - persistentRnd[data.domain] = data.rnd; - if (prefs.storePersistentRnd){ - prefs.persistentRndStorage = JSON.stringify(persistentRnd); - } - }); - processes.forEvery(function(process){ - if (process.isRemote){ - for (var domain in persistentRnd){ - process.port.emit("canvasBlocker-set-domain-rnd", {domain, rnd: persistentRnd[domain]}); - } - } - }); - preferences.on("storePersistentRnd", function(){ - if (prefs.storePersistentRnd){ - prefs.persistentRndStorage = JSON.stringify(persistentRnd); - } - else { - prefs.persistentRndStorage = ""; - } - }); - preferences.on("clearPersistentRnd", function(){ - persistentRnd = Object.create(null); - prefs.persistentRndStorage = ""; - processes.port.emit("canvasBlocker-clear-domain-rnd"); - }); - - // show release notes - var data = require("sdk/self").data; - preferences.on("showReleaseNotes", function(){ - var url = data.url("releaseNotes.txt").replace("/data/", "/"); - require("sdk/tabs").open(url); - }); + log("end"); }()); \ No newline at end of file diff --git a/lib/require.js b/lib/require.js index cf33e87..9646cb3 100644 --- a/lib/require.js +++ b/lib/require.js @@ -25,7 +25,7 @@ function require(module){ } else if (module === "sdk/l10n"){ return { - get: function(key){console.log(key); + get: function(key){ return browser.i18n.getMessage(key); } } diff --git a/manifest.json b/manifest.json index ce6488d..fc2bdf1 100644 --- a/manifest.json +++ b/manifest.json @@ -7,7 +7,12 @@ "homepage": "https://github.com/kkapsner/CanvasBlocker/", "version": "0.4.0-Development", "background": { - "scripts": ["lib/main.js"] + "scripts": [ + "lib/defaultSettings.js", + "lib/require.js", + "lib/lists.js", + "lib/main.js" + ] }, "content_scripts": [{ "matches": [""], diff --git a/options/options.js b/options/options.js index a2d8b72..b6d90a2 100644 --- a/options/options.js +++ b/options/options.js @@ -56,8 +56,8 @@ window.open("../releaseNotes.txt", "_blank"); }, clearPersistentRnd: function(){ - browser.runtime.sendMessage({"canvasBlocker-clear-domain-rnd": true}); browser.storage.local.set({persistentRndStorage: ""}); + browser.runtime.sendMessage({"canvasBlocker-clear-domain-rnd": true}); } }; Array.from(document.querySelectorAll("button.setting")).forEach(function(button){