tor-browser

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

RTCPeerConnection-createOffer-offerToReceive.optional.html (9800B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <title>Test legacy offerToReceiveAudio/Video options</title>
      4 <link rel="help" href="https://w3c.github.io/webrtc-pc/#legacy-configuration-extensions">
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src="../RTCPeerConnection-helper.js"></script>
      8 <script>
      9  'use strict';
     10 
     11  /*
     12   *  4.3.3.2 Configuration data extensions
     13   *  partial dictionary RTCOfferOptions
     14   */
     15 
     16  /*
     17   *  offerToReceiveAudio of type boolean
     18   *    When this is given a non-false value, no outgoing track of type
     19   *    "audio" is attached to the PeerConnection, and the existing
     20   *    localDescription (if any) doesn't contain any sendrecv or recv
     21   *    audio media sections, createOffer() will behave as if
     22   *    addTransceiver("audio") had been called once prior to the createOffer() call.
     23   */
     24  promise_test(t => {
     25    const pc = new RTCPeerConnection();
     26 
     27    t.add_cleanup(() => pc.close());
     28 
     29    return pc.createOffer({ offerToReceiveAudio: true })
     30    .then(offer1 => {
     31      assert_equals(countAudioLine(offer1.sdp), 1,
     32        'Expect created offer to have audio line');
     33 
     34      // The first createOffer implicitly calls addTransceiver('audio'),
     35      // so all following offers will also have audio media section
     36      // in their SDP.
     37      return pc.createOffer({ offerToReceiveAudio: false })
     38      .then(offer2 => {
     39        assert_equals(countAudioLine(offer2.sdp), 1,
     40          'Expect audio line to remain in created offer');
     41      })
     42    });
     43  }, 'createOffer() with offerToReceiveAudio should add audio line to all subsequent created offers');
     44 
     45  /*
     46   *  offerToReceiveVideo of type boolean
     47   *    When this is given a non-false value, and no outgoing track
     48   *    of type "video" is attached to the PeerConnection, and the
     49   *    existing localDescription (if any) doesn't contain any sendecv
     50   *    or recv video media sections, createOffer() will behave as if
     51   *    addTransceiver("video") had been called prior to the createOffer() call.
     52   */
     53  promise_test(t => {
     54    const pc = new RTCPeerConnection();
     55 
     56    t.add_cleanup(() => pc.close());
     57 
     58    return pc.createOffer({ offerToReceiveVideo: true })
     59    .then(offer1 => {
     60      assert_equals(countVideoLine(offer1.sdp), 1,
     61      'Expect created offer to have video line');
     62 
     63      return pc.createOffer({ offerToReceiveVideo: false })
     64      .then(offer2 => {
     65        assert_equals(countVideoLine(offer2.sdp), 1,
     66          'Expect video line to remain in created offer');
     67      })
     68    });
     69  }, 'createOffer() with offerToReceiveVideo should add video line to all subsequent created offers');
     70 
     71  promise_test(t => {
     72    const pc = new RTCPeerConnection();
     73 
     74    t.add_cleanup(() => pc.close());
     75 
     76    return pc.createOffer({
     77      offerToReceiveAudio: true,
     78      offerToReceiveVideo: false
     79    }).then(offer1 => {
     80      assert_equals(countAudioLine(offer1.sdp), 1,
     81        'Expect audio line to be found in created offer');
     82 
     83      assert_equals(countVideoLine(offer1.sdp), 0,
     84        'Expect video line to not be found in create offer');
     85 
     86      return pc.createOffer({
     87        offerToReceiveAudio: false,
     88        offerToReceiveVideo: true
     89      }).then(offer2 => {
     90        assert_equals(countAudioLine(offer2.sdp), 1,
     91          'Expect audio line to remain in created offer');
     92 
     93        assert_equals(countVideoLine(offer2.sdp), 1,
     94          'Expect video line to be found in create offer');
     95      })
     96    });
     97  }, 'createOffer() with offerToReceiveAudio:true, then with offerToReceiveVideo:true, should have result offer with both audio and video line');
     98 
     99 
    100  // Run some tests for both audio and video kinds
    101  ['audio', 'video'].forEach((kind) => {
    102    const capsKind = kind[0].toUpperCase() + kind.slice(1);
    103 
    104    const offerToReceiveTrue = {};
    105    offerToReceiveTrue[`offerToReceive${capsKind}`] = true;
    106 
    107    const offerToReceiveFalse = {};
    108    offerToReceiveFalse[`offerToReceive${capsKind}`] = false;
    109 
    110    // Start testing
    111    promise_test(t => {
    112      const pc = new RTCPeerConnection();
    113      t.add_cleanup(() => pc.close());
    114      const dummy = pc.createDataChannel('foo'); // Just to have something to offer
    115 
    116      return pc.createOffer(offerToReceiveFalse)
    117      .then(() => {
    118        assert_equals(pc.getTransceivers().length, 0,
    119          'Expect pc to have no transceivers');
    120      });
    121    }, `createOffer() with offerToReceive${capsKind} set to false should not create a transceiver`);
    122 
    123    promise_test(t => {
    124      const pc = new RTCPeerConnection();
    125 
    126      t.add_cleanup(() => pc.close());
    127 
    128      return pc.createOffer(offerToReceiveTrue)
    129      .then(() => {
    130        assert_equals(pc.getTransceivers().length, 1,
    131          'Expect pc to have one transceiver');
    132 
    133        const transceiver = pc.getTransceivers()[0];
    134        assert_equals(transceiver.direction, 'recvonly',
    135          'Expect transceiver to have "recvonly" direction');
    136      });
    137    }, `createOffer() with offerToReceive${capsKind} should create a "recvonly" transceiver`);
    138 
    139    promise_test(t => {
    140      const pc = new RTCPeerConnection();
    141 
    142      t.add_cleanup(() => pc.close());
    143 
    144      return pc.createOffer(offerToReceiveTrue)
    145      .then(() => {
    146        assert_equals(pc.getTransceivers().length, 1,
    147          'Expect pc to have one transceiver');
    148 
    149        const transceiver = pc.getTransceivers()[0];
    150        assert_equals(transceiver.direction, 'recvonly',
    151          'Expect transceiver to have "recvonly" direction');
    152      })
    153      .then(() => pc.createOffer(offerToReceiveTrue))
    154      .then(() => {
    155        assert_equals(pc.getTransceivers().length, 1,
    156          'Expect pc to still have only one transceiver');
    157      })
    158      ;
    159    }, `offerToReceive${capsKind} option should be ignored if a non-stopped "recvonly" transceiver exists`);
    160 
    161    promise_test(t => {
    162      const pc = new RTCPeerConnection();
    163 
    164      t.add_cleanup(() => pc.close());
    165 
    166      return getTrackFromUserMedia(kind)
    167      .then(([track, stream]) => {
    168        pc.addTrack(track, stream);
    169        return pc.createOffer();
    170      })
    171      .then(() => {
    172        assert_equals(pc.getTransceivers().length, 1,
    173          'Expect pc to have one transceiver');
    174 
    175        const transceiver = pc.getTransceivers()[0];
    176        assert_equals(transceiver.direction, 'sendrecv',
    177          'Expect transceiver to have "sendrecv" direction');
    178      })
    179      .then(() => pc.createOffer(offerToReceiveTrue))
    180      .then(() => {
    181        assert_equals(pc.getTransceivers().length, 1,
    182          'Expect pc to still have only one transceiver');
    183      })
    184      ;
    185    }, `offerToReceive${capsKind} option should be ignored if a non-stopped "sendrecv" transceiver exists`);
    186 
    187    promise_test(t => {
    188      const pc = new RTCPeerConnection();
    189 
    190      t.add_cleanup(() => pc.close());
    191 
    192      return getTrackFromUserMedia(kind)
    193      .then(([track, stream]) => {
    194        pc.addTrack(track, stream);
    195        return pc.createOffer(offerToReceiveFalse);
    196      })
    197      .then(() => {
    198        assert_equals(pc.getTransceivers().length, 1,
    199          'Expect pc to have one transceiver');
    200 
    201        const transceiver = pc.getTransceivers()[0];
    202        assert_equals(transceiver.direction, 'sendonly',
    203          'Expect transceiver to have "sendonly" direction');
    204      })
    205      ;
    206    }, `offerToReceive${capsKind} set to false with a track should create a "sendonly" transceiver`);
    207 
    208    promise_test(t => {
    209      const pc = new RTCPeerConnection();
    210 
    211      t.add_cleanup(() => pc.close());
    212 
    213      pc.addTransceiver(kind, {direction: 'recvonly'});
    214 
    215      return pc.createOffer(offerToReceiveFalse)
    216      .then(() => {
    217        assert_equals(pc.getTransceivers().length, 1,
    218          'Expect pc to have one transceiver');
    219 
    220        const transceiver = pc.getTransceivers()[0];
    221        assert_equals(transceiver.direction, 'inactive',
    222          'Expect transceiver to have "inactive" direction');
    223      })
    224      ;
    225    }, `offerToReceive${capsKind} set to false with a "recvonly" transceiver should change the direction to "inactive"`);
    226 
    227    promise_test(t => {
    228      const pc = new RTCPeerConnection();
    229      t.add_cleanup(() => pc.close());
    230      const pc2 = new RTCPeerConnection();
    231 
    232      t.add_cleanup(() => pc2.close());
    233 
    234      return getTrackFromUserMedia(kind)
    235      .then(([track, stream]) => {
    236        pc.addTrack(track, stream);
    237        return pc.createOffer();
    238      })
    239      .then((offer) => pc.setLocalDescription(offer))
    240      .then(() => pc2.setRemoteDescription(pc.localDescription))
    241      .then(() => pc2.createAnswer())
    242      .then((answer) => pc2.setLocalDescription(answer))
    243      .then(() => pc.setRemoteDescription(pc2.localDescription))
    244      .then(() => pc.createOffer(offerToReceiveFalse))
    245      .then((offer) => {
    246        assert_equals(pc.getTransceivers().length, 1,
    247          'Expect pc to have one transceiver');
    248 
    249        const transceiver = pc.getTransceivers()[0];
    250        assert_equals(transceiver.direction, 'sendonly',
    251          'Expect transceiver to have "sendonly" direction');
    252      })
    253      ;
    254    }, `subsequent offerToReceive${capsKind} set to false with a track should change the direction to "sendonly"`);
    255  });
    256 
    257  promise_test(t => {
    258    const pc = new RTCPeerConnection();
    259 
    260    t.add_cleanup(() => pc.close());
    261 
    262    return pc.createOffer({ offerToReceiveAudio: true, offerToReceiveVideo: true })
    263    .then(() => {
    264      assert_equals(pc.getTransceivers().length, 2,
    265        'Expect pc to have two transceivers');
    266 
    267      assert_equals(pc.getTransceivers()[0].direction, 'recvonly',
    268        'Expect first transceiver to have "recvonly" direction');
    269      assert_equals(pc.getTransceivers()[1].direction, 'recvonly',
    270        'Expect second transceiver to have "recvonly" direction');
    271    });
    272  }, 'offerToReceiveAudio and Video should create two "recvonly" transceivers');
    273 
    274 </script>