Added iframeAPI script for tests

This commit is contained in:
kkapsner 2019-12-24 00:54:17 +01:00
parent 3dc39e11a5
commit 372ee755f7
3 changed files with 137 additions and 39 deletions

130
test/iframeAPI.js Normal file
View File

@ -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("<iframe></iframe>");
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));
}
};
}();

View File

@ -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();
});

View File

@ -29,5 +29,6 @@ Tests the navigator properties. In the default settings of CanvasBlocker the nav
</div>
</div>
<script id="serverUserAgent" type="text/data"><?php echo htmlentities($_SERVER["HTTP_USER_AGENT"], ENT_QUOTES, "UTF-8");?></script>
<script src="iframeAPI.js"></script>
<script src="navigatorTest.js"></script>
</body></html>