test_mediatrack_events.html (4207B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test events of media track interfaces</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 7 <script type="text/javascript" src="manifest.js"></script> 8 <script type="text/javascript" src="gUM_support.js"></script> 9 </head> 10 <body> 11 <pre id="test"> 12 <script class="testbody" type="text/javascript"> 13 async function startTest() { 14 let steps = 0; 15 let element = document.createElement("video"); 16 let stream; 17 try { 18 await setupGetUserMediaTestPrefs(); 19 stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true}); 20 } catch (err) { 21 ok(false, 'Unexpected error fired with: ' + err); 22 SimpleTest.finish(); 23 return; 24 } 25 26 function verifyEvent(e, type) { 27 is(e.type, type, "Event type should be " + type); 28 ok(e.isTrusted, "Event should be trusted."); 29 ok(!e.bubbles, "Event shouldn't bubble."); 30 ok(!e.cancelable, "Event shouldn't be cancelable."); 31 } 32 33 element.audioTracks.onaddtrack = function(e) { 34 ok(e instanceof TrackEvent, "Event fired from onaddtrack should be a TrackEvent"); 35 ok(true, 'onaddtrack is expected to be called from audioTracks.'); 36 verifyEvent(e, "addtrack"); 37 }; 38 39 element.audioTracks.onremovetrack = function(e) { 40 ok(e instanceof TrackEvent, "Event fired from onremovetrack should be a TrackEvent"); 41 ok(true, 'onremovetrack is expected to be called from audioTracks.'); 42 verifyEvent(e, "removetrack"); 43 }; 44 45 element.audioTracks.onchange = function(e) { 46 ok(e instanceof window.Event, "Event fired from onchange should be a simple event."); 47 ok(true, 'onchange is expected to be called from audioTracks.'); 48 verifyEvent(e, "change"); 49 }; 50 51 element.videoTracks.onaddtrack = function(e) { 52 ok(e instanceof TrackEvent, "Event fired from onaddtrack should be a TrackEvent"); 53 ok(true, 'onaddtrack is expected to be called from videoTracks.'); 54 verifyEvent(e, "addtrack"); 55 }; 56 57 element.videoTracks.onremovetrack = function(e) { 58 ok(e instanceof TrackEvent, "Event fired from onremovetrack should be a TrackEvent"); 59 ok(true, 'onremovetrack is expected to be called from videoTracks.'); 60 verifyEvent(e, "removetrack"); 61 }; 62 63 element.videoTracks.onchange = function(e) { 64 ok(e instanceof window.Event, "Event fired from onchange should be a simple event."); 65 ok(true, 'onchange is expected to be called from videoTracks.'); 66 verifyEvent(e, "change"); 67 }; 68 69 element.onended = function() { 70 ok(true, 'Event ended is expected to be fired on element.'); 71 element.onended = null; 72 element.onplaying = null; 73 element.onpause = null; 74 //This helps to prevent these events from firing after SimpleTest.finish() 75 //on B2G ICS Emulator, but not sure they have been run at all, then 76 element.audioTracks.onremovetrack = null; 77 element.audioTracks.onaddtrack = null; 78 element.audioTracks.onchange = null; 79 element.videoTracks.onremovetrack = null; 80 element.videoTracks.onaddtrack = null; 81 element.videoTracks.onchange = null; 82 SimpleTest.finish(); 83 } 84 85 function onpause() { 86 element.onpause = null; 87 if (element.ended) { 88 return; 89 } 90 if (steps == 1) { 91 element.audioTracks[0].enabled = false; 92 element.videoTracks[0].selected = false; 93 element.onplaying = onplaying; 94 element.play(); 95 steps++; 96 } 97 } 98 99 function onplaying() { 100 element.onplaying = null; 101 if (element.ended) { 102 return; 103 } 104 if (steps == 1) { 105 element.onpause = onpause; 106 element.pause(); 107 } else if (steps == 2) { 108 stream.getTracks().forEach(t => t.stop()); 109 } 110 } 111 112 element.onplaying = onplaying; 113 element.srcObject = stream; 114 115 isnot(element.audioTracks, undefined, 116 'HTMLMediaElement::AudioTracks() property should be available.'); 117 isnot(element.videoTracks, undefined, 118 'HTMLMediaElement::VideoTracks() property should be available.'); 119 120 steps++; 121 await element.play(); 122 } 123 124 SimpleTest.waitForExplicitFinish(); 125 SpecialPowers.pushPrefEnv( 126 { 127 "set": [ 128 ["media.track.enabled", true] 129 ] 130 }, startTest); 131 132 </script> 133 </pre> 134 </body> 135 </html>