blob: 7da6b001b4fa56e819f31845b328941c1588075c [file] [log] [blame]
<!DOCTYPE HTML>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script>
let mediaStream;
let eventCount = 0;
let muteChangedEvent;
function nextStep()
{
if (muteChangedEvent.type == "unmute") {
finishJSTest();
return;
}
debug("<br>*** Unmuting capture devices");
eventCount = 0;
internals.setPageMuted("");
}
function muteChanged(ev)
{
muteChangedEvent = ev;
debug(`EVENT: ${muteChangedEvent.type}`);
shouldBe('muteChangedEvent.target.muted', (muteChangedEvent.type == "mute").toString());
if (++eventCount == 2) {
debug("");
let activeState = muteChangedEvent.type == "mute" ? "Muted" : "Active";
let inactiveState = muteChangedEvent.type == "mute" ? "Active" : "Muted";
let retryCount = 0;
let retryInterval = 100;
let maximumRetryCount = 20 * 1000 / retryInterval;
let test = () => {
if (window.internals.pageMediaState().includes(`Has${activeState}AudioCaptureDevice`)
&& window.internals.pageMediaState().includes(`Has${activeState}VideoCaptureDevice`)
&& !window.internals.pageMediaState().includes(`Has${inactiveState}VideoCaptureDevice`)
&& !window.internals.pageMediaState().includes(`Has${inactiveState}VideoCaptureDevice`)) {
testPassed(`window.internals.pageMediaState().includes(Has${activeState}AudioCaptureDevice) became true`);
testPassed(`window.internals.pageMediaState().includes(Has${activeState}VideoCaptureDevice) became true`);
testPassed(`window.internals.pageMediaState().includes(Has${inactiveState}AudioCaptureDevice) became false`);
testPassed(`window.internals.pageMediaState().includes(Has${inactiveState}VideoCaptureDevice) became false`);
nextStep()
return;
}
if (++retryCount > maximumRetryCount) {
testFailed(`Page muted state failed to change after ${maximumRetryCount / 1000} seconds`);
return;
}
setTimeout(test, retryInterval);
}
setTimeout(test, 0);
}
}
function muteCaptureDevices()
{
debug("<br>*** Muting capture devices");
internals.setPageMuted("capturedevices");
}
function testWhenEnabled()
{
navigator.mediaDevices
.getUserMedia({audio:{}, video:{}})
.then(stream => {
mediaStream = stream;
shouldBeType("mediaStream", "Object");
shouldBe("mediaStream.getTracks().length", "2");
var tracks = mediaStream.getTracks();
for (var i = 0; i < tracks.length; i++) {
tracks[i].onmute = muteChanged;
tracks[i].onunmute = muteChanged;
}
shouldBecomeEqual("window.internals.pageMediaState().includes('HasActiveAudioCaptureDevice') && window.internals.pageMediaState().includes('HasActiveVideoCaptureDevice')", "true", muteCaptureDevices);
})
.catch((err) => {
testFailed(`mediaDevices.getUserMedia() failed with ${err.name}`);
finishJSTest();
});
}
function start()
{
debug(`<br>*** Mock capture devices should be enabled by default`);
if (window.testRunner)
testRunner.setUserMediaPermission(true);
testWhenEnabled();
}
</script>
</head>
<body onload="start()">
<p id="description"></p>
<div id="console"></div>
<script>
description("Test enabling/disabling mock media capture devices");
window.jsTestIsAsync = true;
window.successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>