<!doctype html>
<meta charset=utf-8>
<title>Service Worker: nested blob URL worker clients</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<body>
<script>

const SCRIPT = 'resources/simple-intercept-worker.js';
const SCOPE = 'resources/';
const RESOURCE = 'resources/simple.txt';

promise_test((t) => {
  return runTest(t, 'resources/nested-blob-url-workers.html');
}, 'Nested blob URL workers should be intercepted by a service worker.');

promise_test((t) => {
  return runTest(t, 'resources/nested-worker-created-from-blob-url-worker.html');
}, 'Nested worker created from a blob URL worker should be intercepted by a service worker.');

promise_test((t) => {
  return runTest(t, 'resources/nested-blob-url-worker-created-from-worker.html');
}, 'Nested blob URL worker created from a worker should be intercepted by a service worker.');

async function runTest(t, iframe_url) {
  const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
  t.add_cleanup(_ => reg.unregister());
  await wait_for_state(t, reg.installing, 'activated');

  const frame = await with_iframe(iframe_url);
  t.add_cleanup(_ => frame.remove());
  assert_not_equals(frame.contentWindow.navigator.serviceWorker.controller,
                    null, 'frame should be controlled');

  const response_text = await frame.contentWindow.fetch_in_worker(RESOURCE);
  assert_equals(response_text, 'intercepted by service worker',
                'fetch() should be intercepted.');
}

</script>
</body>
