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