diff options
Diffstat (limited to 'dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html')
-rw-r--r-- | dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html b/dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html new file mode 100644 index 000000000..2159fc917 --- /dev/null +++ b/dom/media/tests/mochitest/test_getUserMedia_addTrackRemoveTrack.html @@ -0,0 +1,169 @@ +<!DOCTYPE HTML> +<html> +<head> + <script type="application/javascript" src="mediaStreamPlayback.js"></script> +</head> +<body> +<pre id="test"> +<script type="application/javascript"> + "use strict"; + + createHTML({ + title: "MediaStream's addTrack() and removeTrack() with getUserMedia streams Test", + bug: "1103188" + }); + + runTest(() => Promise.resolve() + .then(() => getUserMedia({audio: true})).then(stream => + getUserMedia({video: true}).then(otherStream => { + info("Test addTrack()ing a video track to an audio-only gUM stream"); + var track = stream.getTracks()[0]; + var otherTrack = otherStream.getTracks()[0]; + + stream.addTrack(track); + checkMediaStreamContains(stream, [track], "Re-added audio"); + + stream.addTrack(otherTrack); + checkMediaStreamContains(stream, [track, otherTrack], "Added video"); + + var testElem = createMediaElement('video', 'testAddTrackAudioVideo'); + var playback = new LocalMediaStreamPlayback(testElem, stream); + return playback.playMedia(false); + })) + .then(() => getUserMedia({video: true})).then(stream => + getUserMedia({video: true}).then(otherStream => { + info("Test addTrack()ing a video track to a video-only gUM stream"); + var track = stream.getTracks()[0]; + var otherTrack = otherStream.getTracks()[0]; + + stream.addTrack(track); + checkMediaStreamContains(stream, [track], "Re-added video"); + + stream.addTrack(otherTrack); + checkMediaStreamContains(stream, [track, otherTrack], "Added video"); + + var test = createMediaElement('video', 'testAddTrackDoubleVideo'); + var playback = new LocalMediaStreamPlayback(test, stream); + return playback.playMedia(false); + })) + .then(() => getUserMedia({video: true})).then(stream => + getUserMedia({video: true}).then(otherStream => { + info("Test removeTrack() existing and added video tracks from a video-only gUM stream"); + var track = stream.getTracks()[0]; + var otherTrack = otherStream.getTracks()[0]; + + stream.removeTrack(otherTrack); + checkMediaStreamContains(stream, [track], "Removed non-existing video"); + + stream.addTrack(otherTrack); + checkMediaStreamContains(stream, [track, otherTrack], "Added video"); + + stream.removeTrack(otherTrack); + checkMediaStreamContains(stream, [track], "Removed added video"); + + stream.removeTrack(otherTrack); + checkMediaStreamContains(stream, [track], "Re-removed added video"); + + stream.removeTrack(track); + checkMediaStreamContains(stream, [], "Removed original video"); + + var elem = createMediaElement('video', 'testRemoveAllVideo'); + var loadeddata = false; + elem.onloadeddata = () => { loadeddata = true; elem.onloadeddata = null; }; + elem.srcObject = stream; + elem.play(); + return wait(500).then(() => { + ok(!loadeddata, "Stream without tracks shall not raise 'loadeddata' on media element"); + elem.pause(); + elem.srcObject = null; + }) + .then(() => { + stream.addTrack(track); + checkMediaStreamContains(stream, [track], "Re-added added-then-removed track"); + var playback = new LocalMediaStreamPlayback(elem, stream); + return playback.playMedia(false); + }) + .then(() => otherTrack.stop()); + })) + .then(() => getUserMedia({ audio: true })).then(audioStream => + getUserMedia({ video: true }).then(videoStream => { + info("Test adding track and removing the original"); + var audioTrack = audioStream.getTracks()[0]; + var videoTrack = videoStream.getTracks()[0]; + videoStream.removeTrack(videoTrack); + audioStream.addTrack(videoTrack); + + checkMediaStreamContains(videoStream, [], "1, Removed original track"); + checkMediaStreamContains(audioStream, [audioTrack, videoTrack], + "2, Added external track"); + + var elem = createMediaElement('video', 'testAddRemoveOriginalTrackVideo'); + var playback = new LocalMediaStreamPlayback(elem, audioStream); + return playback.playMedia(false); + })) + .then(() => getUserMedia({ audio: true, video: true })).then(stream => { + info("Test removing stopped tracks"); + stream.getTracks().forEach(t => { + t.stop(); + stream.removeTrack(t); + }); + checkMediaStreamContains(stream, [], "Removed stopped tracks"); + }) + .then(() => { + var ac = new AudioContext(); + + var osc1k = createOscillatorStream(ac, 1000); + var audioTrack1k = osc1k.getTracks()[0]; + + var osc5k = createOscillatorStream(ac, 5000); + var audioTrack5k = osc5k.getTracks()[0]; + + var osc10k = createOscillatorStream(ac, 10000); + var audioTrack10k = osc10k.getTracks()[0]; + + var stream = osc1k; + return Promise.resolve().then(() => { + info("Analysing audio output with original 1k track"); + var analyser = new AudioStreamAnalyser(ac, stream); + return analyser.waitForAnalysisSuccess(array => + array[analyser.binIndexForFrequency(50)] < 50 && + array[analyser.binIndexForFrequency(1000)] > 200 && + array[analyser.binIndexForFrequency(5000)] < 50 && + array[analyser.binIndexForFrequency(10000)] < 50); + }).then(() => { + info("Analysing audio output with removed original 1k track and added 5k track"); + stream.removeTrack(audioTrack1k); + stream.addTrack(audioTrack5k); + var analyser = new AudioStreamAnalyser(ac, stream); + return analyser.waitForAnalysisSuccess(array => + array[analyser.binIndexForFrequency(1000)] < 50 && + array[analyser.binIndexForFrequency(5000)] > 200 && + array[analyser.binIndexForFrequency(10000)] < 50); + }).then(() => { + info("Analysing audio output with removed 5k track and added 10k track"); + stream.removeTrack(audioTrack5k); + stream.addTrack(audioTrack10k); + var analyser = new AudioStreamAnalyser(ac, stream); + return analyser.waitForAnalysisSuccess(array => + array[analyser.binIndexForFrequency(1000)] < 50 && + array[analyser.binIndexForFrequency(5000)] < 50 && + array[analyser.binIndexForFrequency(10000)] > 200); + }).then(() => { + info("Analysing audio output with re-added 1k, 5k and added 10k tracks"); + stream.addTrack(audioTrack1k); + stream.addTrack(audioTrack5k); + var analyser = new AudioStreamAnalyser(ac, stream); + return analyser.waitForAnalysisSuccess(array => + array[analyser.binIndexForFrequency(50)] < 50 && + array[analyser.binIndexForFrequency(1000)] > 200 && + array[analyser.binIndexForFrequency(2500)] < 50 && + array[analyser.binIndexForFrequency(5000)] > 200 && + array[analyser.binIndexForFrequency(7500)] < 50 && + array[analyser.binIndexForFrequency(10000)] > 200 && + array[analyser.binIndexForFrequency(11000)] < 50); + }); + })); +</script> +</pre> +</body> +</html> |