Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<title>Service Worker: srcdoc frame handling</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<body>
<script>
// This test attempts to verify various service worker behaviors in
// srcdoc iframe.
function runTestInSrcDocFrame(testFunc, testFuncParam) {
return new Promise((resolve, reject) => {
window.addEventListener('message', function onMsg(evt) {
if (evt.data.type !== 'TEST_RESULT') {
return;
}
window.removeEventListener('message', onMsg);
resolve(evt.data.result);
});
testFunc(testFuncParam);
});
}
async function doAsyncTest(t, testFuncName, expectedResult) {
const worker = 'resources/srcdoc-iframe-worker.js';
const scope = 'resources/srcdoc-iframe.html';
let reg = await service_worker_unregister_and_register(t, worker, scope);
t.add_cleanup(() => service_worker_unregister(t, scope));
await wait_for_state(t, reg.installing, 'activated');
let frame = await with_iframe(scope);
let scopeFullUlr = frame.contentWindow.location.href;
let testFunc = frame.contentWindow.srcdocFrame()[testFuncName];
let testResult = await runTestInSrcDocFrame(testFunc, scopeFullUlr);
assert_equals(testResult, expectedResult);
frame.remove();
}
promise_test(async function(t) {
await doAsyncTest(t, 'addSandboxedSrcdocFrame', 'NoController');
}, 'nested sandboxed srcdoc frame should not inherit controller');
promise_test(async function(t) {
await doAsyncTest(t, 'addSameOriginSandboxedSrcdocFrame', 'HasController');
}, 'nested same origin sandboxed srcdoc frame should inherit controller');
promise_test(async function(t) {
await doAsyncTest(t, 'fetchResource', 'passed');
}, 'should be able to serve resource from controller for srcdoc frame');
promise_test(async function(t) {
await doAsyncTest(t, 'getServiceWorkerRegistration', 'passed');
}, 'getRegistration should work in srcdoc iframe');
promise_test(async function(t) {
await doAsyncTest(t, 'postMessageToController', 'passed');
}, 'controller.postMessage should work in srcdoc iframe');
</script>
</body>