From f185ad443b67b9051918c23c2734c0b2c9c1f1f7 Mon Sep 17 00:00:00 2001 From: kkapsner Date: Mon, 4 Aug 2014 17:02:42 +0200 Subject: [PATCH] PDF canvas support --- canvasblocker.xpi | Bin 9827 -> 10189 bytes data/inject.js | 75 +++++++++++++++++++++++++++------------------- lib/main.js | 12 ++++++++ package.json | 7 +++++ 4 files changed, 63 insertions(+), 31 deletions(-) diff --git a/canvasblocker.xpi b/canvasblocker.xpi index 37d4286507904ab821010c08e31487719aedef6c..c0a40347e30b22bf23837924c16750fad7d41c50 100644 GIT binary patch delta 3505 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 ZH4yaY75+grM%Z!yGH^Ii6wmLae*rmTMQs28 delta 3146 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 C>!4Hs diff --git a/data/inject.js b/data/inject.js index d934baf..02ba040 100644 --- a/data/inject.js +++ b/data/inject.js @@ -1,38 +1,51 @@ var getContext = unsafeWindow.HTMLCanvasElement.prototype.getContext; var askFunctionName = Math.random().toString(16); -function block(){ - // consoe.log("block"); - delete unsafeWindow.HTMLCanvasElement.prototype[askFunctionName]; - unsafeWindow.HTMLCanvasElement.prototype.getContext = null; +function checkPDF(blocking){ + if (unsafeWindow.document.contentType.match(/\/pdf$/i)){ + self.port.emit("isPDF", blocking); + return false; + } + return true; } -function ask(){ - // console.log("ask"); - - Object.defineProperty( - unsafeWindow.HTMLCanvasElement.prototype, - askFunctionName, - { - value: getContext, - enumerabe: false - } - ); - unsafeWindow.HTMLCanvasElement.prototype.getContext = new unsafeWindow.Function(function(){ - var oldBorder = this.style.border; - this.style.border = "2px dashed red"; - var confirmText = - this.parentNode? - "Do you want to allow the red bordered ?": - "Do you want to allow an invisibe ?"; - var allow = confirm(confirmText); - this.style.border = oldBorder; - if (allow){ - return this["askFunctionName"].apply(this, arguments); - } - else { - return null; - } - }.toString().replace(/^function\s*\(\)\s*\{|\}\s*$/g, "").replace("askFunctionName", askFunctionName)); + +function block(force){ + if (force || !checkPDF("block")){ + // consoe.log("block"); + delete unsafeWindow.HTMLCanvasElement.prototype[askFunctionName]; + unsafeWindow.HTMLCanvasElement.prototype.getContext = null; + } +} +function ask(force){ + if (force || !checkPDF("ask")){ + // console.log("ask"); + + Object.defineProperty( + unsafeWindow.HTMLCanvasElement.prototype, + askFunctionName, + { + value: getContext, + enumerabe: false + } + ); + unsafeWindow.HTMLCanvasElement.prototype.getContext = new unsafeWindow.Function(function(){ + var oldBorder = this.style.border; + this.style.border = "2px dashed red"; + var confirmText = + this.parentNode? + "Do you want to allow the red bordered ?": + "Do you want to allow an invisibe ?"; + var allow = confirm(confirmText); + this.style.border = oldBorder; + if (allow){ + this.getContext = this["askFunctionName"]; + return this["askFunctionName"].apply(this, arguments); + } + else { + return null; + } + }.toString().replace(/^function\s*\(\)\s*\{|\}\s*$/g, "").replace(/askFunctionName/g, askFunctionName)); + } } function unblock(){ // console.log("unblock"); diff --git a/lib/main.js b/lib/main.js index 8dea053..11ead3e 100644 --- a/lib/main.js +++ b/lib/main.js @@ -88,6 +88,10 @@ preferences.on("askPermission", function(){ } workers.forEach(checkWorker); }); +preferences.on("allowPDFCanvas", function(){ + workers.forEach(checkWorker); +}); + pageMod.PageMod({ include: "*", @@ -100,5 +104,13 @@ pageMod.PageMod({ worker.on("detach", function(){ detachWorker(this, workers); }); + worker.port.on("isPDF", function(blocking){ + if (prefs.allowPDFCanvas){ + worker.port.emit("unblock"); + } + else { + worker.port.emit(blocking, true); + } + }); }, }); \ No newline at end of file diff --git a/package.json b/package.json index 59ebd2b..a01241f 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,13 @@ "description": "If you want to be asked if you want to block a canvas element if the domain is neither in the white or black list.", "type": "bool", "value": true + }, + { + "name": "allowPDFCanvas", + "title": "Allow canvas in PDFs.", + "description": "The native pdf.js uses to display the PDF content. If this is unchecked there will lots of annoying ask dialogs.", + "type": "bool", + "value": true } ], "author": "Korbinian Kapsner",