<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <meta name="timeout" content="long">
    <title>Encrypted Media Extensions: Events with DRM</title>
    <link rel="help" href="https://w3c.github.io/encrypted-media/">

    <!-- Web Platform Test Harness scripts -->
    <script src=/resources/testharness.js></script>
    <script src=/resources/testharnessreport.js></script>

    <!-- Helper scripts for Encrypted Media Extensions tests  -->
    <script src=/encrypted-media/util/utils.js></script>
    <script src=/encrypted-media/util/utf8.js></script>
    <script src=/encrypted-media/util/fetch.js></script>
    <script src=/encrypted-media/util/testmediasource.js></script>

    <!-- Content metadata -->
    <script src=/encrypted-media/content/content-metadata.js></script>

    <!-- Message handler for DRM servers -->
    <script src=/encrypted-media/util/drm-messagehandler.js></script>

    <!-- The script for this specific test -->
    <script src=/encrypted-media/scripts/events.js></script>

  </head>
  <body>
    <div id='log'></div>

    <script>
        var keysystem = getSupportedKeySystem();

        getSupportedContentAndInitDataTypes( keysystem )
        .then( function( supported )
        {
            // This test requires initData for supported content.
            // We prefer explciit initData configured for the content, but
            // otherwise we will generate initData for a supported initDataType
            // FIXME: Move me to a utility function
            var content,
                initDataType,
                initData;

            var contentWithExplicitInitData = supported.filter( function( s ) { return s.content.keys && s.content.initDataType; } );
            if ( contentWithExplicitInitData.length > 0 )
            {
                content = contentWithExplicitInitData[ 0 ].content;
                initDataType = content.keys[ 0 ].initDataType;
                initData = base64DecodeToUnit8Array( content.keys[ 0 ].initData );
            }
            else
            {
                content = supported[ 0 ].content;
                initDataType = supported[ 0 ].initDataTypes[ 0 ];
                initData = getInitData( content, initDataType );
            }

            var handler = new MessageHandler( keysystem, content );

            runTest( {  keysystem:          keysystem,
                        content:            content,
                        messagehandler:     handler.messagehandler,
                        initDataType:       initDataType,
                        initData:           initData
                    } );
        } );

    </script>
  </body>
</html>
