| <!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({video:true}); |
| const videoTrack = stream.getVideoTracks()[0]; |
| t.add_cleanup(() => videoTrack.stop()); |
| |
| const videoSender = caller.addTrack(videoTrack) |
| const senderStreams = videoSender.createEncodedStreams(); |
| const senderReader = senderStreams.readable.getReader(); |
| const senderWriter = senderStreams.writable.getWriter(); |
| |
| exchangeIceCandidates(caller, callee); |
| await exchangeOfferAnswer(caller, callee); |
| |
| const result = await senderReader.read(); |
| const scope = "resources/blank.html"; |
| const 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"); |
| const 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> |