<!DOCTYPE html>
<html>
<head>
    <title>Encrypted ClearKey Session life cycles</title>
    <script src="../medias-enc.js"></script>
    <script src="../../video-test.js"></script>
    <script>
    var _mediaKeysSystemAccess;
    var _mediaKeys;
    var _mediaKeySession;

    function runTest() {
        if (!navigator.requestMediaKeySystemAccess) {
            logResult(false, "EME API is not supported");
            return;
        } else {
            logResult(true, "EME API is supported");
        }

        const options = [
            {    initDataTypes: ["cenc"],
                 videoCapabilities: [{contentType : 'video/mp4; codecs="avc1.64001F"'}] }
        ];

        navigator.requestMediaKeySystemAccess('org.w3.clearkey', options).then(function(access) {
            _mediaKeysSystemAccess = access;
            testExpected("_mediaKeysSystemAccess.keySystem", 'org.w3.clearkey');
            return access.createMediaKeys();
        }).then(function(result) {
            _mediaKeys = result;
            testExpected("_mediaKeys", null, "!=");
            testExpected("typeof _mediaKeys.createSession", 'function');
            _mediaKeySession = _mediaKeys.createSession();
            testExpected("_mediaKeySession.constructor.name", 'MediaKeySession');
            testExpected("internals.mediaKeysInternalInstanceObjectRefCount(_mediaKeys)", 1);
            testExpected("internals.mediaKeySessionInternalInstanceSessionObjectRefCount(_mediaKeySession)", 1);
            endTest();
        }).catch(function(failure) {
            failTest(failure);
        });
    }
    </script>
</head>
<body onload="runTest()">
    <video></video>
</body>
</html>
