diff --git a/canvasblocker.xpi b/canvasblocker.xpi index b7de47a..12b26bf 100644 Binary files a/canvasblocker.xpi and b/canvasblocker.xpi differ diff --git a/data/inject.js b/data/inject.js index 7112e2d..f5c6fbd 100644 --- a/data/inject.js +++ b/data/inject.js @@ -171,7 +171,15 @@ }, readPixels: { mode: blockMode.readAPI, - object: unsafeWindow.WebGLRenderingContext + object: unsafeWindow.WebGLRenderingContext, + fake: function(x, y, width, height, format, type, pixels){ + // fake not working due to XRay copy restrictions... + // for (var i = 0; i < pixels.length; i += 1){ + // pixels[i] = Math.floor( + // Math.random() * 256 + // ); + // } + } } }; @@ -253,37 +261,56 @@ // Communication with main.js - self.port.on("block", function(){ - blockMode.getContext.status = "block"; - blockMode.readAPI.status = "allow"; - }); - self.port.on("ask", function(askOnce){ - blockMode.getContext.status = "ask"; - blockMode.getContext.askStatus.askOnce = askOnce; - blockMode.readAPI.status = "allow"; - }); - self.port.on("blockReadout", function(){ - blockMode.getContext.status = "allow"; - blockMode.readAPI.status = "block"; - }); - self.port.on("fakeReadout", function(){ - blockMode.getContext.status = "allow"; - blockMode.readAPI.status = "fake"; - }); - self.port.on("askReadout", function(askOnce){ - blockMode.getContext.status = "allow"; - blockMode.readAPI.status = "ask"; - blockMode.readAPI.askStatus.askOnce = askOnce; - }); - self.port.on("unblock", function(){ - blockMode.getContext.status = "allow"; - blockMode.readAPI.status = "allow"; - }); - self.port.on("detach", function(){ - blockMode.getContext.status = "allow"; - blockMode.readAPI.status = "allow"; + function setStatus(mode, askOnce){ + switch (mode){ + case "block": + blockMode.getContext.status = "block"; + blockMode.readAPI.status = "allow"; + break; + case "ask": + blockMode.getContext.status = "ask"; + blockMode.getContext.askStatus.askOnce = askOnce; + blockMode.readAPI.status = "allow"; + break; + case "blockReadout": + blockMode.getContext.status = "allow"; + blockMode.readAPI.status = "block"; + break; + case "fakeReadout": + blockMode.getContext.status = "allow"; + blockMode.readAPI.status = "fake"; + break; + case "askReadout": + blockMode.getContext.status = "allow"; + blockMode.readAPI.status = "ask"; + blockMode.readAPI.askStatus.askOnce = askOnce; + break; + case "unblock": + blockMode.getContext.status = "allow"; + blockMode.readAPI.status = "allow"; + break; + case "detach": + blockMode.getContext.status = "allow"; + blockMode.readAPI.status = "allow"; + break; + } + } + ["block", "ask", "blockReadout", "fakeReadout", "askReadout", "unblock", "detach"].forEach(function(mode){ + self.port.on(mode, function(askOnce){ + setStatus(mode, askOnce); + }); }); + setStatus( + checkURL( + location, + self.options.blockMode, + getDomainRegExpList(self.options.whiteList), + getDomainRegExpList(self.options.blackList) + ), + self.options.askOnce + ); + // settings passthrough self.port.on("set", function(name, value){ settings[name] = value; diff --git a/lib/main.js b/lib/main.js index 9413bee..a144043 100644 --- a/lib/main.js +++ b/lib/main.js @@ -4,46 +4,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ (function(){ "use strict"; - - function getDomainRegExpList(domainList){ - var list = domainList - .split(",") - .map(function(entry){ - return entry.replace(/^\s+|\s+$/g, ""); - }) - .filter(function(entry){ - return !!entry.length; - }) - .map(function(entry){ - var regExp; - var domain = !!entry.match(/^[\w.]+$/); - if (domain){ - regExp = new RegExp("(?:^|\\.)" + entry.replace(/([\\\+\*\?\[\^\]\$\(\)\{\}\=\!\|\.])/g, "\\$1") + "\\.?$", "i"); - } - else { - regExp = new RegExp(entry, "i"); - } - return { - match: function(url){ - if (domain){ - return url.hostname.match(regExp); - } - else { - return url.href.match(regExp); - } - } - }; - }); - - list.match = function(url){ - return this.some(function(entry){ - return entry.match(url); - }); - }; - - return list; - } - + var self = require("sdk/self"); var pageMod = require("sdk/page-mod"); var array = require("sdk/util/array"); @@ -55,6 +16,8 @@ var tabUtils = require("sdk/tabs/utils"); var windowUtils = require("sdk/window/utils"); + var sharedFunctions = require("./sharedFunctions.js"); + var getDomainRegExpList = sharedFunctions.getDomainRegExpList; // preferences Object.keys(prefs).forEach(function(pref){ preferences.on(pref, function(){ @@ -90,48 +53,7 @@ }); function checkURL(url){ - var mode = "block"; - switch (prefs.blockMode){ - case "blockEverything": - mode = "block"; - break; - case "allowOnlyWhiteList": - if (whiteList.match(url)){ - mode = "unblock"; - } - else { - mode = "block"; - } - break; - case "ask": - case "blockReadout": - case "fakeReadout": - case "askReadout": - if (whiteList.match(url)){ - mode = "unblock"; - } - else if (blackList.match(url)){ - mode = "block"; - } - else { - mode = prefs.blockMode; - } - break; - case "blockOnlyBlackList": - if (blackList.match(url)){ - mode = "block"; - } - else { - mode = "unblock"; - } - break; - case "allowEverything": - mode = "unblock"; - break; - default: - console.log("Unknown blocking mode. Default to block everything."); - } - return mode; + return sharedFunctions.checkURL(url, prefs.blockMode, whiteList, blackList); } function checkWorker(worker){ try { @@ -154,10 +76,28 @@ } var workers = []; + var workerOptions = { + blockMode: checkURL(), + whiteList: prefs.whiteList, + blackList: prefs.blackList, + askOnce: prefs.askOnce + }; + preferences.on("blockMode", function(){ + workerOptions.blockMode = checkURL(); + }); + ["whiteList", "blackList", "askOnce"].forEach(function(prefName){ + preferences.on(prefName, function(){ + workerOptions[prefName] = prefs[prefName]; + }); + }); pageMod.PageMod({ include: "*", contentScriptWhen: "start", - contentScriptFile: self.data.url("inject.js"), + contentScriptFile: [ + self.data.url("sharedFunctions.js").replace("/data/", "/lib/"), + self.data.url("inject.js"), + ], + contentScriptOptions: workerOptions, onAttach: function(worker){ array.add(workers, worker); diff --git a/lib/sharedFunctions.js b/lib/sharedFunctions.js new file mode 100644 index 0000000..ad69c34 --- /dev/null +++ b/lib/sharedFunctions.js @@ -0,0 +1,89 @@ +function getDomainRegExpList(domainList){ + var list = domainList + .split(",") + .map(function(entry){ + return entry.replace(/^\s+|\s+$/g, ""); + }) + .filter(function(entry){ + return !!entry.length; + }) + .map(function(entry){ + var regExp; + var domain = !!entry.match(/^[\w.]+$/); + if (domain){ + regExp = new RegExp("(?:^|\\.)" + entry.replace(/([\\\+\*\?\[\^\]\$\(\)\{\}\=\!\|\.])/g, "\\$1") + "\\.?$", "i"); + } + else { + regExp = new RegExp(entry, "i"); + } + return { + match: function(url){ + if (domain){ + return url.hostname.match(regExp); + } + else { + return url.href.match(regExp); + } + } + }; + }); + + list.match = function(url){ + return this.some(function(entry){ + return entry.match(url); + }); + }; + + return list; +} + +function checkURL(url, blockMode, whiteList, blackList){ + var mode = "block"; + switch (blockMode){ + case "blockEverything": + mode = "block"; + break; + case "allowOnlyWhiteList": + if (url && whiteList.match(url)){ + mode = "unblock"; + } + else { + mode = "block"; + } + break; + case "ask": + case "blockReadout": + case "fakeReadout": + case "askReadout": + if (url && whiteList.match(url)){ + mode = "unblock"; + } + else if (url && blackList.match(url)){ + mode = "block"; + } + else { + mode = blockMode; + } + break; + case "blockOnlyBlackList": + if (url && blackList.match(url)){ + mode = "block"; + } + else { + mode = "unblock"; + } + break; + case "allowEverything": + mode = "unblock"; + break; + default: + console.log("Unknown blocking mode (" + blockMode + "). Default to block everything."); + } + return mode; +} + +try { + exports.getDomainRegExpList = getDomainRegExpList; + exports.checkURL = checkURL; +} +catch(e){} \ No newline at end of file