RTCRtpSender-setStreams.https.html (4866B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <title>RTCRtpSender.prototype.setStreams</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="RTCPeerConnection-helper.js"></script> 7 <script> 8 'use strict'; 9 10 promise_test(async t => { 11 const caller = new RTCPeerConnection(); 12 t.add_cleanup(() => caller.close()); 13 const callee = new RTCPeerConnection(); 14 t.add_cleanup(() => callee.close()); 15 const stream = await getNoiseStream({audio: true}); 16 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 17 const [track] = stream.getTracks(); 18 19 const sender = caller.addTrack(track); 20 const stream1 = new MediaStream(); 21 const stream2 = new MediaStream(); 22 sender.setStreams(stream1, stream2); 23 24 const offer = await caller.createOffer(); 25 callee.setRemoteDescription(offer); 26 return new Promise(resolve => callee.ontrack = t.step_func(event =>{ 27 assert_equals(event.streams.length, 2); 28 const calleeStreamIds = event.streams.map(s => s.id); 29 assert_in_array(stream1.id, calleeStreamIds); 30 assert_in_array(stream2.id, calleeStreamIds); 31 resolve(); 32 })); 33 }, 'setStreams causes streams to be reported via ontrack on callee'); 34 35 promise_test(async t => { 36 const caller = new RTCPeerConnection(); 37 t.add_cleanup(() => caller.close()); 38 const callee = new RTCPeerConnection(); 39 t.add_cleanup(() => callee.close()); 40 const stream = await getNoiseStream({audio: true}); 41 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 42 const [track] = stream.getTracks(); 43 44 const sender = caller.addTrack(track); 45 sender.setStreams(stream); 46 47 const offer = await caller.createOffer(); 48 callee.setRemoteDescription(offer); 49 return new Promise(resolve => callee.ontrack = t.step_func(event =>{ 50 assert_equals(event.streams.length, 1); 51 assert_equals(stream.id, event.streams[0].id); 52 assert_equals(event.streams[0].getTracks()[0], event.track); 53 resolve(); 54 })); 55 }, 'setStreams can be used to reconstruct a stream with a track on the remote side'); 56 57 58 promise_test(async t => { 59 const caller = new RTCPeerConnection(); 60 t.add_cleanup(() => caller.close()); 61 const callee = new RTCPeerConnection(); 62 t.add_cleanup(() => callee.close()); 63 64 callee.ontrack = t.unreached_func(); 65 const transceiver = caller.addTransceiver('audio', {direction: 'inactive'}); 66 await exchangeOfferAnswer(caller, callee); 67 68 const stream1 = new MediaStream(); 69 const stream2 = new MediaStream(); 70 transceiver.direction = 'sendrecv'; 71 transceiver.sender.setStreams(stream1, stream2); 72 73 const offer = await caller.createOffer(); 74 callee.setRemoteDescription(offer); 75 return new Promise(resolve => callee.ontrack = t.step_func(event =>{ 76 assert_equals(event.streams.length, 2); 77 const calleeStreamIds = event.streams.map(s => s.id); 78 assert_in_array(stream1.id, calleeStreamIds); 79 assert_in_array(stream2.id, calleeStreamIds); 80 assert_in_array(event.track, event.streams[0].getTracks()); 81 assert_in_array(event.track, event.streams[1].getTracks()); 82 resolve(); 83 })); 84 }, 'Adding streams and changing direction causes new streams to be reported via ontrack on callee'); 85 86 promise_test(async t => { 87 const caller = new RTCPeerConnection(); 88 t.add_cleanup(() => caller.close()); 89 const callee = new RTCPeerConnection(); 90 t.add_cleanup(() => callee.close()); 91 92 const stream1 = new MediaStream(); 93 const stream2 = new MediaStream(); 94 let calleeTrack = null; 95 callee.ontrack = t.step_func(event => { 96 assert_equals(event.streams.length, 0); 97 calleeTrack = event.track; 98 }); 99 const transceiver = caller.addTransceiver('audio', {direction: 'sendrecv'}); 100 await exchangeOfferAnswer(caller, callee); 101 assert_true(calleeTrack instanceof MediaStreamTrack); 102 103 transceiver.sender.setStreams(stream1, stream2); 104 const offer = await caller.createOffer(); 105 callee.setRemoteDescription(offer); 106 return new Promise(resolve => callee.ontrack = t.step_func(event =>{ 107 assert_equals(event.streams.length, 2); 108 const calleeStreamIds = event.streams.map(s => s.id); 109 assert_in_array(stream1.id, calleeStreamIds); 110 assert_in_array(stream2.id, calleeStreamIds); 111 assert_in_array(event.track, event.streams[0].getTracks()); 112 assert_in_array(event.track, event.streams[1].getTracks()); 113 assert_equals(event.track, calleeTrack); 114 resolve(); 115 })); 116 }, 'Adding streams to an active transceiver causes new streams to be reported via ontrack on callee'); 117 118 test(t => { 119 const pc = new RTCPeerConnection(); 120 const stream1 = new MediaStream(); 121 const stream2 = new MediaStream(); 122 const transceiver = pc.addTransceiver('audio'); 123 124 pc.close(); 125 assert_throws_dom('InvalidStateError', () => transceiver.sender.setStreams(stream1, stream2)); 126 }, 'setStreams() fires InvalidStateError on a closed peer connection.'); 127 </script>