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