<!DOCTYPE html>
<html>
<head>
    <script src=../video-test.js></script>
    <script type="text/javascript">
    var mock;
    var promise;
    var mediaKeySystemAccess;
    var capabilities = {};

    function doTest()
    {
        if (!window.internals) {
            // failTest("Internals is required for this test.")
            // return;
        }

        run('internals.initializeMockMediaSource()');
        run('mock = internals.registerMockCDM()');
        run('mock.supportedDataTypes = ["mock"]');

        next();
    }

    function next() {
        if (!tests.length) {
            mock.unregister();
            endTest()
            return;
        }

        var nextTest = tests.shift();
        consoleWrite('');
        nextTest();
    }

    function gotMediaKeySystemAccess(result) {
        mediaKeySystemAccess = result;
        next();
    }

    tests = [
        function() {
            run('capabilities.initDataTypes = ["mock"]');
            run(`capabilities.videoCapabilities = [{ contentType: 'video/mock; codecs="mock"' }] `);
            run('promise = navigator.requestMediaKeySystemAccess("org.webkit.mock", [capabilities])');
            shouldResolve(promise).then(gotMediaKeySystemAccess, failTest);
        },

        function() {
            run('promise = mediaKeySystemAccess.createMediaKeys()');
            shouldResolve(promise).then(next, next);
        },

        function() {
            run('mock.canCreateInstances = false');
            run('promise = mediaKeySystemAccess.createMediaKeys()');
            shouldReject(promise).then(next, next);
        },

        function() {
            run('mock.canCreateInstances = true');
            run('capabilities.distinctiveIdentifier = "not-allowed"');
            run('promise = navigator.requestMediaKeySystemAccess("org.webkit.mock", [capabilities])');
            shouldResolve(promise).then(gotMediaKeySystemAccess, failTest);
        },

        function() {
            run('promise = mediaKeySystemAccess.createMediaKeys()');
            shouldResolve(promise).then(next, next);
        },

        function() {
            run('mock.distinctiveIdentifiersRequirement = "required"');
            run('promise = mediaKeySystemAccess.createMediaKeys()');
            shouldReject(promise).then(next, next);
        },

        function() {
            run('mock.distinctiveIdentifiersRequirement = "optional"');
            run('capabilities.persistentState = "not-allowed"');
            run('promise = navigator.requestMediaKeySystemAccess("org.webkit.mock", [capabilities])');
            shouldResolve(promise).then(gotMediaKeySystemAccess, failTest);
        },

        function() {
            run('testRunner.setIsMediaKeySystemPermissionGranted(false)');
            run('promise = navigator.requestMediaKeySystemAccess("org.webkit.mock", [capabilities])');
            shouldReject(promise).then(next, next);
        },

        function() {
            testRunner.setIsMediaKeySystemPermissionGranted(true);
            run('promise = mediaKeySystemAccess.createMediaKeys()');
            shouldResolve(promise).then(next, next);
        },

        function() {
            run('mock.persistentStateRequirement = "required"');
            run('promise = mediaKeySystemAccess.createMediaKeys()');
            shouldReject(promise).then(next, next);
        },
    ];
    </script>
</head>
<body onload="doTest()">
</body>
</html>
