From f3d1ca80f55e45970992919aeea6215ce35fc4ab Mon Sep 17 00:00:00 2001 From: kkapsner Date: Wed, 11 Sep 2019 23:57:00 +0200 Subject: [PATCH] Remove iframe protection from whitelisted pages Fixes #397 --- lib/iframeProtection.js | 41 +++++++++++++++++++++++++++++++++++++++++ releaseNotes.txt | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/iframeProtection.js b/lib/iframeProtection.js index 383c2f1..56da871 100644 --- a/lib/iframeProtection.js +++ b/lib/iframeProtection.js @@ -12,8 +12,37 @@ scope = require.register("./iframeProtection", {}); } + const settings = require("./settings"); + const lists = require("./lists"); + + function isWhitelisted(url){ + return lists.get("white").match(url) || settings.get("blockMode", url).startsWith("allow"); + } + scope.protect = function protect(window, wrappedWindow, singleCallback, allCallback){ + const changedProperties = []; + // eslint-disable-next-line max-params + function registerChangedProperty(object, name, descriptor, type, original){ + changedProperties.push({object, name, descriptor, type, original}); + } + if (settings.isStillDefault){ + settings.onloaded(function(){ + if (isWhitelisted(window.location)){ + changedProperties.forEach(function({object, name, descriptor, type, original}){ + descriptor[type] = original; + Object.defineProperty(object, name, descriptor); + }); + changedProperties.length = 0; + } + }); + } + else { + if (isWhitelisted(window.location)){ + return; + } + } + ["HTMLIFrameElement", "HTMLFrameElement"].forEach(function(constructorName){ const constructor = window[constructorName]; const wrappedConstructor = wrappedWindow[constructorName]; @@ -37,6 +66,8 @@ window ); Object.defineProperty(wrappedConstructor.prototype, "contentWindow", contentWindowDescriptor); + registerChangedProperty(wrappedConstructor.prototype, "contentWindow", contentWindowDescriptor, + "get", originalContentWindowGetter); const contentDocumentDescriptor = Object.getOwnPropertyDescriptor( constructor.prototype, @@ -57,6 +88,8 @@ window ); Object.defineProperty(wrappedConstructor.prototype, "contentDocument", contentDocumentDescriptor); + registerChangedProperty(wrappedConstructor.prototype, "contentDocument", contentDocumentDescriptor, + "get", originalContentDocumentGetter); }); [ // useless as length could be obtained before the iframe is created and window.frames === window @@ -98,9 +131,11 @@ return value; })`), window); Object.defineProperty(object, method, descriptor); + registerChangedProperty(object, method, descriptor, "value", original); }); protectionDefinition.getters.forEach(function(property){ const descriptor = Object.getOwnPropertyDescriptor(object, property); + const getter = descriptor.get; const temp = eval(`({ get ${property}(){ const ret = this.${property}; @@ -110,6 +145,7 @@ })`); descriptor.get = exportFunction(Object.getOwnPropertyDescriptor(temp, property).get, window); Object.defineProperty(object, property, descriptor); + registerChangedProperty(object, property, descriptor, "get", getter); }); protectionDefinition.setters.forEach(function(property){ const descriptor = Object.getOwnPropertyDescriptor(object, property); @@ -124,6 +160,7 @@ })`); descriptor.set = exportFunction(Object.getOwnPropertyDescriptor(temp, property).set, window); Object.defineProperty(object, property, descriptor); + registerChangedProperty(object, property, descriptor, "set", setter); }); }); @@ -179,6 +216,8 @@ } }, window); Object.defineProperty(wrappedWindow.HTMLDocument.prototype, "write", documentWriteDescriptor); + registerChangedProperty(wrappedWindow.HTMLDocument.prototype, "write", documentWriteDescriptor, + "value", documentWrite); const documentWritelnDescriptor = Object.getOwnPropertyDescriptor( wrappedWindow.HTMLDocument.prototype, @@ -205,5 +244,7 @@ documentWriteln.call(this, ""); }, window); Object.defineProperty(wrappedWindow.HTMLDocument.prototype, "writeln", documentWritelnDescriptor); + registerChangedProperty(wrappedWindow.HTMLDocument.prototype, "writeln", documentWritelnDescriptor, + "value", documentWriteln); }; }()); \ No newline at end of file diff --git a/releaseNotes.txt b/releaseNotes.txt index 1e40b36..2bad36e 100644 --- a/releaseNotes.txt +++ b/releaseNotes.txt @@ -3,7 +3,7 @@ Version 0.5.14: - reevaluated logging message levels new features: - - + - remove iframe protection from whitelisted pages fixes: - improved option pages on mobile