<!DOCTYPE html>
<html>
    <head>
        <title>WebKitMediaKeys</title>
        <script src=../video-test.js></script>
        <script>
            function stringToUint8Array(str)
            {
                var arr=[];
                for(var i=0,j=str.length;i<j;++i)
                  arr[i]=str.charCodeAt(i);
                return new Uint8Array(arr);
            }

            var mediaKeys;
            var mediaKeySession;
            var initData = stringToUint8Array('mock');
            var invalidKey = stringToUint8Array('invalid');
            var validKey = stringToUint8Array('key');

            function runTest() 
            {
                // Initialize the MockCDM. It supports the key system 'com.apple.mock', the 
                // mime type 'video/mock'. It requires init data to begin with 'mock', and
                // keys to begin with 'key'.
                if (internals)
                    internals.initializeMockCDM();

                run('mediaKeys = new WebKitMediaKeys("com.webcore.mock")');
                run('mediaKeySession = mediaKeys.createSession("video/mock", initData)');
                waitForEvent('webkitkeymessage', keyMessage, false, false, mediaKeySession);
                waitForEvent('webkitkeyerror', keyError, false, false, mediaKeySession);
                waitForEvent('webkitkeyadded', null, true, false, mediaKeySession);
            }

            function keyMessage(event)
            {
                run('mediaKeySession.update(invalidKey)');
            }

            function keyError(event)
            {
                run('mediaKeySession.update(validKey)');
            }
        </script>
    </head>
    <body onload="runTest()">
        <p>This tests the events created by WebKitMediaKeys.</p>
</html>