From 2e91f85d8f3d32b45eaa4a9b9e5e9fcdc806420e Mon Sep 17 00:00:00 2001 From: kkapsner Date: Mon, 1 Jun 2020 14:25:47 +0200 Subject: [PATCH] Added offscreen canvas protection Fixes #467 --- lib/intercept.js | 6 +++++ lib/modifiedCanvasAPI.js | 51 ++++++++++++++++++++++++++++++++++++++- lib/settingDefinitions.js | 4 ++- releaseNotes.txt | 1 + 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/lib/intercept.js b/lib/intercept.js index 024b13f..cd5ce96 100644 --- a/lib/intercept.js +++ b/lib/intercept.js @@ -84,6 +84,9 @@ const forEachFunction = function(windowToProcess, callback){ apiNames.forEach(function(name){ const changedFunction = changedFunctions[name]; + if (changedFunction.name){ + name = changedFunction.name; + } getAllFunctionObjects(windowToProcess, changedFunction).forEach(function(object){ if (object){ callback({name, object: object, changedFunction}); @@ -317,6 +320,9 @@ function interceptFunctions(windowToProcess, siteStatus, {checkStack, ask, notify, prefs}){ apiNames.forEach(function(name){ const changedFunction = changedFunctions[name]; + if (changedFunction.name){ + name = changedFunction.name; + } const functionStatus = changedFunction.getStatus(undefined, siteStatus, prefs); logging.verbose("status for", name, ":", functionStatus); if (!functionStatus.active) return; diff --git a/lib/modifiedCanvasAPI.js b/lib/modifiedCanvasAPI.js index d1c1169..b05bbf1 100644 --- a/lib/modifiedCanvasAPI.js +++ b/lib/modifiedCanvasAPI.js @@ -244,6 +244,34 @@ } } + function offscreenToBlobCallback(args, check){ + const {prefs, notify, window, original} = check; + if (canvasSizeShouldBeFaked(this, prefs)){ + try { + const options = args[0]; + const canvas = window.document.createElement("canvas"); + canvas.width = this.width; + canvas.height = this.height; + const context = canvas.getContext("2d"); + context.drawImage(this.transferToImageBitmap(), 0, 0); + const fakeCanvas = getFakeCanvas(window, canvas, prefs); + if (fakeCanvas !== canvas){ + notify("fakedReadout"); + } + return new window.Promise(function(resolve){ + fakeCanvas.toBlob(resolve, options && options.type, options && options.quality); + }); + } + catch (error){ + logging.warning("Error while faking:", error); + return original.call(this, ...args); + } + } + else { + return original.call(this, ...args); + } + } + const isPointCache = Object.create(null); function getIsPointCacheIndex(x, y, values){ return String.fromCodePoint(...values, x, y); @@ -496,7 +524,28 @@ }); }; } - } + }, + convertToBlob: { + type: "readout", + getStatus: createGetStatus("readout"), + object: ["OffscreenCanvas"], + fakeGenerator: function(checker){ + return function convertToBlob(){ + return checkerWrapper(checker, this, arguments, offscreenToBlobCallback); + }; + } + }, + offscreenToBlob: { + name: "toBlob", + type: "readout", + getStatus: createGetStatus("readout"), + object: ["OffscreenCanvas"], + fakeGenerator: function(checker){ + return function toBlob(){ + return checkerWrapper(checker, this, arguments, offscreenToBlobCallback); + }; + } + }, }; Object.keys(scope.changedFunctions).forEach(function(key){ scope.changedFunctions[key].api = "canvas"; diff --git a/lib/settingDefinitions.js b/lib/settingDefinitions.js index 4bb3a9c..879c985 100644 --- a/lib/settingDefinitions.js +++ b/lib/settingDefinitions.js @@ -93,7 +93,9 @@ {name: "Canvas-API", level: 1}, "getContext @ canvas", {message: "readout", level: 2}, - "toDataURL @ canvas", "toBlob @ canvas", "mozGetAsFile @ canvas", "getImageData @ canvas", + "toDataURL @ canvas", + "toBlob @ canvas", "convertToBlob @ canvas", "mozGetAsFile @ canvas", + "getImageData @ canvas", "isPointInPath @ canvas", "isPointInStroke @ canvas", {message: "input", level: 2}, "fillText @ canvas", "strokeText @ canvas", diff --git a/releaseNotes.txt b/releaseNotes.txt index 26820c1..a76b98e 100644 --- a/releaseNotes.txt +++ b/releaseNotes.txt @@ -4,6 +4,7 @@ Version 1.3: new features: - added link to FAQ + - added offscreen canvas protection fixes: -