<!DOCTYPE html>
<meta charset="utf-8">
<!-- Based on similar tests in html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/ -->
<title>RTCEncodedVideoFrame cannot cross agent clusters, service worker edition</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../webrtc/RTCPeerConnection-helper.js"></script>
<script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script>

<script>
"use strict";
promise_test(async t => {
  const caller = new RTCPeerConnection({encodedInsertableStreams:true});
  t.add_cleanup(() => caller.close());
  const callee = new RTCPeerConnection();
  t.add_cleanup(() => callee.close());

  const stream = await navigator.mediaDevices.getUserMedia({audio:true});
  const track = stream.getTracks()[0];
  t.add_cleanup(() => track.stop());

  const sender = caller.addTrack(track)
  const streams = sender.createEncodedStreams();
  const reader = streams.readable.getReader();
  const writer = streams.writable.getWriter();

  exchangeIceCandidates(caller, callee);
  await exchangeOfferAnswer(caller, callee);

  const result = await reader.read();
  const scope = "resources/blank.html";
  let reg = await service_worker_unregister_and_register(t, "resources/serviceworker-failure.js", scope);
  t.add_cleanup(() => service_worker_unregister(t, scope));
  await wait_for_state(t, reg.installing, "activated");
  let iframe = await with_iframe(scope);
  t.add_cleanup(() => iframe.remove());
  const sw = iframe.contentWindow.navigator.serviceWorker;
  let state = "start in window";
  return new Promise(resolve => {
    sw.onmessage = t.step_func(e => {
      if (e.data === "start in worker") {
        assert_equals(state, "start in window");
        sw.controller.postMessage(result.value);
        state = "we are expecting confirmation of an onmessageerror in the worker";
      } else if (e.data === "onmessageerror was received in worker") {
        assert_equals(state, "we are expecting confirmation of an onmessageerror in the worker");
        resolve();
      } else {
        assert_unreached("Got an unexpected message from the service worker: " + e.data);
      }
    });

    sw.controller.postMessage(state);
  });
});
</script>
