diff --git a/_locales/de/messages.json b/_locales/de/messages.json index d44dfc1..c9fa4c3 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -193,6 +193,15 @@ "description": "" }, + "useCanvasCache_title": { + "message": "Zwischenspeicher für Canvas verwenden", + "description": "" + }, + "useCanvasCache_description": { + "message": "Aktiviert den Canvas-Zwischenspeicher. Dies kann die Detektion des Addons verhindern und kann die Geschwindigkeit des Addons erhöhen, wenn kleine Canvas oft ausgelesen werden. Für große Canvas wird die Geschwindigkeit leider reduziert.", + "description": "" + }, + "disableNotifications": { "message": "Benachrichtigungen deaktivieren", "description": "" diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 117b9b0..89ab240 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -193,6 +193,15 @@ "description": "" }, + "useCanvasCache_title": { + "message": "Use canvas cache", + "description": "" + }, + "useCanvasCache_description": { + "message": "Enables the canvas cache. This can prevent detection and increases the performance when small canvas are read several times but decreases it for big canvas.", + "description": "" + }, + "disableNotifications": { "message": "disable notifications", "description": "" diff --git a/lib/defaultSettings.js b/lib/defaultSettings.js index 4bc64c5..659d183 100644 --- a/lib/defaultSettings.js +++ b/lib/defaultSettings.js @@ -7,7 +7,8 @@ var settings = { blockMode: "fakeReadout", minFakeSize: 1, maxFakeSize: 0, - rng: "constant", + rng: "nonPersistent", + useCanvasCache: true, ignoreFrequentColors: 0, persistentRndStorage: "", storePersistentRnd: false, diff --git a/lib/modifiedAPI.js b/lib/modifiedAPI.js index 0be8e0f..ba5f3e3 100644 --- a/lib/modifiedAPI.js +++ b/lib/modifiedAPI.js @@ -54,8 +54,16 @@ }; } + var canvasCache = Object.create(null); function getFakeCanvas(window, original, prefs){ try { + if (prefs("useCanvasCache")){ + var originalDataURL = original.toDataURL(); + var cached = canvasCache[originalDataURL]; + if (cached){ + return cached; + } + } // original may not be a canvas -> we must not leak an error var context = getContext(window, original); var {imageData, source} = getImageData(window, context); @@ -86,6 +94,9 @@ var canvas = original.cloneNode(true); context = window.HTMLCanvasElement.prototype.getContext.call(canvas, "2d"); context.putImageData(imageData, 0, 0); + if (prefs("useCanvasCache")){ + canvasCache[originalDataURL] = canvas; + } return canvas; } catch (e){ diff --git a/options/buildPrefInputs.js b/options/buildPrefInputs.js index 9883436..e81a4f5 100644 --- a/options/buildPrefInputs.js +++ b/options/buildPrefInputs.js @@ -139,6 +139,15 @@ document.body.appendChild(table); "blockMode": ["fakeReadout"] } }, + { + "name": "useCanvasCache", + "title": "Use canvas cache", + "type": "bool", + "value": true, + "displayDependencies": { + "blockMode": ["fakeReadout"] + } + }, { "name": "askOnlyOnce", "title": "Ask only once", diff --git a/releaseNotes.txt b/releaseNotes.txt index 1f7a0cf..0b2ded9 100644 --- a/releaseNotes.txt +++ b/releaseNotes.txt @@ -16,6 +16,7 @@ Version 0.4.0: * setting to enable the inspection of the content of the faked canvas * new random number generator "constant" * setting to not fake the most frequent colors in a canvas + * setting to enable canvas cache fixes: - ask mode did not work for input types