15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)<!DOCTYPE html>
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)<html lang='en-US'>
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  <head>
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <title>EME playback test application</title>
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  </head>
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  <body style='font-family:"Lucida Console", Monaco, monospace; font-size:14px'>
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <i>Clearkey works only with content encrypted using bear key.</i><br><br>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <table>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <tr title='URL param mediaFile=...'>
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><label for='mediaFile'>Encrypted video URL:</label></td>
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><input id='mediaFile' type='text' size='64'></td>
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </tr>
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <tr title='URL param licenseServerURL=...'>
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><label for='licenseServer'>License sever URL:</label></td>
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><input id='licenseServer' type='text' size='64'></td>
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </tr>
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <tr title='URL param keySystem=...'>
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><label for='keySystemList'>Key system:</label></td>
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><select id='keySystemList'></select></td>
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </tr>
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <tr title='URL param mediaType=...'>
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><label for='mediaTypeList'>Media type:</label></td>
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><select id='mediaTypeList'></select></td>
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </tr>
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <tr title='URL param usePrefixedEME=1|0'>
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><label for='usePrefixedEME'>EME API version:</label></td>
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><select id='usePrefixedEME'></select></td>
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </tr>
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <tr title='URL param useMSE=1|0'>
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td><label for='useMSE'>Load media by:</label></td>
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td>
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        <select id='useMSE'>
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          <option value='true' selected='selected'>MSE</option>
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          <option value='false'>src</option>
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        </select>
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      </td>
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </tr>
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </table>
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <br>
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <button onclick='Play();'>Play</button>
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <br><br>
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Decoded fps: <span id='decodedFPS'></span>
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <br>
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Dropped fps: <span id='droppedFPS'></span>
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <br>
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Total dropped frames: <span id='droppedFrames'></span>
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <br><br>
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <table>
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <tr>
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td valign='top'><span id='video'></span></td>
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      <td valign='top'>
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        <label for='logs' onclick="toggleDisplay('logs');"><i>Click to toggle logs visibility (newest at top).</i><br></label>
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        <div id='logs' style='overflow: auto; height: 480px; width: 480px; white-space: nowrap; display: none'></div>
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      </td>
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </tr>
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    </table>
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    <div></div>
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  </body>
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  <script type='text/javascript'>
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    var testConfig = new TestConfig();
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    testConfig.loadQueryParams();
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Update document with test configuration values.
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    var emeApp = new EMEApp(testConfig);
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    function onTimeUpdate(e) {
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      var video = e.target;
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (video.currentTime < 1)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return;
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // For loadSession() tests, addKey() will not be called after
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // loadSession() (the key is loaded internally). Do not check keyadded
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // and heartbeat for these tests.
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (!testConfig.sessionToLoad) {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // keyadded may be fired around the start of playback; check for it
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // after a delay to avoid timing issues.
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (testConfig.usePrefixedEME && !video.receivedKeyAdded)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          Utils.failTest('Key added event not received.');
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (testConfig.keySystem == EXTERNAL_CLEARKEY &&
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            !video.receivedHeartbeat)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          Utils.failTest('Heartbeat keymessage event not received.');
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      video.removeEventListener('ended', Utils.failTest);
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Utils.installTitleEventHandler(video, 'ended');
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      video.removeEventListener('timeupdate', onTimeUpdate);
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    function Play() {
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Update test configuration with UI elements values.
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      var video = emeApp.createPlayer().video;
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      Utils.resetTitleChange();
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // Ended should not fire before onTimeUpdate.
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      video.addEventListener('ended', Utils.failTest);
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      video.addEventListener('timeupdate', onTimeUpdate);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      video.play();
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    function toggleDisplay(id) {
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      var element = document.getElementById(id);
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (!element)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return;
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (element.style['display'] != 'none')
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        element.style['display'] = 'none';
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      else
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        element.style['display'] = '';
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Play();
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  </script>
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)</html>
109