blob: b6631ea4f15035b61b95f2b6d6d2c2a7a16bf83b [file] [log] [blame]
/**
* Utilities to be used with document_domain_frame.html.
*/
/**
* Send a message to the frame and resolve a promise when a response is received.
*
* Supported messages:
*
* 1) { domain: something }. Has the subframe try to set document.domain to the
* given value, and message back 'Done' if that succeeds or an error name if it
* fails.
*
* 2) 'poke-at-parent'. Has the subframe try to synchronously attempt to access
* the parent's DOM, read out a string value, and message it back to the parent.
* Again, sends back the error name if that fails.
*
* 3) { 'poke-at-sibling': name }. Has the subframe try to synchronously
* attempt to access the DOM of the sibling with the given name, read out a
* string value, and message it back to the parent.
*/
function postMessageToFrame(frame, message) {
return new Promise(resolve => {
var c = new MessageChannel();
c.port1.onmessage = e => {
resolve({ data: e.data, frame: frame })
};
frame.contentWindow.postMessage(message, '*', [c.port2]);
});
}
/**
* Create a frame that loads document_domain_frame.html and resolves a promise
* when the frame is loaded enough to be sending and receiving messages.
*
* If a "name" argument is provided, that name is used for the iframe, so
*
* If a "hostname" argument is provided, that hostname is used for the load, to
* allow testing details of the behavior when different sorts of hostnames are
* used.
*/
function createFrame(t, name, hostname) {
return new Promise(resolve => {
var i = document.createElement('iframe');
if (hostname) {
i.src = `//${hostname}:{{location[port]}}/html/browsers/origin/relaxing-the-same-origin-restriction/support/document_domain_frame.html`;
} else {
i.src = "support/document_domain_frame.html";
}
if (name) {
i.name = name;
}
var listener = m => {
if (m.source == i.contentWindow)
resolve(i);
}
window.addEventListener('message', listener);
t.add_cleanup(() => {
i.remove();
window.removeEventListener('message', listener);
});
document.body.appendChild(i);
});
}