<!DOCTYPE html>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>

<script>
const worker = 'resources/fetch-event-within-sw-worker.js';

async function registerSwAndOpenFrame(t) {
  const registration = await navigator.serviceWorker.register(
      worker, { scope: 'resources/' });
  t.add_cleanup(() => registration.unregister());
  await wait_for_state(t, registration.installing, 'activated');

  const frame = await with_iframe('resources/simple.html');
  t.add_cleanup(() => frame.remove());
  return frame;
}

async function deleteCaches() {
  const cacheKeys = await caches.keys();
  await Promise.all(cacheKeys.map(c => caches.delete(c)));
}

promise_test(async t => {
  t.add_cleanup(deleteCaches);

  const iframe = await registerSwAndOpenFrame(t);
  const fetchText =
      await iframe.contentWindow.fetch('dummy.txt').then(r => r.text());

  const cache = await iframe.contentWindow.caches.open('test');
  await cache.add('dummy.txt');

  const response = await cache.match('dummy.txt');
  const cacheText = await (response ? response.text() : 'cache match failed');
  assert_equals(fetchText, 'intercepted', 'fetch intercepted');
  assert_equals(cacheText, 'intercepted', 'cache.add intercepted');
}, 'Service worker intercepts requests from window');

promise_test(async t => {
  const iframe = await registerSwAndOpenFrame(t);
  const [fetchText, cacheText] = await Promise.all([
    iframe.contentWindow.fetch('dummy.txt-inner-fetch').then(r => r.text()),
    iframe.contentWindow.fetch('dummy.txt-inner-cache').then(r => r.text())
  ]);
  assert_equals(fetchText, 'Hello world\n', 'fetch within SW not intercepted');
  assert_equals(cacheText, 'Hello world\n',
                'cache.add within SW not intercepted');
}, 'Service worker does not intercept fetch/cache requests within service ' +
   'worker');
</script>
