tor-browser

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

test_mediatrack_events.html (4207B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <title>Test events of media track interfaces</title>
      5  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      6  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
      7  <script type="text/javascript" src="manifest.js"></script>
      8  <script type="text/javascript" src="gUM_support.js"></script>
      9 </head>
     10 <body>
     11 <pre id="test">
     12 <script class="testbody" type="text/javascript">
     13 async function startTest() {
     14  let steps = 0;
     15  let element = document.createElement("video");
     16  let stream;
     17  try {
     18    await setupGetUserMediaTestPrefs();
     19    stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
     20  } catch (err) {
     21    ok(false, 'Unexpected error fired with: ' + err);
     22    SimpleTest.finish();
     23    return;
     24  }
     25 
     26  function verifyEvent(e, type) {
     27    is(e.type, type, "Event type should be " + type);
     28    ok(e.isTrusted, "Event should be trusted.");
     29    ok(!e.bubbles, "Event shouldn't bubble.");
     30    ok(!e.cancelable, "Event shouldn't be cancelable.");
     31  }
     32 
     33  element.audioTracks.onaddtrack = function(e) {
     34    ok(e instanceof TrackEvent, "Event fired from onaddtrack should be a TrackEvent");
     35    ok(true, 'onaddtrack is expected to be called from audioTracks.');
     36    verifyEvent(e, "addtrack");
     37  };
     38 
     39  element.audioTracks.onremovetrack = function(e) {
     40    ok(e instanceof TrackEvent, "Event fired from onremovetrack should be a TrackEvent");
     41    ok(true, 'onremovetrack is expected to be called from audioTracks.');
     42    verifyEvent(e, "removetrack");
     43  };
     44 
     45  element.audioTracks.onchange = function(e) {
     46    ok(e instanceof window.Event, "Event fired from onchange should be a simple event.");
     47    ok(true, 'onchange is expected to be called from audioTracks.');
     48    verifyEvent(e, "change");
     49  };
     50 
     51  element.videoTracks.onaddtrack = function(e) {
     52    ok(e instanceof TrackEvent, "Event fired from onaddtrack should be a TrackEvent");
     53    ok(true, 'onaddtrack is expected to be called from videoTracks.');
     54    verifyEvent(e, "addtrack");
     55  };
     56 
     57  element.videoTracks.onremovetrack = function(e) {
     58    ok(e instanceof TrackEvent, "Event fired from onremovetrack should be a TrackEvent");
     59    ok(true, 'onremovetrack is expected to be called from videoTracks.');
     60    verifyEvent(e, "removetrack");
     61  };
     62 
     63  element.videoTracks.onchange = function(e) {
     64    ok(e instanceof window.Event, "Event fired from onchange should be a simple event.");
     65    ok(true, 'onchange is expected to be called from videoTracks.');
     66    verifyEvent(e, "change");
     67  };
     68 
     69  element.onended = function() {
     70    ok(true, 'Event ended is expected to be fired on element.');
     71    element.onended = null;
     72    element.onplaying = null;
     73    element.onpause = null;
     74    //This helps to prevent these events from firing after SimpleTest.finish()
     75    //on B2G ICS Emulator, but not sure they have been run at all, then
     76    element.audioTracks.onremovetrack = null;
     77    element.audioTracks.onaddtrack = null;
     78    element.audioTracks.onchange = null;
     79    element.videoTracks.onremovetrack = null;
     80    element.videoTracks.onaddtrack = null;
     81    element.videoTracks.onchange = null;
     82    SimpleTest.finish();
     83  }
     84 
     85  function onpause() {
     86    element.onpause = null;
     87    if (element.ended) {
     88      return;
     89    }
     90    if (steps == 1) {
     91      element.audioTracks[0].enabled = false;
     92      element.videoTracks[0].selected = false;
     93      element.onplaying = onplaying;
     94      element.play();
     95      steps++;
     96    }
     97  }
     98 
     99  function onplaying() {
    100    element.onplaying = null;
    101    if (element.ended) {
    102      return;
    103    }
    104    if (steps == 1) {
    105      element.onpause = onpause;
    106      element.pause();
    107    } else if (steps == 2) {
    108      stream.getTracks().forEach(t => t.stop());
    109    }
    110  }
    111 
    112  element.onplaying = onplaying;
    113  element.srcObject = stream;
    114 
    115  isnot(element.audioTracks, undefined,
    116        'HTMLMediaElement::AudioTracks() property should be available.');
    117  isnot(element.videoTracks, undefined,
    118        'HTMLMediaElement::VideoTracks() property should be available.');
    119 
    120  steps++;
    121  await element.play();
    122 }
    123 
    124 SimpleTest.waitForExplicitFinish();
    125 SpecialPowers.pushPrefEnv(
    126  {
    127    "set": [
    128      ["media.track.enabled", true]
    129    ]
    130  }, startTest);
    131 
    132 </script>
    133 </pre>
    134 </body>
    135 </html>