<!DOCTYPE HTML> <html> <head> <title>Test track interfaces when consuming media resources</title> <script src="/tests/SimpleTest/SimpleTest.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> <script type="text/javascript" src="manifest.js"></script> </head> <body> <pre id="test"> <script class="testbody" type="text/javascript"> const manager = new MediaTestManager; function startTest(test, token) { const elemType = getMajorMimeType(test.type); const element = document.createElement(elemType); let audioOnchange = 0; let audioOnaddtrack = 0; let audioOnremovetrack = 0; let videoOnchange = 0; let videoOnaddtrack = 0; let videoOnremovetrack = 0; let isPlaying = false; isnot(element.audioTracks, undefined, 'HTMLMediaElement::AudioTracks() property should be available.'); isnot(element.videoTracks, undefined, 'HTMLMediaElement::VideoTracks() property should be available.'); element.audioTracks.onaddtrack = function(e) { audioOnaddtrack++; } element.audioTracks.onremovetrack = function(e) { audioOnremovetrack++; } element.audioTracks.onchange = function(e) { audioOnchange++; } element.videoTracks.onaddtrack = function(e) { videoOnaddtrack++; } element.videoTracks.onremovetrack = function(e) { videoOnremovetrack++; } element.videoTracks.onchange = function(e) { videoOnchange++; } function checkTrackNotRemoved() { is(audioOnremovetrack, 0, 'Should have no calls of onremovetrack on audioTracks.'); is(videoOnremovetrack, 0, 'Should have no calls of onremovetrack on videoTracks.'); if (isPlaying) { is(element.audioTracks.length, test.hasAudio ? 1 : 0, 'Expected length of audioTracks.'); is(element.videoTracks.length, test.hasVideo ? 1 : 0, 'Expected length of videoTracks.'); } } function checkTrackRemoved() { is(element.audioTracks.length, 0, 'The length of audioTracks should be 0.'); is(element.videoTracks.length, 0, 'The length of videoTracks should be 0.'); if (isPlaying) { is(audioOnremovetrack, test.hasAudio ? 1 : 0, 'Expected calls of onremovetrack on audioTracks.'); is(videoOnremovetrack, test.hasVideo ? 1 : 0, 'Expected calls of onremovetrack on videoTracks.'); } } function onended() { ok(true, 'Event ended is expected to be fired on element.'); checkTrackNotRemoved(); element.onended = null; element.onplaying = null; element.onpause = null; element.src = ""; is(element.audioTracks.length, 0, 'audioTracks have been forgotten'); is(element.videoTracks.length, 0, 'videoTracks have been forgotten'); is(audioOnremovetrack, 0, 'No audio removetrack events yet'); is(videoOnremovetrack, 0, 'No video removetrack events yet'); setTimeout(() => { checkTrackRemoved(); manager.finished(element.token); }, 100); } function checkTrackAdded() { isPlaying = true; if (test.hasAudio) { is(audioOnaddtrack, 1, 'Calls of onaddtrack on audioTracks should be 1.'); is(element.audioTracks.length, 1, 'The length of audioTracks should be 1.'); ok(element.audioTracks[0].enabled, 'Audio track should be enabled as default.'); } if (test.hasVideo) { is(videoOnaddtrack, 1, 'Calls of onaddtrack on videoTracks should be 1.'); is(element.videoTracks.length, 1, 'The length of videoTracks should be 1.'); is(element.videoTracks.selectedIndex, 0, 'The first video track is set selected as default.'); } } function setTrackEnabled(enabled) { if (test.hasAudio) { element.audioTracks[0].enabled = enabled; } if (test.hasVideo) { element.videoTracks[0].selected = enabled; } } function checkTrackChanged(calls, enabled) { if (test.hasAudio) { is(audioOnchange, calls, 'Calls of onchange on audioTracks should be '+calls); is(element.audioTracks[0].enabled, enabled, 'Enabled value of the audio track should be ' +enabled); } if (test.hasVideo) { is(videoOnchange, calls, 'Calls of onchange on videoTracks should be '+calls); is(element.videoTracks[0].selected, enabled, 'Selected value of the video track should be ' +enabled); var index = enabled ? 0 : -1; is(element.videoTracks.selectedIndex, index, 'SelectedIndex of video tracks should be ' +index); } } function onpause() { element.onpause = null; if (element.ended) { return; } if (steps == 1) { setTrackEnabled(false); element.onplaying = onplaying; element.play(); steps++; } else if (steps == 2) { setTrackEnabled(true); element.onplaying = onplaying; element.play(); steps++; } } function onplaying() { element.onplaying = null; if (element.ended) { return; } if (steps == 1) { element.onpause = onpause; element.pause(); checkTrackAdded(); } else if (steps == 2) { element.onpause = onpause; element.pause(); checkTrackChanged(1, false); } else if (steps == 3) { checkTrackChanged(2, true); } } var steps = 0; element.token = token; manager.started(token); element.src = test.name; element.test = test; element.onplaying = onplaying; element.onended = onended; element.play(); steps++; } SimpleTest.waitForExplicitFinish(); SpecialPowers.pushPrefEnv( { "set": [ ["media.track.enabled", true] ] }, function() { manager.runTests(gTrackTests, startTest); }); </script> </pre> </body> </html>