| <!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> |