<!DOCTYPE html>
<title>Service Worker: Check if dedicated workers are controlled</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/utils.js"></script>
<script src="/common/utils.js"></script>
<body>
<script>
const frameUrl = './resources/serviceWorker-dedicated-worker-inner.html';
const unregisterAllSW = async () => {
const regs = await navigator.serviceWorker.getRegistrations();
return Promise.all(regs.map(reg => reg.unregister()));
};
promise_test(async t => {
t.add_cleanup(unregisterAllSW);
const key = token();
// Inside the fenced frame, the service worker is registered and fetch
// request is triggered from the dedicated worker to the url that is
// handled in the service worker.
const url = `${frameUrl}?useServiceWorkerInFencedFrame=true`;
attachFencedFrame(generateURL(url, [key]));
const result = await nextValueFromServer(key);
assert_equals(result, "OK");
}, "Fenced frame's service workers can control fenced frame's dedicated workers");
promise_test(async t => {
t.add_cleanup(unregisterAllSW);
const key = token();
// Set a service worker in the fenced frame. Inside the fenced frame, a
// dedicated worker is created and triggers a fetch request. But we don't
// use the fetch request result in this test. This test will check if the
// dedicated worker in the parent frame is controlled by the SW in FF.
const url = `${frameUrl}?useServiceWorkerInFencedFrame=true`;
attachFencedFrame(generateURL(url, [key]));
await nextValueFromServer(key);
const checkIfWorkerIsControlled = async () => {
const dedicated_worker = new Worker('resources/serviceWorker-dedicated-worker.js');
return new Promise((resolve, reject) => {
dedicated_worker.addEventListener('message', e => {
resolve(e.data)
});
dedicated_worker.postMessage('fetch');
});
}
const result = await checkIfWorkerIsControlled()
assert_equals(result, "Not Found");
}, "Fenced frame's service workers can not control the dedicated workers in the parent frame");
promise_test(async t => {
t.add_cleanup(unregisterAllSW);
const key = token();
// Register a service worker in the parent frame.
await navigator.serviceWorker.register('resources/serviceWorker-dedicated-worker-sw.js', { scope: '/' });
await navigator.serviceWorker.ready;
// Inside the fenced frame, fetch request to unexisting URL is triggered
// from the dedicated worker.
attachFencedFrame(generateURL(frameUrl, [key]));
const result = await nextValueFromServer(key);
assert_equals(result, "Not Found");
}, "Service workers in the parent frame of fenced frames can not control dedicated workers in fenced frames");
</script>
</body>