 <!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=700764

Verifies that cancelFullScreen() rolls back to have the previous full-screen
element full-screen.

Tests:
* Request full-screen in doc.
* Request full-screen in doc on element not descended from full-screen element.
* Cancel full-screen, FSE should rollback to previous FSE.
* Request full-screen in subdoc.
* Cancel full-screen in subdoc, doc should be full-screen.
* Request full-screen in subdoc.
* Removing FSE should fully-exit full-screen.


-->
<head>
  <title>Test for Bug 700764</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="/tests/SimpleTest/EventUtils.js"></script>
  <script type="application/javascript" src="file_fullscreen-utils.js"></script>
</head>
<body>

<div id="fse">
  <div id="fse-inner">
    <iframe id="subdoc" allowfullscreen srcdoc="<html><body bgcolor='black'></body></html>"></iframe>
  </div>
</div>

<div id="non-fse"></div>

<script type="application/javascript">

/** Test for Bug 700764 **/

function ok(condition, msg) {
  opener.ok(condition, "[rollback] " + msg);
  if (!condition) {
    opener.finish();
  }
}

function is(a, b, msg) {
  opener.is(a, b, "[rollback] " + msg);
  if (a != b) {
    opener.finish();
  }
}

function enterFullscreen(element, callback) {
  addFullscreenChangeContinuation("enter", callback);
  element.focus();
  element.requestFullscreen();
}

function revertFullscreen(doc, callback) {
  ok(doc.fullscreenElement != null, "Should only exit fullscreen on a fullscreen doc");
  addFullscreenChangeContinuation("exit", callback, doc);
  doc.exitFullscreen();
}

function e(id) {
  return document.getElementById(id);
}

function requestFullscreen(element) {
  element.focus();
  element.requestFullscreen();
}

function begin() {
  enterFullscreen(e("fse"), change1);
}

function change1() {
  is(document.fullscreenElement, e("fse"), "Body should be FSE");
  // Request full-screen from element not descendent from current FSE.
  enterFullscreen(e("non-fse"), change2);
}

function change2() {
  is(document.fullscreenElement, e("non-fse"), "FSE should be e('non-fse')");
  revertFullscreen(document, change3);
}

function change3() {
  is(document.fullscreenElement, e("fse"), "FSE should rollback to FSE.");
  var iframe = e("subdoc");
  enterFullscreen(iframe.contentDocument.body, change4);
}

function change4() {
  var iframe = e("subdoc");
  is(document.fullscreenElement, iframe, "Subdoc container should be FSE.");
  is(iframe.contentDocument.fullscreenElement, iframe.contentDocument.body, "Subdoc body should be FSE in subdoc");
  revertFullscreen(document, change5);
}

function change5() {
  is(document.fullscreenElement, e("fse"), "FSE should rollback to FSE.");
  revertFullscreen(document, change6);
}

function change6() {
  is(document.fullscreenElement, null, "Should have left full-screen entirely");
  enterFullscreen(e("fse"), change7);
}

function change7() {
  is(document.fullscreenElement, e("fse"), "FSE should be e('fse')");
  enterFullscreen(e("fse-inner"), change8);
}

function change8() {
  var element = e('fse-inner');
  is(document.fullscreenElement, element, "FSE should be e('fse-inner')");

  // We're breaking out of two levels of fullscreen by removing the
  // fullscreenElement. To make our helper functions work correctly,
  // we set the fullscreenChangeEnters value to 1. This is a hack, but
  // it is a hack that supports the expected behavior.
  setFullscreenChangeEnters(1);
  addFullscreenChangeContinuation("exit", change9);
  info(`Removing FSE should exit fullscreen.`);
  element.remove();
}

function change9() {
  is(document.fullscreenElement, null, "Should have fully exited full-screen mode when removed FSE from doc");
  opener.nextTest();
}

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