<!DOCTYPE html>
<html>
    <head>
        <script>

            let stream = null;

            function promptForCapture()
            {
                navigator.mediaDevices.enumerateDevices().then(() => {
                    return navigator.mediaDevices.getUserMedia({ audio: false, video: true })
                }).then((s) => {
                    stream = s;
                    video.srcObject = stream;
                    console.log("Got user media");
                }).catch((error) => console.log(`Failed with error: ${error}`));
            }

            function stop(kind)
            {
                let activeTracks = [];
                stream.getTracks().forEach(track => {
                    if (!kind || track.kind == kind)
                        track.stop();
                    else
                        activeTracks.push(track);
                });

                if (!activeTracks.length) {
                    stream = null;
                    video.srcObject = null;
                }
            }

            function haveStream()
            {
                return stream !== null;
            }

            function doMultipleGetUserMediaSynchronously()
            {
                navigator.mediaDevices.getUserMedia({video: true});
                navigator.mediaDevices.getUserMedia({video: true});
                navigator.mediaDevices.getUserMedia({video: true});

                // This one should prompt.
                navigator.mediaDevices.getUserMedia({audio: true});

                navigator.mediaDevices.getUserMedia({audio: true});
                navigator.mediaDevices.getUserMedia({audio: true});
                navigator.mediaDevices.getUserMedia({audio: true, video: true});
            }

            function captureAudio()
            {
                navigator.mediaDevices.getUserMedia({audio: true}).then(s => stream = s);
            }

            function captureAudioAndVideo()
            {
                navigator.mediaDevices.getUserMedia({audio: true, video: true}).then(s => stream = s);
            }
        </script>
    <head>

    <body onload="promptForCapture()">
        <video id="video" controls></video>
        <p>
        <button onclick="stop()">Stop</button>
        </p>
    </body>
</html>
