tor-browser

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

RTCRtpTransceiver-stop.html (5945B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <title>RTCRtpTransceiver.prototype.stop</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 // FIXME: Add a test adding a transceiver, stopping it and trying to create an empty offer.
      9 
     10 promise_test(async (t)=> {
     11    const pc1 = new RTCPeerConnection();
     12    t.add_cleanup(() => pc1.close());
     13 
     14    pc1.addTransceiver("audio", { direction: "sendonly" });
     15    pc1.addTransceiver("video");
     16    pc1.getTransceivers()[0].stop();
     17 
     18    const offer = await pc1.createOffer();
     19 
     20    assert_false(offer.sdp.includes("m=audio"), "offer should not contain an audio m-section");
     21    assert_true(offer.sdp.includes("m=video"), "offer should contain a video m-section");
     22 }, "A transceiver added and stopped before the initial offer generation should not trigger an offer m-section generation");
     23 
     24 promise_test(async (t)=> {
     25    const pc1 = new RTCPeerConnection();
     26    t.add_cleanup(() => pc1.close());
     27 
     28    pc1.addTransceiver("audio", { direction: "sendonly" });
     29    pc1.addTransceiver("video");
     30    assert_equals(null, pc1.getTransceivers()[1].receiver.transport);
     31 
     32    pc1.getTransceivers()[1].stop();
     33    assert_equals(pc1.getTransceivers()[1].receiver.transport, null);
     34 }, "A transceiver added and stopped should not crash when getting receiver's transport");
     35 
     36 promise_test(async (t)=> {
     37    const pc1 = new RTCPeerConnection();
     38    const pc2 = new RTCPeerConnection();
     39    t.add_cleanup(() => pc1.close());
     40    t.add_cleanup(() => pc2.close());
     41 
     42    pc1.addTransceiver("audio");
     43 
     44    await exchangeOfferAnswer(pc1, pc2);
     45 
     46    pc1.addTransceiver("video");
     47 
     48    pc1.getTransceivers()[0].stop();
     49    pc1.getTransceivers()[1].stop();
     50 
     51    const offer = await pc1.createOffer();
     52 
     53    assert_true(offer.sdp.includes("m=audio"), "offer should contain an audio m-section");
     54    assert_true(offer.sdp.includes("m=audio 0"), "The audio m-section should be rejected");
     55 
     56    assert_false(offer.sdp.includes("m=video"), "offer should not contain a video m-section");
     57 }, "During renegotiation, adding and stopping a transceiver should not trigger a renegotiated offer m-section generation");
     58 
     59 promise_test(async (t)=> {
     60    const pc1 = new RTCPeerConnection();
     61    const pc2 = new RTCPeerConnection();
     62    t.add_cleanup(() => pc1.close());
     63    t.add_cleanup(() => pc2.close());
     64 
     65    pc1.addTransceiver("audio");
     66 
     67    await exchangeOfferAnswer(pc1, pc2);
     68 
     69    pc1.getTransceivers()[0].direction = "sendonly";
     70    pc1.getTransceivers()[0].stop();
     71 
     72    const offer = await pc1.createOffer();
     73 
     74    assert_true(offer.sdp.includes("a=inactive"), "The audio m-section should be inactive");
     75 }, "A stopped sendonly transceiver should generate an inactive m-section in the offer");
     76 
     77 promise_test(async (t)=> {
     78    const pc1 = new RTCPeerConnection();
     79    const pc2 = new RTCPeerConnection();
     80    t.add_cleanup(() => pc1.close());
     81    t.add_cleanup(() => pc2.close());
     82 
     83    pc1.addTransceiver("audio");
     84 
     85    await exchangeOfferAnswer(pc1, pc2);
     86 
     87    pc1.getTransceivers()[0].direction = "inactive";
     88    pc1.getTransceivers()[0].stop();
     89 
     90    const offer = await pc1.createOffer();
     91 
     92    assert_true(offer.sdp.includes("a=inactive"), "The audio m-section should be inactive");
     93 }, "A stopped inactive transceiver should generate an inactive m-section in the offer");
     94 
     95 promise_test(async (t) => {
     96  const pc1 = new RTCPeerConnection();
     97  const pc2 = new RTCPeerConnection();
     98  t.add_cleanup(() => pc1.close());
     99  t.add_cleanup(() => pc2.close());
    100  pc1.addTransceiver("audio");
    101  await exchangeOfferAnswer(pc1, pc2);
    102  pc1.getTransceivers()[0].stop();
    103  await exchangeOfferAnswer(pc1, pc2);
    104  await pc1.setLocalDescription(await pc1.createOffer());
    105 }, 'If a transceiver is stopped locally, setting a locally generated answer should still work');
    106 
    107 promise_test(async (t) => {
    108  const pc1 = new RTCPeerConnection();
    109  const pc2 = new RTCPeerConnection();
    110  t.add_cleanup(() => pc1.close());
    111  t.add_cleanup(() => pc2.close());
    112  pc1.addTransceiver("audio");
    113  await exchangeOfferAnswer(pc1, pc2);
    114  pc2.getTransceivers()[0].stop();
    115  await exchangeOfferAnswer(pc2, pc1);
    116  await pc1.setLocalDescription(await pc1.createOffer());
    117 }, 'If a transceiver is stopped remotely, setting a locally generated answer should still work');
    118 
    119 promise_test(async (t) => {
    120  const pc1 = new RTCPeerConnection();
    121  const pc2 = new RTCPeerConnection();
    122  t.add_cleanup(() => pc1.close());
    123  t.add_cleanup(() => pc2.close());
    124  pc1.addTransceiver("audio");
    125  await exchangeOfferAnswer(pc1, pc2);
    126  assert_equals(pc1.getTransceivers().length, 1);
    127  assert_equals(pc2.getTransceivers().length, 1);
    128  pc1.getTransceivers()[0].stop();
    129  await exchangeOfferAnswer(pc1, pc2);
    130  assert_equals(pc1.getTransceivers().length, 0);
    131  assert_equals(pc2.getTransceivers().length, 0);
    132  assert_equals(pc1.getSenders().length, 0, 'caller senders');
    133  assert_equals(pc1.getReceivers().length, 0, 'caller receivers');
    134  assert_equals(pc2.getSenders().length, 0, 'callee senders');
    135  assert_equals(pc2.getReceivers().length, 0, 'callee receivers');
    136 }, 'If a transceiver is stopped, transceivers, senders and receivers should disappear after offer/answer');
    137 
    138 promise_test(async (t) => {
    139  const pc1 = new RTCPeerConnection();
    140  const pc2 = new RTCPeerConnection();
    141  t.add_cleanup(() => pc1.close());
    142  t.add_cleanup(() => pc2.close());
    143  pc1.addTransceiver("audio");
    144  await exchangeOfferAnswer(pc1, pc2);
    145  assert_equals(pc1.getTransceivers().length, 1);
    146  assert_equals(pc2.getTransceivers().length, 1);
    147  pc1Transceiver = pc1.getTransceivers()[0];
    148  pc2Transceiver = pc2.getTransceivers()[0];
    149  pc1.getTransceivers()[0].stop();
    150  await exchangeOfferAnswer(pc1, pc2);
    151  assert_equals(pc1Transceiver.direction, 'stopped');
    152  assert_equals(pc2Transceiver.direction, 'stopped');
    153 }, 'If a transceiver is stopped, transceivers should end up in state stopped');
    154 
    155 </script>