blob: 65a7f5c8981130c15b4cb91d460a11e2b529b0ce [file] [log] [blame]
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<!-- SEKRITS! -->
<input id="sekrit" value="omg!">
<script>
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]);
});
}
function createFrame() {
return new Promise(resolve => {
var i = document.createElement('iframe');
i.srcdoc = `
<script>
window.addEventListener('message', e => {
if (e.data.domain !== undefined) {
try {
document.domain = e.data.domain;
e.ports[0].postMessage('Done');
} catch(error) {
e.ports[0].postMessage(error.name);
}
} else if (e.data == 'poke-at-parent') {
try {
var sekrit = window.parent.document.body.querySelector('#sekrit').value;
e.ports[0].postMessage(sekrit);
} catch(error) {
e.ports[0].postMessage(error.name);
}
}
});
window.parent.postMessage('Hi!', '*');
</scr` + `ipt>`;
window.addEventListener('message', m => {
if (m.source == i.contentWindow)
resolve(i);
});
document.body.appendChild(i);
});
}
promise_test(t => {
return createFrame()
.then(f => postMessageToFrame(f, 'poke-at-parent'))
.then(result => {
assert_equals(result.data, document.querySelector('#sekrit').value);
result.frame.remove();
});
}, "srcdoc can access with no 'document.domain' modification.");
promise_test(t => {
return createFrame()
.then(f => postMessageToFrame(f, { domain: window.location.hostname }))
.then(result => {
assert_equals(result.data, 'Done');
return postMessageToFrame(result.frame, 'poke-at-parent')
.then(result => {
assert_equals(result.data, document.querySelector('#sekrit').value);
result.frame.remove();
});
});
}, "srcdoc can access with valid 'document.domain'.");
promise_test(t => {
return createFrame()
.then(f => {
document.domain = window.location.hostname;
return postMessageToFrame(f, 'poke-at-parent');
})
.then(result => {
assert_equals(result.data, document.querySelector('#sekrit').value);
result.frame.remove();
});
}, "srcdoc can access when parent modifies 'document.domain'.");
</script>