396 lines
15 KiB
JavaScript
396 lines
15 KiB
JavaScript
|
var path = require('path');
|
||
|
var fs = require('fs');
|
||
|
var jsdom = require('../../lib/jsdom');
|
||
|
var toFileUrl = require('../util').toFileUrl(__dirname);
|
||
|
|
||
|
exports.tests = {
|
||
|
frame_parent: function(test) {
|
||
|
var window = jsdom.jsdom('<html><head>\
|
||
|
<script>\
|
||
|
aGlobal=1;\
|
||
|
var iframe = document.createElement("iframe");\
|
||
|
iframe.src = "' + toFileUrl('files/iframe.html') + '";\
|
||
|
document.body.appendChild(iframe);\
|
||
|
</script>\
|
||
|
</head><body></body></html>',
|
||
|
null,
|
||
|
{
|
||
|
features : {
|
||
|
FetchExternalResources: ['script','iframe'],
|
||
|
ProcessExternalResources: ['script','iframe']
|
||
|
}
|
||
|
}).createWindow();
|
||
|
window.iframe.onload = function() {
|
||
|
test.strictEqual(window.DONE, 1);
|
||
|
test.strictEqual(window.PARENT_IS_TOP, true);
|
||
|
|
||
|
//insert a script tag to make sure the global set in the iframe is visible
|
||
|
//in the parent window context
|
||
|
var doc = window.document;
|
||
|
var script = doc.createElement('script');
|
||
|
script.textContent = 'results=[aGlobal, DONE, PARENT_IS_TOP]';
|
||
|
doc.body.appendChild(script);
|
||
|
//the script is executed asynchronously after insertion to the document,
|
||
|
//so setTimeout is needed
|
||
|
setTimeout(function(){
|
||
|
test.deepEqual(window.results, [1, 1, true]);
|
||
|
test.done();
|
||
|
}, 0);
|
||
|
};
|
||
|
},
|
||
|
|
||
|
frame_src_relative_to_parent_doc: function(test) {
|
||
|
var window = jsdom.jsdom('<html><body>\
|
||
|
<iframe src="./files/iframe.html"></iframe>\
|
||
|
</body></html>',
|
||
|
null,
|
||
|
{
|
||
|
url : toFileUrl("test.html"),
|
||
|
features : {
|
||
|
FetchExternalResources: ['script','iframe'],
|
||
|
ProcessExternalResources: ['script','iframe']
|
||
|
}
|
||
|
}).createWindow();
|
||
|
window.document.onload = function(){
|
||
|
test.strictEqual(window.LOADED_FRAME, 1);
|
||
|
test.strictEqual(window.PARENT_IS_TOP, true);
|
||
|
test.done();
|
||
|
};
|
||
|
},
|
||
|
|
||
|
'test iframe element existence' : function (test) {
|
||
|
var iframeParentPath = path.resolve(__dirname, 'files', 'iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(iframeParentPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var elem = doc.getElementById('simpleIFrameID');
|
||
|
test.notEqual(elem, null);
|
||
|
test.equal(elem.name, 'simpleIFrame');
|
||
|
test.equal(elem.id, 'simpleIFrameID');
|
||
|
test.done();
|
||
|
},
|
||
|
|
||
|
'test iframe.contentDocument access' : function(test) {
|
||
|
var iframeParentPath = path.resolve(__dirname, 'files', 'iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(iframeParentPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
doc.addEventListener('load', function () {
|
||
|
var iframeElem = doc.getElementById('simpleIFrameID');
|
||
|
test.notEqual(iframeElem, null);
|
||
|
var iframeDoc = iframeElem.contentDocument;
|
||
|
test.notEqual(iframeDoc, null);
|
||
|
test.notStrictEqual(iframeDoc, doc);
|
||
|
var iframeDiv = iframeDoc.getElementById('iframeDiv');
|
||
|
test.notEqual(iframeDiv, null);
|
||
|
test.equal(iframeDiv.innerHTML, "Initial Text");
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'test iframe load event' : function(test) {
|
||
|
var doc = jsdom.jsdom(null, null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var iFrame = doc.createElement('iframe');
|
||
|
iFrame.addEventListener('load', function () {
|
||
|
test.notEqual(iFrame.contentDocument, null);
|
||
|
test.done();
|
||
|
});
|
||
|
iFrame.src = 'files/simple_iframe.html';
|
||
|
// Must insert into doc to force load.
|
||
|
doc.documentElement.appendChild(iFrame);
|
||
|
},
|
||
|
|
||
|
'iframe loads blank document when src unspecified' : function(test) {
|
||
|
var doc = jsdom.jsdom(null);
|
||
|
var iFrame = doc.createElement('iframe');
|
||
|
iFrame.addEventListener('load', function () {
|
||
|
test.notEqual(iFrame.contentDocument, null);
|
||
|
test.strictEqual(iFrame.contentDocument.readyState, 'complete');
|
||
|
test.done();
|
||
|
});
|
||
|
doc.documentElement.appendChild(iFrame);
|
||
|
},
|
||
|
|
||
|
'test iframe.contentWindow acccess' : function(test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
doc.addEventListener('load', function () {
|
||
|
var iframeElem = doc.getElementById('simpleIFrameID');
|
||
|
test.notEqual(iframeElem, null);
|
||
|
var iframeDoc = iframeElem.contentDocument;
|
||
|
test.notEqual(iframeDoc, null);
|
||
|
var iframeWindow = iframeElem.contentWindow;
|
||
|
test.notStrictEqual(iframeWindow, doc.parentWindow);
|
||
|
test.equal(iframeWindow, iframeDoc.parentWindow);
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'get iframe window via indexed frames access' : function(test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
doc.addEventListener('load', function () {
|
||
|
var window = doc.parentWindow;
|
||
|
var iframeWindow = window.frames[0];
|
||
|
test.notEqual(iframeWindow, null);
|
||
|
test.notStrictEqual(iframeWindow, window);
|
||
|
test.strictEqual(iframeWindow.parent, window);
|
||
|
var iframeDoc = iframeWindow.document;
|
||
|
test.notStrictEqual(iframeWindow.document, window.document);
|
||
|
test.notEqual(iframeWindow.document.getElementById('iframeDiv'), null);
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'get iframe window via indexed frames access with setAttributeNode' : function(test) {
|
||
|
var doc = jsdom.jsdom("<html><head></head><body><iframe name='simpleIFrame' id='simpleIFrameID'></iframe></body></html>", null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var iframe = doc.getElementById('simpleIFrameID');
|
||
|
var attr = doc.createAttribute('src');
|
||
|
attr.value = 'files/simple_iframe.html';
|
||
|
iframe.setAttributeNode(attr);
|
||
|
|
||
|
iframe.addEventListener('load', function () {
|
||
|
var window = doc.parentWindow;
|
||
|
var iframeWindow = window.frames[0];
|
||
|
test.notEqual(iframeWindow, null);
|
||
|
test.notStrictEqual(iframeWindow, window);
|
||
|
test.strictEqual(iframeWindow.parent, window);
|
||
|
var iframeDoc = iframeWindow.document;
|
||
|
test.notStrictEqual(iframeWindow.document, window.document);
|
||
|
test.notEqual(iframeWindow.document.getElementById('iframeDiv'), null);
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'update named frames access on name change' : function(test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
doc.addEventListener('load', function () {
|
||
|
var window = doc.parentWindow;
|
||
|
var iframeWindow = window.frames['simpleIFrame'];
|
||
|
test.notEqual(iframeWindow, null);
|
||
|
test.notStrictEqual(iframeWindow, window);
|
||
|
test.strictEqual(iframeWindow.parent, window);
|
||
|
doc.getElementById('simpleIFrameID').setAttribute('name', 'otherSimpleIFrame');
|
||
|
test.ok(!window.frames['simpleIFrame'], 'remove old named property');
|
||
|
test.ok(window.frames['otherSimpleIFrame'], 'add new named property');
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
// See: http://www.whatwg.org/specs/web-apps/current-work/#dom-frames
|
||
|
'test frames array identity' : function(test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
doc.addEventListener('load', function () {
|
||
|
var window = doc.parentWindow;
|
||
|
test.strictEqual(window.frames, window);
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'test nested iframes' : function (test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var window = doc.parentWindow;
|
||
|
doc.addEventListener('load', function () {
|
||
|
var topIFrameElem = doc.getElementById('simpleIFrameID');
|
||
|
var topIFrameDoc = topIFrameElem.contentDocument;
|
||
|
var topIFrameWindow = topIFrameElem.contentWindow;
|
||
|
var bottomIFrameElem = topIFrameDoc.createElement('iframe');
|
||
|
bottomIFrameElem.addEventListener('load', function () {
|
||
|
var bottomIFrameDoc = bottomIFrameElem.contentDocument;
|
||
|
test.notEqual(bottomIFrameDoc, null);
|
||
|
var bottomIFrameWindow = bottomIFrameDoc.parentWindow;
|
||
|
test.notEqual(bottomIFrameWindow, null);
|
||
|
|
||
|
// The real tests
|
||
|
test.strictEqual(bottomIFrameWindow.parent, topIFrameWindow);
|
||
|
test.strictEqual(bottomIFrameWindow.top, window);
|
||
|
test.strictEqual(topIFrameWindow.parent, window);
|
||
|
test.strictEqual(topIFrameWindow.top, window);
|
||
|
test.strictEqual(window.frames[0], topIFrameWindow);
|
||
|
test.strictEqual(topIFrameWindow.frames[0], bottomIFrameWindow);
|
||
|
test.done();
|
||
|
});
|
||
|
bottomIFrameElem.src = 'simple_iframe.html';
|
||
|
topIFrameDoc.documentElement.appendChild(bottomIFrameElem);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'test multiple iframes' : function (test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'multiple_iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var window = doc.parentWindow;
|
||
|
doc.addEventListener('load', function () {
|
||
|
var iframe1 = doc.getElementById('frame1ID');
|
||
|
var iframe2 = doc.getElementById('frame2ID');
|
||
|
var iframe3 = doc.getElementById('frame3ID');
|
||
|
test.notEqual(window, iframe1.contentWindow);
|
||
|
test.notEqual(window, iframe2.contentWindow);
|
||
|
test.notEqual(window, iframe3.contentWindow);
|
||
|
test.equal(iframe1.contentWindow.parent, window);
|
||
|
test.equal(iframe2.contentWindow.parent, window);
|
||
|
test.equal(iframe3.contentWindow.parent, window);
|
||
|
test.equal(iframe1.contentWindow.top, window);
|
||
|
test.equal(iframe2.contentWindow.top, window);
|
||
|
test.equal(iframe3.contentWindow.top, window);
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
'test named lookup' : function (test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'multiple_iframe_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var window = doc.parentWindow;
|
||
|
doc.addEventListener('load', function () {
|
||
|
var iframe1 = doc.getElementById('frame1ID');
|
||
|
var iframe2 = doc.getElementById('frame2ID');
|
||
|
var iframe3 = doc.getElementById('frame3ID');
|
||
|
test.equal(window['frame1'], iframe1.contentWindow);
|
||
|
test.equal(window['frame2'], iframe2.contentWindow);
|
||
|
test.equal(window['frame3'], iframe3.contentWindow);
|
||
|
test.done();
|
||
|
});
|
||
|
},
|
||
|
|
||
|
// This is based off of a test from the jQuery test suite that was failing.
|
||
|
'test iframe without src' : function (test) {
|
||
|
var doc = jsdom.jsdom(null, null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var window = doc.parentWindow;
|
||
|
window.loaded = function () {
|
||
|
test.equal(window.testVal, 3);
|
||
|
test.done();
|
||
|
};
|
||
|
|
||
|
var iframe = doc.createElement('iframe');
|
||
|
doc.body.appendChild(iframe);
|
||
|
|
||
|
var iframeDoc = iframe.contentDocument;
|
||
|
test.notEqual(iframeDoc, null);
|
||
|
iframeDoc.open();
|
||
|
iframeDoc.write("<body onload='window.top.testVal = 3;window.parent.loaded()'>");
|
||
|
iframeDoc.close();
|
||
|
},
|
||
|
|
||
|
'test setting src multiple times' : function (test) {
|
||
|
var doc = jsdom.jsdom(null, null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'iframe'],
|
||
|
ProcessExternalResources : ['script', 'iframe']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var iframe = doc.createElement('iframe');
|
||
|
iframe.addEventListener('load', function () {
|
||
|
test.equal(iframe.src, 'files/simple_iframe.html');
|
||
|
test.done();
|
||
|
});
|
||
|
iframe.src = 'garbage';
|
||
|
iframe.src = 'files/simple_iframe.html';
|
||
|
doc.body.appendChild(iframe);
|
||
|
},
|
||
|
|
||
|
'test framesets' : function (test) {
|
||
|
var htmlPath = path.resolve(__dirname, 'files', 'frameset_parent.html');
|
||
|
var doc = jsdom.jsdom(fs.readFileSync(htmlPath, 'utf8'), null, {
|
||
|
features : {
|
||
|
FetchExternalResources : ['script', 'frame'],
|
||
|
ProcessExternalResources : ['script', 'frame']
|
||
|
},
|
||
|
url : toFileUrl(__filename)
|
||
|
});
|
||
|
var window = doc.parentWindow;
|
||
|
doc.addEventListener('load', function () {
|
||
|
var frame1 = doc.getElementById('frame1ID');
|
||
|
var frame2 = doc.getElementById('frame2ID');
|
||
|
test.notEqual(frame1, null);
|
||
|
test.notEqual(frame2, null);
|
||
|
|
||
|
var frame1doc = frame1.contentDocument;
|
||
|
var frame2doc = frame2.contentDocument;
|
||
|
test.notEqual(frame1doc, null);
|
||
|
test.notEqual(frame2doc, null);
|
||
|
|
||
|
test.strictEqual(frame1.contentWindow, frame1doc.parentWindow);
|
||
|
test.strictEqual(frame2.contentWindow, frame2doc.parentWindow);
|
||
|
test.strictEqual(window.frames[0], frame1.contentWindow);
|
||
|
test.strictEqual(window.frames[1], frame2.contentWindow);
|
||
|
test.strictEqual(window.frames['frame1'], frame1.contentWindow);
|
||
|
test.strictEqual(window.frames['frame2'], frame2.contentWindow);
|
||
|
test.equal(window, frame1.contentWindow.parent);
|
||
|
test.equal(window, frame2.contentWindow.parent);
|
||
|
|
||
|
test.done();
|
||
|
});
|
||
|
}
|
||
|
};
|