<!DOCTYPE HTML>
<html>
<head>
  <title>Test Encrypted Media Extensions</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <script type="text/javascript" src="manifest.js"></script>
  <script type="text/javascript" src="https://example.com:443/tests/dom/media/test/eme.js"></script>
</head>
<body>
<pre id="test">
<script class="testbody" type="text/javascript">
/* import-globals-from eme.js */
var manager = new MediaTestManager;

// Test that if we can capture a video frame while playing clear content after
// removing the MediaKeys object which was used for a previous encrypted content
// playback on the same video element
function startTest(test, token)
{
  manager.started(token);
  var sessions = [];
  function onSessionCreated(session) {
    sessions.push(session);
  }

  function closeSessions() {
    let p = new EMEPromise;
    Promise.all(sessions.map(s => s.close()))
    .then(p.resolve, p.reject);
    return p.promise;
  }

  let v = document.createElement("video");
  document.body.appendChild(v);

  let finish = new EMEPromise;

  function onVideoEnded(ev) {
    ok(true, TimeStamp(token) + " (ENCRYPTED) content playback ended.");

    function playClearVideo() {
      var p1 = once(v, 'loadeddata', (e) => {
        ok(true, TimeStamp(token) + " Receiving event 'loadeddata' for (CLEAR) content.");
        let canvasElem = document.createElement('canvas');
        document.body.appendChild(canvasElem);
        let ctx2d = canvasElem.getContext('2d');

        var gotTypeError = false;
        try {
          ctx2d.drawImage(v, 0, 0);
        } catch (ex) {
          if (ex instanceof TypeError) {
            gotTypeError = true;
          }
        }
        ok(!gotTypeError, TimeStamp(token) + " Canvas2D context drawImage succeed.")
      });
      v.src = 'bipbop_225w_175kbps.mp4';
      v.play();
      Promise.all([p1]).then(() => {
        manager.finished(token);
      }, () => {
        ok(false, TimeStamp(token) + " Something wrong.");
        manager.finished(token);
      });
    }

    closeSessions()
    .then(() => {
      v.setMediaKeys(null)
      .then(() => {
        ok(true, TimeStamp(token) + " Setting MediaKeys to null.");
        playClearVideo();
      }, () => {
        ok(false, TimeStamp(token) + " Setting MediaKeys to null.");
      });;
    });
  }

  once(v, "ended", onVideoEnded);

  // Create a MediaKeys object and set to HTMLMediaElement then start the playback.
  Promise.all([
    LoadInitData(v, test, token),
    CreateAndSetMediaKeys(v, test, token),
    LoadTest(test, v, token)])
  .then(values => {
    let initData = values[0];
    v.play();
    initData.map(ev => {
      let session = v.mediaKeys.createSession();
      onSessionCreated(session);
      MakeRequest(test, token, ev, session);
    });
  })
  .then(() => {
    return finish.promise;
  })
  .catch(reason => ok(false, reason))
}

SimpleTest.waitForExplicitFinish();
manager.runTests(gEMETests, startTest);
</script>
</pre>
</body>
</html>
