blob: 70a55eb4f48ee5cd6140763e1b2170359e798115 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="./resources/getUserMedia-helper.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("Test adding and removing tracks.");
var stream1;
var streamCopy;
var stream2;
var audioTrack;
var videoTrack;
function tryAddTrack(stream, track) {
try {
stream.addTrack(track);
} catch (exception) {
testFailed("addTrack threw an exception.");
finishJSTest();
}
}
function tryRemoveTrack(stream, track) {
try {
stream.removeTrack(track);
} catch (exception) {
testFailed("removeTrack threw an exception.");
finishJSTest();
}
}
function shouldNotFire() {
testFailed("\"addtrack\" or \"removetrack\" events should not fire as a result of local addTrack() or removeTrack() operations.");
}
function gotStream2(s) {
stream2 = s;
shouldBe('stream1.active', 'true');
shouldBe('stream1.getAudioTracks().length', '1');
shouldBe('stream1.getVideoTracks().length', '1');
shouldBe('stream2.active', 'true');
shouldBe('stream2.getAudioTracks().length', '1');
shouldBe('stream2.getVideoTracks().length', '1');
stream1.onaddtrack = shouldNotFire;
stream1.onremovetrack = shouldNotFire;
setTimeout(() => {
shouldBe('stream2.active', 'false');
finishJSTest();
}, 1000);
audioTrack = stream1.getAudioTracks()[0];
videoTrack = stream1.getVideoTracks()[0];
debug("<br>*** remove an audio track");
tryRemoveTrack(stream1, audioTrack);
shouldBe('stream1.getAudioTracks().length', '0');
shouldBeNull('stream1.getTrackById(audioTrack.id)');
debug("<br>*** remove a non-existent (already removed) track (should not throw)");
tryRemoveTrack(stream1, audioTrack);
debug("<br>*** add the track back to the stream");
tryAddTrack(stream1, audioTrack);
debug("<br>*** remove a video track");
tryRemoveTrack(stream1, videoTrack);
shouldBe('stream1.getVideoTracks().length', '0');
shouldBeNull('stream1.getTrackById(videoTrack.id)');
debug("<br>*** remove a non-existent (already removed) track (should not throw)");
tryRemoveTrack(stream1, videoTrack);
debug("<br>*** add the track back to the stream");
tryAddTrack(stream1, videoTrack);
debug("<br>*** verify added tracks");
shouldBe('stream1.getAudioTracks().length', '1');
shouldBe('stream1.getVideoTracks().length', '1');
shouldBe('stream1.getAudioTracks()[0].kind', 'audioTrack.kind');
shouldBe('stream1.getAudioTracks()[0].label', 'audioTrack.label');
shouldBe('stream1.getVideoTracks()[0].kind', 'videoTrack.kind');
shouldBe('stream1.getVideoTracks()[0].label', 'videoTrack.label');
debug("<br>*** try adding a stream's own tracks again (nothing should happen)");
tryAddTrack(stream1, stream1.getAudioTracks()[0]);
tryAddTrack(stream1, stream1.getVideoTracks()[0]);
shouldBe('stream1.getAudioTracks().length', '1');
shouldBe('stream1.getVideoTracks().length', '1');
debug("<br>*** add tracks from another stream");
tryAddTrack(stream1, stream2.getAudioTracks()[0]);
tryAddTrack(stream1, stream2.getVideoTracks()[0]);
debug("<br>*** verify added tracks");
shouldBe('stream1.getAudioTracks().length', '2');
shouldBe('stream1.getVideoTracks().length', '2');
debug("<br>*** remove all tracks, stream will become inactive");
tryRemoveTrack(stream2, stream2.getAudioTracks()[0]);
tryRemoveTrack(stream2, stream2.getVideoTracks()[0]);
shouldBe('stream2.getAudioTracks().length', '0');
shouldBe('stream2.getVideoTracks().length', '0');
shouldBe('stream2.active', 'false');
}
function gotStream1(s) {
stream1 = s;
streamCopy = new MediaStream();
shouldBe('streamCopy.active', 'false');
streamCopy.addTrack(stream1.getVideoTracks()[0]);
shouldBe('streamCopy.active', 'true');
getUserMedia("allow", {audio:true, video:true}, gotStream2);
}
getUserMedia("allow", {audio:true, video:true}, gotStream1);
window.jsTestIsAsync = true;
window.successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>