blob: 7a21156b8927c978ef038fe121a79108da8d9007 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<script>
if (window.internals)
internals.useMockRTCPeerConnectionFactory("");
description("Test RTCPeerConnection's legacy MediaStream-based API");
let stream;
let otherStream;
let audioTrack;
let videoTrack;
let audioTrackFoundAmongSenders;
let videoTrackFoundAmongSenders;
let remoteStream;
if (window.testRunner)
testRunner.setUserMediaPermission(true);
else {
debug("This test can not be run without the testRunner");
finishJSTest();
}
const pc = new RTCPeerConnection({iceServers:[{urls:'stun:foo.com'}]});
const remotePc = new RTCPeerConnection({iceServers:[{urls:'stun:foo.com'}]});
debug("Stream sets should be empty initially")
shouldBe("pc.getLocalStreams().length", "0");
shouldBe("pc.getRemoteStreams().length", "0");
pc.onaddstream = evt => {
testPassed("Got 'addstream' event (before setRemoteDescription promise fulfilled)");
remoteStream = evt.stream;
shouldBe("remoteStream.getTracks().length", "2");
shouldBe("pc.getRemoteStreams().length", "1");
shouldBe("pc.getRemoteStreams()[0]", "remoteStream");
shouldBe("pc.getStreamById(remoteStream.id)", "remoteStream");
};
navigator.mediaDevices.getUserMedia({ "audio": true })
.then(s => {
stream = s;
debug("<br>Test with single track MediaStream");
evalAndLog("audioTrack = stream.getAudioTracks()[0]");
shouldNotThrow("pc.addStream(stream)");
shouldBe("pc.getLocalStreams().length", "1");
shouldBe("pc.getLocalStreams()[0]", "stream");
shouldBe("pc.getStreamById(stream.id)", "stream");
shouldBe("pc.getSenders().length", "1");
shouldBe("pc.getSenders()[0].track", "audioTrack");
debug("Adding the same stream again should be a no-op");
shouldNotThrow("pc.addStream(stream)");
shouldBe("pc.getLocalStreams().length", "1");
return navigator.mediaDevices.getUserMedia({ "audio": true, "video": true });
})
.then(s => {
stream = s;
debug("<br>Test with audio and video MediaStream");
evalAndLog("audioTrack = stream.getAudioTracks()[0]");
evalAndLog("videoTrack = stream.getVideoTracks()[0]");
shouldNotThrow("pc.addStream(stream)");
shouldBe("pc.getLocalStreams().length", "2");
shouldBeTrue("pc.getLocalStreams().includes(stream)");
shouldBe("pc.getStreamById(stream.id)", "stream");
shouldBe("pc.getSenders().length", "3");
audioTrackFoundAmongSenders = false;
videoTrackFoundAmongSenders = false;
pc.getSenders().forEach(sender => {
if (sender.track === audioTrack)
audioTrackFoundAmongSenders = true;
else if (sender.track === videoTrack)
videoTrackFoundAmongSenders = true;
});
shouldBeTrue("audioTrackFoundAmongSenders");
shouldBeTrue("videoTrackFoundAmongSenders");
debug("<br>Test removeStream");
debug("Remove a non-existent stream");
evalAndLog("otherStream = stream.clone()");
shouldNotThrow("pc.removeStream(otherStream)");
debug("Both streams should still be present");
shouldBe("pc.getLocalStreams().length", "2");
shouldNotThrow("pc.removeStream(stream)");
shouldBe("pc.getLocalStreams().length", "1");
shouldBe("pc.getStreamById(stream.id)", "null");
debug("All senders should still be present")
shouldBe("pc.getSenders().length", "3");
debug("Removing the same stream again should be a no-op");
shouldNotThrow("pc.removeStream(stream)");
shouldBe("pc.getLocalStreams().length", "1");
debug("<br>Test applying a remote description offering a stream with two tracks");
remotePc.addStream(stream);
debug("Create remote offer");
return remotePc.createOffer();
})
.then(remoteOffer => {
debug("Got remote offer, set it");
return pc.setRemoteDescription(remoteOffer);
})
.then(() => {
debug("Remote offer set");
testPassed("End of test promise chain");
debug("");
finishJSTest();
})
.catch(error => {
testFailed("Error in promise chain: " + error);
finishJSTest();
});
window.jsTestIsAsync = true;
window.successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>