test_peerConnection_recordReceiveTrack.html (3190B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <script src="pc.js"></script> 5 </head> 6 <body> 7 <pre id="test"> 8 <script> 9 createHTML({ 10 bug: "1212237", 11 title: "Recording a fresh receive track should not throw", 12 visible: true, 13 }); 14 15 /** 16 * Called when a fresh track is available, and tests that the track can be 17 * recorded until it ends without any thrown errors or fired error events. 18 */ 19 let generation = 0; 20 async function testTrackAccessible(track) { 21 const id = ++generation; 22 info(`Testing accessibility for ${track.kind} track ${id}`); 23 const recorder = new MediaRecorder(new MediaStream([track])); 24 recorder.start(); 25 let haveError = new Promise((_, rej) => recorder.onerror = e => rej(e.error)); 26 await Promise.race([ 27 new Promise(r => recorder.onstart = r), 28 haveError, 29 ]); 30 info(`Recording of ${track.kind} track ${id} started`); 31 32 const {data} = await Promise.race([ 33 new Promise(r => recorder.ondataavailable = r), 34 haveError, 35 ]); 36 info(`Recording of ${track.kind} track ${id} finished at size ${data.size}`); 37 38 await Promise.race([ 39 new Promise(r => recorder.onstop = r), 40 haveError, 41 ]); 42 info(`Recording of ${track.kind} track ${id} stopped`); 43 44 const element = createMediaElement(track.kind, `recording_${track.id}`); 45 const url = URL.createObjectURL(data); 46 try { 47 element.src = url; 48 element.preload = "metadata"; 49 haveError = new Promise( 50 (_, rej) => element.onerror = e => rej(element.error)); 51 await Promise.race([ 52 new Promise(r => element.onloadeddata = r), 53 haveError, 54 ]); 55 info(`Playback of recording of ${track.kind} track ${id} loaded data`); 56 57 element.play(); 58 await Promise.race([ 59 new Promise(r => element.onended = r), 60 haveError, 61 ]); 62 info(`Playback of recording of ${track.kind} track ${id} ended`); 63 } finally { 64 URL.revokeObjectURL(data); 65 } 66 } 67 68 runNetworkTest(async options => { 69 // [TODO] re-enable HW decoder after bug 1526207 is fixed. 70 if (navigator.userAgent.includes("Android")) { 71 await pushPrefs(["media.navigator.mediadatadecoder_vpx_enabled", false], 72 ["media.webrtc.hw.h264.enabled", false]); 73 } 74 const test = new PeerConnectionTest(options); 75 test.setMediaConstraints([{video: true}], [{audio: true}]); 76 test.setOfferOptions({offerToReceiveAudio: true}); 77 const freshVideoTrackIsAccessible = new Promise( 78 r => test.pcRemote._pc.addEventListener("track", r, {once: true}) 79 ).then(({track}) => testTrackAccessible(track)); 80 const freshAudioTrackIsAccessible = new Promise( 81 r => test.pcLocal._pc.addEventListener("track", r, {once: true}) 82 ).then(({track}) => testTrackAccessible(track)); 83 test.chain.append([ 84 function PC_CLOSE_TO_END_TRACKS() { 85 return test.close(); 86 }, 87 async function FRESH_VIDEO_TRACK_IS_ACCESSIBLE() { 88 await freshVideoTrackIsAccessible; 89 ok(true, "A freshly received video track is accessible by MediaRecorder"); 90 }, 91 async function FRESH_AUDIO_TRACK_IS_ACCESSIBLE() { 92 await freshAudioTrackIsAccessible; 93 ok(true, "A freshly received audio track is accessible by MediaRecorder"); 94 }, 95 ]); 96 await test.run(); 97 }); 98 </script> 99 </pre> 100 </body> 101 </html>