135 lines
5.3 KiB
HTML
135 lines
5.3 KiB
HTML
<!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>
|