tor-browser

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

RTCPeerConnection-setRemoteDescription-replaceTrack.https.html (4206B)


      1 <!doctype html>
      2 <meta charset=utf-8>
      3 <title>RTCPeerConnection.prototype.setRemoteDescription - replaceTrack</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  // The following helper functions are called from RTCPeerConnection-helper.js:
     11  //   getUserMediaTracksAndStreams
     12 
     13  async_test(t => {
     14    const caller = new RTCPeerConnection();
     15    t.add_cleanup(() => caller.close());
     16    getUserMediaTracksAndStreams(2)
     17    .then(t.step_func(([tracks, streams]) => {
     18      const sender = caller.addTrack(tracks[0], streams[0]);
     19      return sender.replaceTrack(tracks[1])
     20      .then(t.step_func(() => {
     21        assert_equals(sender.track, tracks[1]);
     22        t.done();
     23      }));
     24    }))
     25    .catch(t.step_func(reason => {
     26      assert_unreached(reason);
     27    }));
     28  }, 'replaceTrack() sets the track attribute to a new track.');
     29 
     30  async_test(t => {
     31    const caller = new RTCPeerConnection();
     32    t.add_cleanup(() => caller.close());
     33    getUserMediaTracksAndStreams(1)
     34    .then(t.step_func(([tracks, streams]) => {
     35      const sender = caller.addTrack(tracks[0], streams[0]);
     36      return sender.replaceTrack(null)
     37      .then(t.step_func(() => {
     38        assert_equals(sender.track, null);
     39        t.done();
     40      }));
     41    }))
     42    .catch(t.step_func(reason => {
     43      assert_unreached(reason);
     44    }));
     45  }, 'replaceTrack() sets the track attribute to null.');
     46 
     47  async_test(t => {
     48    const caller = new RTCPeerConnection();
     49    t.add_cleanup(() => caller.close());
     50    getUserMediaTracksAndStreams(2)
     51    .then(t.step_func(([tracks, streams]) => {
     52      const sender = caller.addTrack(tracks[0], streams[0]);
     53      assert_equals(sender.track, tracks[0]);
     54      sender.replaceTrack(tracks[1]);
     55      // replaceTrack() is asynchronous, there should be no synchronously
     56      // observable effects.
     57      assert_equals(sender.track, tracks[0]);
     58      t.done();
     59    }))
     60    .catch(t.step_func(reason => {
     61      assert_unreached(reason);
     62    }));
     63  }, 'replaceTrack() does not set the track synchronously.');
     64 
     65  async_test(t => {
     66    const expectedException = 'InvalidStateError';
     67    const caller = new RTCPeerConnection();
     68    t.add_cleanup(() => caller.close());
     69    getUserMediaTracksAndStreams(2)
     70    .then(t.step_func(([tracks, streams]) => {
     71      const sender = caller.addTrack(tracks[0], streams[0]);
     72      caller.close();
     73      return sender.replaceTrack(tracks[1])
     74      .then(t.step_func(() => {
     75        assert_unreached('Expected replaceTrack() to be rejected with ' +
     76                         expectedException + ' but the promise was resolved.');
     77      }),
     78      t.step_func(e => {
     79        assert_equals(e.name, expectedException);
     80        t.done();
     81      }));
     82    }))
     83    .catch(t.step_func(reason => {
     84      assert_unreached(reason);
     85    }));
     86  }, 'replaceTrack() rejects when the peer connection is closed.');
     87 
     88  promise_test(async t => {
     89    const caller = new RTCPeerConnection();
     90    t.add_cleanup(() => caller.close());
     91    const [tracks, streams] = await getUserMediaTracksAndStreams(2);
     92    const sender = caller.addTrack(tracks[0], streams[0]);
     93    caller.removeTrack(sender);
     94    await sender.replaceTrack(tracks[1]);
     95    assert_equals(sender.track, tracks[1], "Make sure track gets updated");
     96  }, 'replaceTrack() does not reject when invoked after removeTrack().');
     97 
     98 
     99  promise_test(async t => {
    100    const caller = new RTCPeerConnection();
    101    t.add_cleanup(() => caller.close());
    102    const [tracks, streams] = await getUserMediaTracksAndStreams(2);
    103    const sender = caller.addTrack(tracks[0], streams[0]);
    104    let p = sender.replaceTrack(tracks[1])
    105    caller.removeTrack(sender);
    106    await p;
    107    assert_equals(sender.track, tracks[1], "Make sure track gets updated");
    108  }, 'replaceTrack() does not reject after a subsequent removeTrack().');
    109 
    110  // TODO(hbos): Verify that replaceTrack() changes what media is received on
    111  // the remote end of two connected peer connections. For video tracks, this
    112  // requires Chromium's video tag to update on receiving frames when running
    113  // content_shell. https://crbug.com/793808
    114 
    115 </script>