tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>