<!-- webkit-test-runner [ enableCaptureAudioInGPUProcess=true enableCaptureVideoInGPUProcess=true ] -->
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>iOS specific constraints of one active capture source at a time</title>
        <script src="../../../resources/testharness.js"></script>
        <script src="../../../resources/testharnessreport.js"></script>
    </head>
    <body>
        <script>

async function waitForTrackMuted(track)
{
    if (track.muted)
        return;

    return new Promise(resolve => track.onmute = resolve);
}

promise_test((test) => {
    if (window.testRunner)
        testRunner.setUserMediaPermission(true);

    var firstStream;
    var audioTrack;
    var videoTrack;
    return navigator.mediaDevices.getUserMedia({ audio: true, video: { facingMode: { exact: ['user'] } } }).then((stream) => {
        firstStream = stream;
        audioTrack = firstStream.getAudioTracks()[0];
        videoTrack = firstStream.getVideoTracks()[0];

        assert_false(audioTrack.muted, "audio track is active");
        assert_false(videoTrack.muted, "video track is active");

        return navigator.mediaDevices.getUserMedia({ audio: true});
    }).then(async (stream) => {
        await waitForTrackMuted(audioTrack);

        assert_true(audioTrack.muted, "audio track is muted");
        assert_false(videoTrack.muted, "video track is active");

        return navigator.mediaDevices.getUserMedia({ video: { facingMode: { exact: ["environment"] } } });
    }).then(async (stream) => {
        await waitForTrackMuted(videoTrack);

        assert_true(audioTrack.muted, "audio track is muted, second check");
        assert_true(videoTrack.muted, "video track is muted");
    });
}, "Testing successive getUserMedia calls");
        </script>
    </body>
</html>
