<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Capture source failure.</title>
    <script src="../../resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
 </head>
<body>
    <video width=320 height=240></video>

    <script>

    let video;

    function waitForPageStateChange(numberOfTries, originalState, resolve, reject)
    {
        let newState = internals.pageMediaState();
        if (newState != originalState) {
            resolve(newState);
            return;
        }

        if (numberOfTries <= 0) {
            reject('Page state did not change in time, original state is ' + originalState);
            return;
        }

        setTimeout(() => { waitForPageStateChange(--numberOfTries, originalState, resolve, reject); }, 10);
    }

    function testTrack(track, title)
    {
        promise_test((test) => {
            return new Promise((resolve, reject) => {
                const mediaState = internals.pageMediaState();
                track.onended = () => {
                    new Promise((innerResolve, innerReject) => {
                        waitForPageStateChange(10, mediaState, innerResolve, innerReject)
                    }).then((pageMediaState) => {
                        assert_equals(video.videoTracks.length, 1, "Unexpected video track count");
                        assert_equals(video.audioTracks.length, 1, "Unexpected audio track count");
                        assert_equals(video.videoHeight + video.videoWidth, 0, "Video track should have no size");

                        if (window.internals) {
                            if (track.kind === "video") {
                                assert_false(pageMediaState.includes('HasMutedVideoCaptureDevice'), "Unexpected HasMutedVideoCaptureDevice");
                                assert_false(pageMediaState.includes('HasMutedAudioCaptureDevice'), "Unexpected HasMutedAudioCaptureDevice");
                                assert_true(pageMediaState.includes('HasActiveAudioCaptureDevice'), "Unexpected HasActiveAudioCaptureDevice");
                                assert_false(pageMediaState.includes('HasActiveVideoCaptureDevice'), "Unexpected HasActiveVideoCaptureDevice");
                            } else {
                                assert_false(pageMediaState.includes('HasMutedAudioCaptureDevice'), "Unexpected HasMutedAudioCaptureDevice");
                                assert_false(pageMediaState.includes('HasMutedVideoCaptureDevice'), "Unexpected HasMutedVideoCaptureDevice");
                                assert_false(pageMediaState.includes('HasActiveAudioCaptureDevice'), "Unexpected HasActiveAudioCaptureDevice");
                                assert_false(pageMediaState.includes('HasActiveVideoCaptureDevice'), "Unexpected HasActiveVideoCaptureDevice");
                            }
                        }
                        resolve();
                    })
                }

                if (window.internals)
                    internals.simulateMediaStreamTrackCaptureSourceFailure(track);
                setTimeout(() => reject("Device state did not change in 5 second"), 5000);

            });
        }, title);
    }

    promise_test((test) => {
        let stream;
        return navigator.mediaDevices.getUserMedia({ video: true, audio: true})
            .then(s => {
                stream = s;
                video = document.getElementsByTagName("video")[0];
                video.srcObject = stream;
            })
            .then(() => new Promise(resolve => video.onloadedmetadata = resolve))
            .then(() => {
                assert_equals(video.videoTracks.length, 1, "Expected one video track");
                assert_equals(video.audioTracks.length, 1, "Expected one audio track");
                testTrack(stream.getVideoTracks()[0], "End video track only");
                testTrack(stream.getAudioTracks()[0], "End audio track only");
            })
    }, "Create stream");

    </script>

</body>
</html>
