<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <meta name="timeout" content="long">
    <title>Encrypted Media Extensions: Expiration 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/expiration.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 explicit 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.initDataType && s.content.keys; } );
            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,
                        expiration:         Date.now().valueOf() + 120000    // Two minutes from now
                    } );
        } );

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