<!DOCTYPE html>
<html>
<head>
  <title>Test for secure input mode</title>
  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
  <script src="chrome://mochikit/content/tests/SimpleTest/NativeKeyCodes.js"></script>
  <link rel="stylesheet" type="text/css"
          href="chrome://mochikit/content/tests/SimpleTest/test.css" />
</head>
<body>
<div id="content" style="display: none">
  
</div>
<pre id="test">
</pre>

<p>
  <input id="input_text" type="text"><br>
  <input id="input_password" type="password"><br>
  <input id="input_text_readonly" type="text" readonly><br>
  <input id="input_text_ime_mode_disabled" type="text" style="ime-mode: disabled;"><br>
  <input id="input_change" type="text"><br>
  <textarea id="textarea"></textarea><br>
</p>
<div id="contenteditable" contenteditable style="min-height: 3em;"></div>

<script class="testbody" type="application/javascript">

  SimpleTest.waitForExplicitFinish();

  function sendAKeyEvent() {
    synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_A, {}, "a", "a");
  }

  function isFocused(aElement) {
    return (SpecialPowers.focusManager.focusedElement == aElement);
  }

  function runTest() {
    sendAKeyEvent();
    ok(true, "Not crashed: input on the document");
    $("input_text").focus();
    sendAKeyEvent();
    ok(true, "Not crashed: input on <input type=\"text\">");
    $("input_password").focus();
    sendAKeyEvent();
    ok(true, "Not crashed: input on <input type=\"password\">");
    $("input_password").blur();
    sendAKeyEvent();
    ok(true, "Not crashed: input on the document after blur() of <input type=\"password\">");
    $("input_password").focus();
    $("input_text_readonly").focus();
    sendAKeyEvent();
    ok(true, "Not crashed: input on <input type=\"text\" readonly>");
    $("input_password").focus();
    $("input_text_ime_mode_disabled").focus();
    sendAKeyEvent();
    ok(true, "Not crashed: input on <input type=\"text\" style=\"ime-mode: disabled;\">");
    $("input_password").focus();
    $("textarea").focus();
    sendAKeyEvent();
    ok(true, "Not crashed: input on <textarea>");
    $("input_password").focus();
    $("contenteditable").focus();
    sendAKeyEvent();
    ok(true, "Not crashed: input on <div contenteditable>");

    $("input_change").focus();
    $("input_change").type = "password";
    sendAKeyEvent();
    ok(true, "Not crashed: input on <input type=\"password\"> changed from type=\"text\"");
    $("input_change").type = "text";
    sendAKeyEvent();
    ok(true, "Not crashed: input on <input type=\"text\"> changed from type=\"password\"");

    var otherWindow =
      window.browsingContext.topChromeWindow.open("file_secure_input.html",
                                                  "_blank", "chrome,width=100,height=100");
    ok(otherWindow, "failed to open other window");
    if (!otherWindow) {
      SimpleTest.finish();
      return;
    }

    $("input_text").focus();
    otherWindow.focus();

    SimpleTest.waitForFocus(function() {
      window.focus();
      sendAKeyEvent();
      ok(isFocused($("input_text")), "focused element isn't <input type=\"text\">");
      ok(true, "Not crashed: input on <input type=\"text\"> after the other document has focus");

      $("input_password").focus();
      otherWindow.focus();
      window.focus();
      sendAKeyEvent();
      ok(isFocused($("input_password")), "focused element isn't <input type=\"password\">");
      ok(true, "Not crashed: input on <input type=\"password\"> after the other document has focus");

      $("input_text").focus();
      otherWindow.focus();
      otherWindow.document.getElementById("text").focus();
      window.focus();
      sendAKeyEvent();
      ok(isFocused($("input_text")), "focused element isn't <input type=\"text\">");
      ok(true, "Not crashed: input on <input type=\"text\"> after the other document's <input type=\"text\"> has focus");

      $("input_password").focus();
      otherWindow.focus();
      otherWindow.document.getElementById("text").focus();
      window.focus();
      sendAKeyEvent();
      ok(isFocused($("input_password")), "focused element isn't <input type=\"password\">");
      ok(true, "Not crashed: input on <input type=\"password\"> after the other document's <input type=\"text\"> has focus");

      $("input_text").focus();
      otherWindow.focus();
      otherWindow.document.getElementById("password").focus();
      window.focus();
      sendAKeyEvent();
      ok(isFocused($("input_text")), "focused element isn't <input type=\"text\">");
      ok(true, "Not crashed: input on <input type=\"text\"> after the other document's <input type=\"password\"> has focus");

      $("input_password").focus();
      otherWindow.focus();
      otherWindow.document.getElementById("password").focus();
      window.focus();
      sendAKeyEvent();
      ok(isFocused($("input_password")), "focused element isn't <input type=\"password\">");
      ok(true, "Not crashed: input on <input type=\"password\"> after the other document's <input type=\"password\"> has focus");

      SimpleTest.finish();
    }, otherWindow);
  }

  SimpleTest.waitForFocus(runTest);
</script>
</body>
</html>
