<!doctype html>
<html>
  <head>
    <meta charset=utf-8>
    <meta name="timeout" content="long">
    <title>Encrypted Media Extensions: Test that persistent license cannot be ingested into temporary session</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/temporary-license-type.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.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, 'persistent-license' );

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

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