<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <meta name="timeout" content="long">
    <title>Encrypted Media Extensions: Verify MediaKeySession.keyStatuses with multiple sessions, 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/fetch.js></script>
    <script src=/encrypted-media/util/testmediasource.js></script>
    <script src=/encrypted-media/util/utf8.js></script>

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

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

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

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

    <script>
        var keysystem = getSupportedKeySystem();
        getSupportedContent( keysystem ).then( function( contents ) {
            // Select a content item with multiple keys and initData that retrieves all keys
            var contentitem = contents.filter( function( item ) {
                return item.keys && item.keys.length > 1 && item.initDataType && item.associatedInitData;
            } )[ 0 ];

            var handler = new MessageHandler( keysystem, contentitem );
            var config = {  keysystem:          keysystem,
                            content:            contentitem,
                            messagehandler:     handler.messagehandler,
                            initDataType:       contentitem.initDataType,
                            initData:           base64DecodeToUnit8Array( getProprietaryInitDatas(contentitem).initDatas[ 0 ] )
                        };

            runTest(config);

        } );
    </script>
  </body>
</html>