1
0
mirror of https://github.com/kkapsner/CanvasBlocker synced 2025-03-13 11:44:12 +01:00

Added fake for readPixels and removed new tab bug

Bug description: if a new tab is opened the wrong blockmode could be
used.
This commit is contained in:
kkapsner 2015-04-22 11:18:26 +02:00
parent a8f636ba6f
commit 30407e71a0
4 changed files with 169 additions and 113 deletions

Binary file not shown.

View File

@ -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;

View File

@ -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);

89
lib/sharedFunctions.js Normal file
View File

@ -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){}