| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title>RTCPeerConnection Insertable Streams - Errors</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src=/resources/testdriver.js></script> | |
| <script src=/resources/testdriver-vendor.js></script> | |
| <script src='../mediacapture-streams/permission-helper.js'></script> | |
| <script src="../webrtc/RTCPeerConnection-helper.js"></script> | |
| <script src="./RTCPeerConnection-insertable-streams.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| promise_test(async t => { | |
| const caller = new RTCPeerConnection(); | |
| t.add_cleanup(() => caller.close()); | |
| const callee = new RTCPeerConnection(); | |
| t.add_cleanup(() => callee.close()); | |
| await setMediaPermission("granted", ["camera"]); | |
| const stream = await navigator.mediaDevices.getUserMedia({video:true}); | |
| const videoTrack = stream.getVideoTracks()[0]; | |
| t.add_cleanup(() => videoTrack.stop()); | |
| exchangeIceCandidates(caller, callee); | |
| await exchangeOfferAnswer(caller, callee); | |
| const videoSender = caller.addTrack(videoTrack); | |
| assert_throws_dom("InvalidStateError", () => videoSender.createEncodedStreams()); | |
| }, 'RTCRtpSender.createEncodedStream() throws if not requested in PC configuration'); | |
| promise_test(async t => { | |
| const caller = new RTCPeerConnection(); | |
| 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 ontrackPromise = new Promise(resolve => { | |
| callee.ontrack = t.step_func(() => { | |
| const videoReceiver = callee.getReceivers().find(r => r.track.kind === 'video'); | |
| assert_not_equals(videoReceiver, undefined); | |
| assert_throws_dom("InvalidStateError", () => videoReceiver.createEncodedStreams()); | |
| resolve(); | |
| }); | |
| }); | |
| exchangeIceCandidates(caller, callee); | |
| await exchangeOfferAnswer(caller, callee); | |
| return ontrackPromise; | |
| }, 'RTCRtpReceiver.createEncodedStream() throws if not requested in PC configuration'); | |
| 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 track = stream.getTracks()[0]; | |
| t.add_cleanup(() => track.stop()); | |
| const sender = caller.addTrack(track) | |
| const streams = sender.createEncodedStreams(); | |
| const transformer = new TransformStream({ | |
| transform(frame, controller) { | |
| // Inserting the same frame twice will result in failure since the frame | |
| // will be neutered after the first insertion is processed. | |
| controller.enqueue(frame); | |
| controller.enqueue(frame); | |
| } | |
| }); | |
| exchangeIceCandidates(caller, callee); | |
| await exchangeOfferAnswer(caller, callee); | |
| await promise_rejects_dom( | |
| t, 'OperationError', | |
| streams.readable.pipeThrough(transformer).pipeTo(streams.writable)); | |
| }, 'Enqueuing the same frame twice fails'); | |
| </script> | |
| </body> | |
| </html> |