<!DOCTYPE HTML>
<html>
    <head>
        <script src="../../resources/js-test-pre.js"></script>
    </head>
    <body>
        <p id="description"></p>
        <div id="console"></div>
        <script>
            var captureDevices;
            var captureDevice;
            var havePermission;
            var deviceIds = [];

            description("Tests MediaDevices.enumerateDevices()");
            window.jsTestIsAsync = true;

            shouldBeType("navigator.mediaDevices", "Object");
            shouldBeType("navigator.mediaDevices.enumerateDevices", "Function");
            debug("");

            function enumerate(next)
            {
                navigator.mediaDevices.enumerateDevices()
                    .then(function(devices) {
                        captureDevices = devices;
                        shouldBeNonZero("captureDevices.length");
                        debug("");
                        devices.forEach(function(device) {
                            captureDevice = device;
                            shouldBeNonNull("captureDevice.kind");
                            shouldBeNonNull("captureDevice.deviceId");
                            shouldBeNonNull("captureDevice.label");
                            if (havePermission)
                                shouldNotBeEqualToString("captureDevice.label", "");
                            else
                                shouldBeEmptyString("captureDevice.label");
                            shouldBeNonNull("captureDevice.groupId");
                            
                            if (deviceIds.length < 2)
                                deviceIds.push(captureDevice.deviceId);
                            else
                                shouldNotBe("deviceIds.indexOf(captureDevice.deviceId)", "-1");

                            debug("");
                        });
                        if (next)
                            next();
                        else
                            finishJSTest();
                    })
                    .catch(function(err) {
                        testFailed(err.name + ": " + err.message);
                    });
            }
            
            function createStream()
            {
                if (window.testRunner) {
                    testRunner.setUserMediaPermission(true);
                    testRunner.setUserMediaPermissionForOrigin(false, document.location.href, "");
                }

                navigator.mediaDevices
                    .getUserMedia({audio:{}, video:{}})
                    .then(function(stream) {
                        debug(`<br>*** Calling mediaDevices.enumerateDevices without persistent access, with a media stream track<br>`);
                        havePermission = true;
                        enumerate(null);                        
                    })
                    .catch(function(err) {
                        testFailed(`mediaDevices.getUserMedia() failed with ${err.name}: ${err.message}`);
                        finishJSTest();
                    });
            }
            
            function grantPermission()
            {
                if (window.testRunner)
                    testRunner.setUserMediaPermissionForOrigin(true, document.location.href, "");

                debug(`<br>*** Calling mediaDevices.enumerateDevices with persistent access, and without a media stream track<br>`);
                havePermission = true;
                enumerate(createStream);
            }

            havePermission = false;
            debug(`<br>*** Calling mediaDevices.enumerateDevices without persistent access, and without a media stream track<br>`);
            enumerate(grantPermission);

            window.successfullyParsed = true;
        </script>
        <script src="../../resources/js-test-post.js"></script>
    </body>
</html>
