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>