From df1d59cf524c1788e72bbd068ff382952e8f2b55 Mon Sep 17 00:00:00 2001 From: kkapsner Date: Wed, 5 Sep 2018 15:53:01 +0200 Subject: [PATCH] Added support for pixel fractions Pixel fractions can be controlled by CSS. These fractions must not be faked. For #236. --- _locales/en/messages.json | 9 +++++++++ lib/intercept.js | 2 +- lib/modifiedDOMRectAPI.js | 26 +++++++++++++------------- lib/settingDefinitions.js | 4 ++++ options/settingsDisplay.js | 7 +++++++ 5 files changed, 34 insertions(+), 14 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index fbbb1b0..2742f56 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -898,6 +898,15 @@ "description": "" }, + "domRectIntegerFactor_title": { + "message": "DOMRect integer factor", + "description": "" + }, + "domRectIntegerFactor_description": { + "message": "Some fraction of a pixel can be controlled by CSS. To prevent detection values of a DOMRect that multiplied with this factor are integers will not be altered.", + "description": "" + }, + "theme_title": { "message": "Theme", "description": "" diff --git a/lib/intercept.js b/lib/intercept.js index c5055ef..11a2137 100644 --- a/lib/intercept.js +++ b/lib/intercept.js @@ -337,7 +337,7 @@ descriptor.get = exportFunction(getter, window); if (descriptor.hasOwnProperty("set") && changedGetter.setterGenerator){ - const setter = changedGetter.setterGenerator(window, descriptor.set); + const setter = changedGetter.setterGenerator(window, descriptor.set, prefs); descriptor.set = exportFunction(setter, window); } diff --git a/lib/modifiedDOMRectAPI.js b/lib/modifiedDOMRectAPI.js index ca8a3f6..9208d9c 100644 --- a/lib/modifiedDOMRectAPI.js +++ b/lib/modifiedDOMRectAPI.js @@ -45,11 +45,11 @@ function getDOMRectRegistration(domRect){ return registeredRects.get(getWrapped(domRect)); } - function getFakeDomRect(window, domRect, notify){ + function getFakeDomRect(window, domRect, prefs, notify){ var rng = randomSupply.getRng(4, window); function getFakeValue(value, i){ - if (value % 1 === 0){ + if ((value * prefs("domRectIntegerFactor", window.location)) % 1 === 0){ return value; } else { @@ -159,17 +159,17 @@ if (prefs("protectDOMRect", window.location)){ const registration = getDOMRectRegistration(this); if (registration){ - return getFakeDomRect(window, this, registration.notify)[property]; + return getFakeDomRect(window, this, prefs, registration.notify)[property]; } } return originalValue; }; } - function setProperty(domRect, window, original, newValue, property){ // eslint-disable-line max-params + function setProperty(domRect, window, original, newValue, property, prefs){ // eslint-disable-line max-params const registration = getDOMRectRegistration(domRect); if (registration){ - const fakeDomRect = getFakeDomRect(window, domRect, registration.notify); + const fakeDomRect = getFakeDomRect(window, domRect, prefs, registration.notify); registeredRects.delete(getWrapped(domRect)); ["x", "y", "width", "height"].forEach(function(prop){ if (prop === property){ @@ -200,10 +200,10 @@ }; return Object.getOwnPropertyDescriptor(temp, "x").get; }, - setterGenerator: function(window, original){ + setterGenerator: function(window, original, prefs){ const temp = { set x(x){ - setProperty(this, window, original, x, "x"); + setProperty(this, window, original, x, "x", prefs); } }; return Object.getOwnPropertyDescriptor(temp, "x").set; @@ -223,10 +223,10 @@ }; return Object.getOwnPropertyDescriptor(temp, "y").get; }, - setterGenerator: function(window, original){ + setterGenerator: function(window, original, prefs){ const temp = { set y(y){ - setProperty(this, window, original, y, "y"); + setProperty(this, window, original, y, "y", prefs); } }; return Object.getOwnPropertyDescriptor(temp, "y").set; @@ -246,10 +246,10 @@ }; return Object.getOwnPropertyDescriptor(temp, "width").get; }, - setterGenerator: function(window, original){ + setterGenerator: function(window, original, prefs){ const temp = { set width(width){ - setProperty(this, window, original, width, "width"); + setProperty(this, window, original, width, "width", prefs); } }; return Object.getOwnPropertyDescriptor(temp, "width").set; @@ -269,10 +269,10 @@ }; return Object.getOwnPropertyDescriptor(temp, "height").get; }, - setterGenerator: function(window, original){ + setterGenerator: function(window, original, prefs){ const temp = { set height(height){ - setProperty(this, window, original, height, "height"); + setProperty(this, window, original, height, "height", prefs); } }; return Object.getOwnPropertyDescriptor(temp, "height").set; diff --git a/lib/settingDefinitions.js b/lib/settingDefinitions.js index ef530f3..7ee596d 100644 --- a/lib/settingDefinitions.js +++ b/lib/settingDefinitions.js @@ -267,6 +267,10 @@ defaultValue: true, urlSpecific: true }, + { + name: "domRectIntegerFactor", + defaultValue: 4 + }, { name: "blockDataURLs", defaultValue: true diff --git a/options/settingsDisplay.js b/options/settingsDisplay.js index 589bb18..5f592ce 100644 --- a/options/settingsDisplay.js +++ b/options/settingsDisplay.js @@ -411,6 +411,13 @@ "displayAdvancedSettings": [true] } }, + { + "name": "domRectIntegerFactor", + "displayDependencies": { + "protectDOMRect": [true], + "displayAdvancedSettings": [true] + } + }, "misc", { "name": "theme"