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>