From 372ee755f79c74ce04606b2b62aebfb92d0f8fb8 Mon Sep 17 00:00:00 2001 From: kkapsner Date: Tue, 24 Dec 2019 00:54:17 +0100 Subject: [PATCH] Added iframeAPI script for tests --- test/iframeAPI.js | 130 +++++++++++++++++++++++++++++++++++++++++ test/navigatorTest.js | 45 ++------------ test/navigatorTest.php | 1 + 3 files changed, 137 insertions(+), 39 deletions(-) create mode 100644 test/iframeAPI.js diff --git a/test/iframeAPI.js b/test/iframeAPI.js new file mode 100644 index 0000000..fe3adea --- /dev/null +++ b/test/iframeAPI.js @@ -0,0 +1,130 @@ +const iframeAPI = function(){ + "use strict"; + + const methods = [ + { + name: "own window", + prepare: function(){ + return { + window, + cleanup: function(){} + }; + } + }, + { + name: "simple", + prepare: function(){ + const iframe = document.createElement("iframe"); + iframe.style.display = "none"; + document.body.appendChild(iframe); + + return { + window: iframe.contentWindow, + cleanup: function(){ + iframe.parentNode.removeChild(iframe); + } + }; + } + }, + { + name: "window.frames", + prepare: function(){ + const iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + const window = frames[frames.length - 1]; + return { + window, + cleanup: function(){ + document.body.removeChild(iframe); + } + }; + } + }, + { + name: "window[window.length - 1]", + prepare: function(){ + const iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + const iframeWindow = window[window.length - 1]; + return { + window: iframeWindow, + cleanup: function(){ + document.body.removeChild(iframe); + } + }; + } + }, + { + name: "sneaky window[...]", + prepare: function(){ + const index = window.length; + const iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + const iframeWindow = window[index]; + return { + window: iframeWindow, + cleanup: function(){ + document.body.removeChild(iframe); + } + }; + } + }, + { + name: "nested iFrames", + prepare: function(){ + const index = window.length; + const iframe = document.createElement("iframe"); + document.body.appendChild(iframe); + const iframeWindow = window[index]; + iframeWindow.document.write(""); + return { + window: iframeWindow[0], + cleanup: function(){ + document.body.removeChild(iframe); + } + }; + } + }, + { + name: "window.open", + prepare: async function openWindow(){ + const newWindow = window.open("/"); + if (newWindow){ + return { + window: newWindow, + cleanup: function(){ + newWindow.close(); + } + }; + } + else { + return new Promise(function(resolve){ + window.addEventListener("click", function openWindowEventListener(){ + window.removeEventListener("click", openWindowEventListener); + resolve(openWindow()); + }); + }); + } + } + } + ]; + + function getPerformer(callback){ + return async function perform(method){ + const api = await method.prepare(); + callback(api.window, method.name); + api.cleanup(); + }; + } + + return { + forEachMethod: function(callback){ + methods.forEach(getPerformer(callback)); + }, + performMethod: function(callback, name){ + methods.filter(function(method){ + return method.name === name; + }).forEach(getPerformer(callback)); + } + }; +}(); \ No newline at end of file diff --git a/test/navigatorTest.js b/test/navigatorTest.js index cf5c054..af18a48 100644 --- a/test/navigatorTest.js +++ b/test/navigatorTest.js @@ -1,4 +1,4 @@ - +/* globals iframeAPI*/ const createLog = function(){ "use strict"; @@ -18,9 +18,9 @@ const createLog = function(){ str = str.replace("{old content}", logLine.textContent); logLine.textContent = str; }, - mark: function mark(index){ + mark: function mark(marktext){ logLine.classList.add("marked"); - logLine.title += "failed test " + index + "\n"; + logLine.title += marktext + "\n"; } }; }; @@ -35,41 +35,9 @@ if (!userAgentIsConsistent){ consistencyLine.mark(); } const lines = {}; -const iframeValues = [ - function(){ - "use strict"; - - return {windowToUse: window, cleanup: function(){}}; - }, - function(){ - "use strict"; - - const iframe = document.createElement("iframe"); - document.body.appendChild(iframe); - const windowToUse = frames[frames.length - 1]; - return {windowToUse, cleanup: function(){document.body.removeChild(iframe);}}; - }, - function(){ - "use strict"; - - const iframe = document.createElement("iframe"); - document.body.appendChild(iframe); - const windowToUse = window[window.length - 1]; - return {windowToUse, cleanup: function(){document.body.removeChild(iframe);}}; - }, - function(){ - "use strict"; - - const index = window.length; - const iframe = document.createElement("iframe"); - document.body.appendChild(iframe); - const windowToUse = window[index]; - return {windowToUse, cleanup: function(){document.body.removeChild(iframe);}}; - } -].forEach(function(getWindow, index){ + +iframeAPI.forEachMethod(function(windowToUse, name){ "use strict"; - - const {windowToUse, cleanup} = getWindow(); const navigator = windowToUse.navigator; Object.keys(navigator.__proto__).sort().forEach(function(property){ @@ -88,9 +56,8 @@ const iframeValues = [ propertyLine.values.push(value); } if (propertyLine.values[0] !== value){ - propertyLine.log.mark(index); + propertyLine.log.mark("failed test " + name); } } }); - cleanup(); }); diff --git a/test/navigatorTest.php b/test/navigatorTest.php index 6fa52f9..178832a 100644 --- a/test/navigatorTest.php +++ b/test/navigatorTest.php @@ -29,5 +29,6 @@ Tests the navigator properties. In the default settings of CanvasBlocker the nav + \ No newline at end of file