<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js?pipe=sub"></script>
<script>
promise_test(async (t) => {
    const SCOPE = 'resources/empty.html';
    const SCRIPT = 'resources/fetch-rewrite-worker.js';
    const host_info = get_host_info();
    const REMOTE_ORIGIN = host_info.HTTPS_REMOTE_ORIGIN;

    const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
    await wait_for_state(t, reg.installing, 'activated');
    const frame = await with_iframe(SCOPE);

    const doc = frame.contentDocument;
    const win = frame.contentWindow;

    const context = new win.AudioContext();
    try {
      context.suspend();
      const audio = doc.createElement('audio');
      audio.autoplay = true;
      const source = context.createMediaElementSource(audio);
      const spn = context.createScriptProcessor(16384, 1, 1);
      source.connect(spn).connect(context.destination);
      const url = `${REMOTE_ORIGIN}/webaudio/resources/sin_440Hz_-6dBFS_1s.wav`;
      audio.src = '/test?url=' + encodeURIComponent(url);
      doc.body.appendChild(audio);

      await new Promise((resolve) => {
        audio.addEventListener('playing', resolve);
      });
      await context.resume();
      const event = await new Promise((resolve) => {
        spn.addEventListener('audioprocess', resolve);
      });
      const data = event.inputBuffer.getChannelData(0);
      for (const e of data) {
        assert_equals(e, 0);
      }
    } finally {
      context.close();
    }
  }, 'Verify CORS XHR of fetch() in a Service Worker');
</script>
