tor-browser

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

test_getUserMedia_addTrackRemoveTrack.html (7223B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
      5 </head>
      6 <body>
      7 <pre id="test">
      8 <script type="application/javascript">
      9  "use strict";
     10 
     11  createHTML({
     12    title: "MediaStream's addTrack() and removeTrack() with getUserMedia streams Test",
     13    bug: "1103188"
     14  });
     15 
     16  runTest(() => Promise.resolve()
     17    .then(() => getUserMedia({audio: true})).then(stream =>
     18      getUserMedia({video: true}).then(otherStream => {
     19        info("Test addTrack()ing a video track to an audio-only gUM stream");
     20        var track = stream.getTracks()[0];
     21        var otherTrack = otherStream.getTracks()[0];
     22 
     23        stream.addTrack(track);
     24        checkMediaStreamContains(stream, [track], "Re-added audio");
     25 
     26        stream.addTrack(otherTrack);
     27        checkMediaStreamContains(stream, [track, otherTrack], "Added video");
     28 
     29        var testElem = createMediaElement('video', 'testAddTrackAudioVideo');
     30        var playback = new MediaStreamPlayback(testElem, stream);
     31        return playback.playMedia(false);
     32    }))
     33    .then(() => getUserMedia({video: true})).then(stream =>
     34      getUserMedia({video: true}).then(otherStream => {
     35        info("Test addTrack()ing a video track to a video-only gUM stream");
     36        var track = stream.getTracks()[0];
     37        var otherTrack = otherStream.getTracks()[0];
     38 
     39        stream.addTrack(track);
     40        checkMediaStreamContains(stream, [track], "Re-added video");
     41 
     42        stream.addTrack(otherTrack);
     43        checkMediaStreamContains(stream, [track, otherTrack], "Added video");
     44 
     45        var test = createMediaElement('video', 'testAddTrackDoubleVideo');
     46        var playback = new MediaStreamPlayback(test, stream);
     47        return playback.playMedia(false);
     48    }))
     49    .then(() => getUserMedia({video: true})).then(stream =>
     50      getUserMedia({video: true}).then(otherStream => {
     51        info("Test removeTrack() existing and added video tracks from a video-only gUM stream");
     52        var track = stream.getTracks()[0];
     53        var otherTrack = otherStream.getTracks()[0];
     54 
     55        stream.removeTrack(otherTrack);
     56        checkMediaStreamContains(stream, [track], "Removed non-existing video");
     57 
     58        stream.addTrack(otherTrack);
     59        checkMediaStreamContains(stream, [track, otherTrack], "Added video");
     60 
     61        stream.removeTrack(otherTrack);
     62        checkMediaStreamContains(stream, [track], "Removed added video");
     63 
     64        stream.removeTrack(otherTrack);
     65        checkMediaStreamContains(stream, [track], "Re-removed added video");
     66 
     67        stream.removeTrack(track);
     68        checkMediaStreamContains(stream, [], "Removed original video");
     69 
     70        var elem = createMediaElement('video', 'testRemoveAllVideo');
     71        var loadeddata = false;
     72        elem.onloadeddata = () => { loadeddata = true; elem.onloadeddata = null; };
     73        elem.srcObject = stream;
     74        elem.play();
     75        return wait(500).then(() => {
     76          ok(!loadeddata, "Stream without tracks shall not raise 'loadeddata' on media element");
     77          elem.pause();
     78          elem.srcObject = null;
     79        })
     80        .then(() => {
     81          stream.addTrack(track);
     82          checkMediaStreamContains(stream, [track], "Re-added added-then-removed track");
     83          var playback = new MediaStreamPlayback(elem, stream);
     84          return playback.playMedia(false);
     85        })
     86        .then(() => otherTrack.stop());
     87    }))
     88    .then(() => getUserMedia({ audio: true })).then(audioStream =>
     89      getUserMedia({ video: true }).then(videoStream => {
     90        info("Test adding track and removing the original");
     91        var audioTrack = audioStream.getTracks()[0];
     92        var videoTrack = videoStream.getTracks()[0];
     93        videoStream.removeTrack(videoTrack);
     94        audioStream.addTrack(videoTrack);
     95 
     96        checkMediaStreamContains(videoStream, [], "1, Removed original track");
     97        checkMediaStreamContains(audioStream, [audioTrack, videoTrack],
     98                                 "2, Added external track");
     99 
    100        var elem = createMediaElement('video', 'testAddRemoveOriginalTrackVideo');
    101        var playback = new MediaStreamPlayback(elem, audioStream);
    102        return playback.playMedia(false);
    103      }))
    104    .then(() => getUserMedia({ audio: true, video: true })).then(stream => {
    105      info("Test removing stopped tracks");
    106      stream.getTracks().forEach(t => {
    107        t.stop();
    108        stream.removeTrack(t);
    109      });
    110      checkMediaStreamContains(stream, [], "Removed stopped tracks");
    111    })
    112    .then(() => {
    113      var ac = new AudioContext();
    114 
    115      var osc1k = createOscillatorStream(ac, 1000);
    116      var audioTrack1k = osc1k.getTracks()[0];
    117 
    118      var osc5k = createOscillatorStream(ac, 5000);
    119      var audioTrack5k = osc5k.getTracks()[0];
    120 
    121      var osc10k = createOscillatorStream(ac, 10000);
    122      var audioTrack10k = osc10k.getTracks()[0];
    123 
    124      var stream = osc1k;
    125      return Promise.resolve().then(() => {
    126        info("Analysing audio output with original 1k track");
    127        var analyser = new AudioStreamAnalyser(ac, stream);
    128        return analyser.waitForAnalysisSuccess(array =>
    129                 array[analyser.binIndexForFrequency(50)] < 50 &&
    130                 array[analyser.binIndexForFrequency(1000)] > 200 &&
    131                 array[analyser.binIndexForFrequency(5000)] < 50 &&
    132                 array[analyser.binIndexForFrequency(10000)] < 50);
    133      }).then(() => {
    134        info("Analysing audio output with removed original 1k track and added 5k track");
    135        stream.removeTrack(audioTrack1k);
    136        stream.addTrack(audioTrack5k);
    137        var analyser = new AudioStreamAnalyser(ac, stream);
    138        return analyser.waitForAnalysisSuccess(array =>
    139                 array[analyser.binIndexForFrequency(1000)] < 50 &&
    140                 array[analyser.binIndexForFrequency(5000)] > 200 &&
    141                 array[analyser.binIndexForFrequency(10000)] < 50);
    142      }).then(() => {
    143        info("Analysing audio output with removed 5k track and added 10k track");
    144        stream.removeTrack(audioTrack5k);
    145        stream.addTrack(audioTrack10k);
    146        var analyser = new AudioStreamAnalyser(ac, stream);
    147        return analyser.waitForAnalysisSuccess(array =>
    148                 array[analyser.binIndexForFrequency(1000)] < 50 &&
    149                 array[analyser.binIndexForFrequency(5000)] < 50 &&
    150                 array[analyser.binIndexForFrequency(10000)] > 200);
    151      }).then(() => {
    152        info("Analysing audio output with re-added 1k, 5k and added 10k tracks");
    153        stream.addTrack(audioTrack1k);
    154        stream.addTrack(audioTrack5k);
    155        var analyser = new AudioStreamAnalyser(ac, stream);
    156        return analyser.waitForAnalysisSuccess(array =>
    157                 array[analyser.binIndexForFrequency(50)] < 50 &&
    158                 array[analyser.binIndexForFrequency(1000)] > 200 &&
    159                 array[analyser.binIndexForFrequency(2500)] < 50 &&
    160                 array[analyser.binIndexForFrequency(5000)] > 200 &&
    161                 array[analyser.binIndexForFrequency(7500)] < 50 &&
    162                 array[analyser.binIndexForFrequency(10000)] > 200 &&
    163                 array[analyser.binIndexForFrequency(11000)] < 50);
    164      });
    165    }));
    166 </script>
    167 </pre>
    168 </body>
    169 </html>