From d2f5a0cca14003bac8d6514d763f2f7df40fe57e Mon Sep 17 00:00:00 2001 From: kkapsner Date: Thu, 31 Dec 2015 13:37:27 +0100 Subject: [PATCH] Introduced stackList. --- canvasblocker.xpi | Bin 32523 -> 32991 bytes data/options.css | 4 ++ lib/lists.js | 26 +++++++++++++ lib/main.js | 12 +++--- lib/sharedFunctions.js | 83 ++++++++++++++++++++++++++++++++--------- package.json | 11 ++++++ 6 files changed, 112 insertions(+), 24 deletions(-) diff --git a/canvasblocker.xpi b/canvasblocker.xpi index 38f6ce590813cc94da72c2b014d7a0b156ee09bf..695cec8c0c021b5a44538d922c48223ea8c132c1 100644 GIT binary patch delta 7596 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 delta 7135 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 MhOuKE`Ty1RKdbZo`2YX_ diff --git a/data/options.css b/data/options.css index b219665..389cb42 100644 --- a/data/options.css +++ b/data/options.css @@ -13,4 +13,8 @@ setting[pref-name="showCallingFile"]{ setting[pref-name="showCompleteCallingStack"]{ border-top: 0px transparent none; padding-bottom: 0.5em; +} +setting[pref-name="stackList"]{ + border-top: 0px transparent none; + padding-bottom: 0.5em; } \ No newline at end of file diff --git a/lib/lists.js b/lib/lists.js index 296ec1b..49592f0 100644 --- a/lib/lists.js +++ b/lib/lists.js @@ -69,6 +69,32 @@ Object.keys(lists).forEach(function(type){ updateList(type); }); +function updateStackList(){ + try { + var data = JSON.parse(prefs.stackList); + if (!Array.isArray(data)){ + data = [data]; + } + var list = data.filter(function(entry){ + return typeof entry === "object" && typeof entry.url === "string"; + }); + } + catch(e){ + var list = []; + } + list.match = function(stack){ + return this.some(function(stackRule){ + return stack.match(stackRule); + }); + }; + lists.stack = list; +} +lists.stack = []; +preferences.on("stackList", function(){ + updateStackList(); +}); +updateStackList(); + exports.get = function getList(type){ "use strict"; diff --git a/lib/main.js b/lib/main.js index 505f1e7..35426b2 100644 --- a/lib/main.js +++ b/lib/main.js @@ -18,8 +18,8 @@ const preferences = require("sdk/simple-prefs"); const prefs = preferences.prefs; - function checkURL(url){ - var match = sharedFunctions.checkURL(url, prefs.blockMode).match(/^(block|allow|fake|ask)(|Readout|Everything|Context)$/); + function check(callingStack, url){ + var match = sharedFunctions.check(callingStack, url, prefs.blockMode).match(/^(block|allow|fake|ask)(|Readout|Everything|Context)$/); if (match){ return { type: (match[2] === "Everything" || match[2] === "")? @@ -53,17 +53,17 @@ enumerable: true, configureable: false, get: function(){ - var status = checkURL(window.location); + var callingStack = sharedFunctions.errorToCallingStack(new Error()); + var status = check(callingStack, window.location); if (status.type.indexOf(changedFunction.type) !== -1){ - var callingStackMsg = sharedFunctions.errorToCallingStackMsg(new Error()); if (status.mode === "ask"){ - status.mode = ask(window, changedFunction.type, this, callingStackMsg); + status.mode = ask(window, changedFunction.type, this, callingStack); } switch (status.mode){ case "allow": return original; case "fake": - notify(window, callingStackMsg); + notify(window, callingStack); return changedFunction.fake || undef; //case "block": default: diff --git a/lib/sharedFunctions.js b/lib/sharedFunctions.js index cb2cb98..945658f 100644 --- a/lib/sharedFunctions.js +++ b/lib/sharedFunctions.js @@ -23,6 +23,14 @@ var _ = function(name, replace){ return str; }; +function check(stack, url, blockMode){ + if (prefs.enableStackList && checkStack(stack)){ + return "allow"; + } + else { + return checkURL(url, blockMode); + } +} function checkURL(url, blockMode){ "use strict"; @@ -67,6 +75,11 @@ function checkURL(url, blockMode){ return mode; } +function checkStack(stack){ + "use strict"; + + return lists.get("stack").match(stack); +} // Stack parsing function parseStackEntry(entry){ @@ -75,17 +88,32 @@ function parseStackEntry(entry){ var m = /@(.*):(\d*):(\d*)$/.exec(entry) || ["", entry, "--", "--"]; return { url: m[1], - line: m[2], - column: m[3], + line: parseInt(m[2], 10), + column: parseInt(m[3], 10), raw: entry }; } +function stackRuleMatch(stackEntry, stackRule){ + if (!stackEntry){ + return false; + } + if (stackEntry.url !== stackRule.url){ + return false; + } + if ((typeof stackRule.line) !== "undefined" && stackEntry.line !== stackRule.line){ + return false; + } + if ((typeof stackRule.column) !== "undefined" && stackEntry.column !== stackRule.column){ + return false; + } + return true; +} + // parse calling stack -function errorToCallingStackMsg(error){ +function errorToCallingStack(error){ "use strict"; - var msg = ""; var callers = error.stack.trim().split("\n"); //console.log(callers); var findme = callers.shift(); // Remove us from the stack @@ -96,20 +124,39 @@ function errorToCallingStackMsg(error){ var doubleStackStart = caller.search(findme) !== -1; inDoubleStack = inDoubleStack || doubleStackStart; return !inDoubleStack; - }); - msg += "\n\n" + _("sourceOutput") + ": "; - if (prefs.showCompleteCallingStack){ - msg += callers.reduce(function(stack, c){ - return stack + "\n\t" + _("stackEntryOutput", parseStackEntry(c)); - }, ""); - } - else{ - msg += _("stackEntryOutput", parseStackEntry(callers[0])); - } - - return msg; + }).map(parseStackEntry); + return { + toString: function(){ + var msg = ""; + msg += "\n\n" + _("sourceOutput") + ": "; + if (prefs.showCompleteCallingStack){ + msg += callers.reduce(function(stack, c){ + return stack + "\n\t" + _("stackEntryOutput", c); + }, ""); + } + else{ + msg += _("stackEntryOutput", callers[0]); + } + + return msg; + }, + match: function(stackRule){ + if (typeof stackRule.stackPosition !== "undefined"){ + var pos = stackRule.stackPosition; + if (pos < 0){ + pos += callers.length; + } + return stackRuleMatch(callers[pos], stackRule); + } + else { + return callers.some(function(stackEntry){ + return stackRuleMatch(stackEntry, stackRule); + }); + } + } + }; } -exports.checkURL = checkURL; +exports.check = check; exports.parseStackEntry = parseStackEntry; -exports.errorToCallingStackMsg = errorToCallingStackMsg; \ No newline at end of file +exports.errorToCallingStack = errorToCallingStack; \ No newline at end of file diff --git a/package.json b/package.json index 7f1cd9c..c68cf64 100644 --- a/package.json +++ b/package.json @@ -91,6 +91,17 @@ "title": "Display complete calling stack", "type": "bool", "value": false + },{ + "name": "enableStackList", + "title": "Use script scoped white list", + "type": "bool", + "value": false + }, + { + "name": "stackList", + "title": "Script scoped white list", + "type": "string", + "value": "" } ], "main": "lib/main.js",