blob: 6749bf6b11eaee510a928411e63ec826f86d9722 [file] [log] [blame]
<!DOCTYPE html><!-- webkit-test-runner [ CaptureAudioInGPUProcessEnabled=false CaptureVideoInGPUProcessEnabled=false ] -->
<html>
<head>
<meta charset="utf-8">
<title>Don't unmute video when a tab becomes visible unless it was muted when the tab was hidden</title>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
</head>
<body>
<script>
let audioTrack;
let videoTrack;
async function validateMediaStreamTrackIsGeneratingContent(track)
{
if (!window.internals)
return true;
internals.observeMediaStreamTrack(track);
let count = 100;
do {
await new Promise(resolve => setTimeout(resolve, 50));
if (internals.trackAudioSampleCount || internals.trackVideoSampleCount)
return true;
} while (--count > 0);
return false;
}
promise_test((t) => {
if (window.testRunner)
testRunner.setUserMediaPermission(true);
if (!window.internals)
return Promise.reject("this test needs internals API");
return navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then((stream) => {
audioTrack = stream.getAudioTracks()[0];
videoTrack = stream.getVideoTracks()[0];
assert_false(audioTrack.muted, "audio track is active");
assert_false(videoTrack.muted, "video track is active");
})
}, "Setup stream");
promise_test(async (t) => {
if (window.internals) {
window.internals.setShouldInterruptAudioOnPageVisibilityChange(false);
window.internals.setPageVisibility(false);
}
assert_false(audioTrack.muted, "audio track is active");
if (!videoTrack.muted)
await new Promise(resolve => videoTrack.onmute = resolve);
assert_true(videoTrack.muted, "video track is muted");
}, "Hide page, only video should be muted");
promise_test(async (t) => {
if (window.internals)
window.internals.setPageVisibility(true);
assert_false(audioTrack.muted, "audio track is active");
if (videoTrack.muted)
await new Promise(resolve => videoTrack.onunmute = resolve);
assert_false(videoTrack.muted, "video track is active");
assert_true(await validateMediaStreamTrackIsGeneratingContent(audioTrack), "audio track");
assert_true(await validateMediaStreamTrackIsGeneratingContent(videoTrack), "video track");
}, "Show page, video and audio should be unmuted");
promise_test(async (t) => {
if (window.internals) {
window.internals.setPageVisibility(false);
window.internals.setPageMuted("capturedevices");
}
if (!audioTrack.muted)
await new Promise(resolve => audioTrack.onmute = resolve);
assert_true(audioTrack.muted, "audio track is muted");
if (!videoTrack.muted)
await new Promise(resolve => videoTrack.onmute = resolve);
assert_true(videoTrack.muted, "video track is muted");
}, "Hide and mute page, video and audio should be muted");
promise_test(async (t) => {
if (window.internals)
window.internals.setPageVisibility(true);
assert_true(audioTrack.muted, "audio track is muted");
assert_true(videoTrack.muted, "video track is muted");
}, "Show page, video and audio should remain muted");
</script>
</body>
</html>