tor-browser

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

test_mediarecorder_onerror_pause.html (4039B)


      1 <html>
      2 <head>
      3  <title>Bug 957439 - Media Recording - Assertion fail at Pause if unsupported input stream.</title>
      4  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      5  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
      6  <script type="text/javascript" src="manifest.js"></script>
      7  <script type="text/javascript" src="gUM_support.js"></script>
      8 </head>
      9 <body>
     10 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=957439">Mozilla Bug 957439</a>
     11 <pre id="test">
     12 <script class="testbody" type="text/javascript">
     13 
     14 function unexpected(e) {
     15  ok(false, `Got unexpected ${e.type} event`);
     16 }
     17 
     18 
     19 async function startTest() {
     20  // also do general checks on mimetype support for audio-only
     21  ok(MediaRecorder.isTypeSupported("audio/ogg"),
     22    'Should support audio/ogg');
     23  ok(MediaRecorder.isTypeSupported('audio/ogg; codecs=opus'),
     24    'Should support audio/ogg+opus');
     25  ok(!MediaRecorder.isTypeSupported('audio/ogg; codecs=foobar'),
     26    'Should not support audio/ogg + unknown_codec');
     27  ok(MediaRecorder.isTypeSupported("video/webm"),
     28    'Should support video/webm');
     29  ok(!MediaRecorder.isTypeSupported("video/mp4"),
     30    'Should not support video/mp4');
     31 
     32  try {
     33    await setupGetUserMediaTestPrefs();
     34    const expectedMimeType = 'video/webm; codecs="vp8, opus"';
     35    const stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
     36    const [audioTrack] = stream.getAudioTracks();
     37 
     38    // Expected event sequence should be:
     39    // 1. start
     40    // 2. error (from removed track)
     41    // 3. dataavailable
     42    // 4. stop
     43    const mediaRecorder = new MediaRecorder(stream);
     44    is(mediaRecorder.stream, stream, 'Stream should be provided on creation');
     45 
     46    mediaRecorder.onstart = unexpected;
     47    mediaRecorder.onerror = unexpected;
     48    mediaRecorder.ondataavailable = unexpected;
     49    mediaRecorder.onstop = unexpected;
     50 
     51    mediaRecorder.start();
     52    is(mediaRecorder.state, 'recording', 'state should be recording');
     53    is(mediaRecorder.mimeType, '', 'mimetype should be unset');
     54 
     55    await new Promise(r => mediaRecorder.onstart = r);
     56    mediaRecorder.onstart = unexpected;
     57    ok(true, 'start event fired');
     58    is(mediaRecorder.mimeType, expectedMimeType, 'mimetype should be set');
     59 
     60    // Trigger an error
     61    stream.removeTrack(audioTrack);
     62 
     63    const err = await new Promise(r => mediaRecorder.onerror = r);
     64    mediaRecorder.onerror = unexpected;
     65    ok(true, 'error event fired');
     66    is(err.error.name, 'InvalidModificationError',
     67      'Error name should be InvalidModificationError.');
     68    ok(err.error.stack.includes('test_mediarecorder_onerror_pause.html'),
     69      'Events fired from onerror should include an error with a stack trace indicating ' +
     70      'an error in this test');
     71    is(mediaRecorder.mimeType, '', 'mimetype should be unset');
     72    is(mediaRecorder.state, 'inactive', 'state is inactive');
     73 
     74    try {
     75      mediaRecorder.pause();
     76      ok(false, 'pause should fire an exception if called on an inactive recorder');
     77    } catch(e) {
     78      ok(e instanceof DOMException, 'pause should fire an exception ' +
     79        'if called on an inactive recorder');
     80      is(e.name, 'InvalidStateError', 'Exception name should be InvalidStateError');
     81    }
     82 
     83    const evt = await new Promise(r => mediaRecorder.ondataavailable = r);
     84    mediaRecorder.ondataavailable = unexpected;
     85    ok(true, 'dataavailable event fired');
     86    isnot(evt.data.size, 0, 'data size should not be zero');
     87    ok(evt instanceof BlobEvent,
     88        'Events fired from ondataavailable should be BlobEvent');
     89    is(evt.data.type, expectedMimeType, 'blob mimeType is set');
     90 
     91    await new Promise(r => mediaRecorder.onstop = r);
     92    mediaRecorder.onstop = unexpected;
     93    ok(true, 'onstop event fired');
     94    is(mediaRecorder.state, 'inactive', 'state should be inactive');
     95  } catch (err) {
     96    ok(false, `Unexpected error fired with: ${err}`);
     97  } finally {
     98    SimpleTest.finish();
     99  }
    100 }
    101 
    102 SimpleTest.waitForExplicitFinish();
    103 window.onload = startTest;
    104 
    105 </script>
    106 </head>
    107 </html>