test_mediarecorder_avoid_recursion.html (1978B)
1 <html> 2 <head> 3 <title>MediaRecorder infinite recursion with requestData() calls in "dataavailable" event</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=897776">Mozill 11 a Bug 897776</a> 12 <pre id="test"> 13 <script class="testbody" type="text/javascript"> 14 async function startTest() { 15 try { 16 await setupGetUserMediaTestPrefs(); 17 let stream = await navigator.mediaDevices.getUserMedia({audio: true}); 18 let mediaRecorder = new MediaRecorder(stream); 19 let count = 0; 20 mediaRecorder.onerror = function () { 21 ok(false, 'Unexpected onerror callback fired'); 22 SimpleTest.finish(); 23 }; 24 mediaRecorder.onwarning = function () { 25 ok(false, 'Unexpected onwarning callback fired'); 26 }; 27 mediaRecorder.ondataavailable = function (e) { 28 ++count; 29 info("got ondataavailable data size = " + e.data.size); 30 // no more requestData() to prevent busy main thread from starving 31 // the encoding thread 32 if (count == 30) { 33 info("track.stop"); 34 stream.getTracks()[0].stop(); 35 } else if (count < 30 && mediaRecorder.state == 'recording') { 36 info("requestData again"); 37 mediaRecorder.requestData(); 38 } 39 }; 40 mediaRecorder.onstop = function () { 41 ok(true, "requestData within ondataavailable successfully avoided infinite recursion"); 42 SimpleTest.finish(); 43 }; 44 mediaRecorder.start(); 45 info("mediaRecorder start"); 46 mediaRecorder.requestData(); 47 info("mediaRecorder requestData"); 48 } catch (e) { 49 ok(false, 'Unexpected error fired with: ' + e); 50 SimpleTest.finish(); 51 } 52 } 53 54 SimpleTest.waitForExplicitFinish(); 55 startTest(); 56 57 </script> 58 </pre> 59 </body> 60 </html>