tor-browser

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

MediaRecorder-events-and-exceptions.html (5713B)


      1 <!doctype html>
      2 <html>
      3 <head>
      4    <title>MediaRecorder events and exceptions</title>
      5    <meta name=timeout content=long>
      6    <meta name=variant content="?mimeType=''">
      7    <meta name=variant content="?mimeType=video/webm;codecs=vp8,opus">
      8    <meta name=variant content="?mimeType=video/webm;codecs=vp9,opus">
      9    <meta name=variant content="?mimeType=video/webm;codecs=av1,opus">
     10    <meta name=variant content="?mimeType=video/mp4;codecs=avc1.64003E,mp4a.40.2">
     11    <meta name=variant content="?mimeType=video/mp4;codecs=avc3.64003E,mp4a.40.2">
     12    <meta name=variant content="?mimeType=video/mp4;codecs=vp9,opus">
     13    <meta name=variant content="?mimeType=video/mp4;codecs=av01,opus">
     14    <meta name=variant content="?mimeType=video/mp4;codecs=av01,mp4a.40.2">
     15    <meta name=variant content="?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,opus">
     16    <meta name=variant content="?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,opus">
     17    <meta name=variant content="?mimeType=video/mp4;codecs=hvc1.1.6.L186.B0,mp4a.40.2">
     18    <meta name=variant content="?mimeType=video/mp4;codecs=hev1.1.6.L186.B0,mp4a.40.2">
     19    <meta name=variant content="?mimeType=video/x-matroska;codecs=hvc1.1.6.L186.B0,opus">
     20    <meta name=variant content="?mimeType=video/x-matroska;codecs=hev1.1.6.L186.B0,opus">
     21    <meta name=variant content="?mimeType=video/mp4">
     22    <link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#mediarecorder">
     23    <script src="/resources/testharness.js"></script>
     24    <script src="/resources/testharnessreport.js"></script>
     25    <script src="utils/sources.js"></script>
     26 </head>
     27 <body>
     28 <script>
     29 
     30  // This test exercises the MediaRecorder API event sequence:
     31  //   onStart -> onPause -> onResume -> onDataAvailable -> onStop
     32  // verifying the |state| and a few exceptions that are supposed to be thrown
     33  // when doing the wrong thing.
     34 
     35  async_test(test => {
     36 
     37    recorderOnUnexpectedEvent = test.step_func(() => {
     38      assert_unreached('Unexpected event.');
     39    });
     40 
     41    recorderOnDataAvailable = test.step_func(event => {
     42      assert_equals(recorder.state, "inactive");
     43      assert_not_equals(event.data.size, 0, 'We should get a Blob with data');
     44    });
     45 
     46    recorderOnStop = test.step_func(function() {
     47      assert_equals(recorder.state, "inactive");
     48      recorder.onstop = recorderOnUnexpectedEvent;
     49      recorder.stop();
     50      assert_equals(recorder.state, "inactive", "stop() is idempotent");
     51      assert_throws_dom("InvalidStateError", function() { recorder.pause() },
     52                        "recorder cannot be pause()ed in |inactive| state");
     53      assert_throws_dom("InvalidStateError", function() { recorder.resume() },
     54                        "recorder cannot be resume()d in |inactive| state");
     55      assert_throws_dom("InvalidStateError", function() { recorder.requestData() },
     56                        "cannot requestData() if recorder is in |inactive| state");
     57      test.done();
     58    });
     59 
     60    recorderOnResume = test.step_func(function() {
     61      assert_equals(recorder.state, "recording");
     62      recorder.onresume = recorderOnUnexpectedEvent;
     63      recorder.onstop = recorderOnStop;
     64      recorder.stop();
     65    });
     66 
     67    recorderOnPause = test.step_func(function() {
     68      assert_equals(recorder.state, "paused");
     69      recorder.onpause = recorderOnUnexpectedEvent;
     70      recorder.onresume = recorderOnResume;
     71      recorder.resume();
     72    });
     73 
     74    recorderOnStart = test.step_func(function() {
     75      assert_equals(recorder.state, "recording");
     76      recorder.onstart = recorderOnUnexpectedEvent;
     77      recorder.onpause = recorderOnPause;
     78      recorder.pause();
     79    });
     80 
     81    const { stream } = createFlowingVideoStream(test);
     82    assert_equals(stream.getAudioTracks().length, 0);
     83    assert_equals(stream.getVideoTracks().length, 1);
     84    assert_equals(stream.getVideoTracks()[0].readyState, 'live');
     85 
     86    assert_throws_dom("NotSupportedError",
     87                      function() {
     88                        new MediaRecorder(
     89                          new MediaStream(), {mimeType : "video/invalid"});
     90                      },
     91                      "recorder should throw() with unsupported mimeType");
     92 
     93    const params = new URLSearchParams(window.location.search);
     94    const mimeType = params.get('mimeType');
     95    if (mimeType && !MediaRecorder.isTypeSupported(mimeType)) {
     96      test.done();
     97      return;
     98    }
     99 
    100    const recorder = new MediaRecorder(new MediaStream(), { mimeType });
    101    assert_equals(recorder.state, "inactive");
    102 
    103    recorder.stop();
    104    assert_equals(recorder.state, "inactive", "stop() is idempotent");
    105    assert_throws_dom("InvalidStateError", function(){recorder.pause()},
    106                      "recorder cannot be pause()ed in |inactive| state");
    107    assert_throws_dom("InvalidStateError", function(){recorder.resume()},
    108                      "recorder cannot be resume()d in |inactive| state");
    109    assert_throws_dom("InvalidStateError", function(){recorder.requestData()},
    110                      "cannot requestData() if recorder is in |inactive| state");
    111 
    112    assert_throws_dom("NotSupportedError",
    113                      function() {
    114                        recorder.start();
    115                      },
    116                      "recorder should throw() when starting with inactive stream");
    117 
    118    recorder.stream.addTrack(stream.getTracks()[0]);
    119 
    120    recorder.onstop = recorderOnUnexpectedEvent;
    121    recorder.onpause = recorderOnUnexpectedEvent;
    122    recorder.onresume = recorderOnUnexpectedEvent;
    123    recorder.onerror = recorderOnUnexpectedEvent;
    124    recorder.ondataavailable = recorderOnDataAvailable;
    125    recorder.onstart = recorderOnStart;
    126 
    127    recorder.start();
    128    assert_equals(recorder.state, "recording");
    129  });
    130 
    131 </script>