<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1288591
-->
<head>
  <title>Test key events for time control</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  <meta charset="UTF-8">
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1288591">Mozilla Bug 1288591</a>
<p id="display"></p>
<div id="content">
  <input id="input" type="time">
</div>
<pre id="test">
<script type="application/javascript">

SimpleTest.waitForExplicitFinish();
// Turn off Spatial Navigation because it hijacks arrow keydown events:
SimpleTest.waitForFocus(function() {
  SpecialPowers.pushPrefEnv({"set":[["snav.enabled", false]]}, function() {
    test();
    SimpleTest.finish();
  });
});

var testData = [
  /**
   * keys: keys to send to the input element.
   * initialVal: initial value set to the input element.
   * expectedVal: expected value of the input element after sending the keys.
   */
  {
    // Type 1030 and select AM.
    keys: ["1030", "VK_DOWN"],
    initialVal: "",
    expectedVal: "10:30"
  },
  {
    // Type 3 in the hour field will automatically advance to the minute field.
    keys: ["330", "VK_DOWN"],
    initialVal: "",
    expectedVal: "03:30"
  },
  {
    // Type 5 in the hour field will automatically advance to the minute field.
    // Type 7 in the minute field will automatically advance to the AM/PM field.
    keys: ["57", "VK_DOWN"],
    initialVal: "",
    expectedVal: "05:07"
  },
  {
    // Advance to AM/PM field and change to PM.
    keys: ["VK_TAB", "VK_TAB", "VK_DOWN"],
    initialVal: "10:30",
    expectedVal: "22:30"
  },
  {
    // Right key should do the same thing as TAB key.
    keys: ["VK_RIGHT", "VK_RIGHT", "VK_DOWN"],
    initialVal: "10:30",
    expectedVal: "22:30"
  },
  {
    // Advance to minute field then back to hour field and decrement.
    keys: ["VK_RIGHT", "VK_LEFT", "VK_DOWN"],
    initialVal: "10:30",
    expectedVal: "09:30"
  },
  {
    // Focus starts on the first field, hour in this case, and increment.
    keys: ["VK_UP"],
    initialVal: "16:00",
    expectedVal: "17:00"
  },
  {
    // Advance to minute field and decrement.
    keys: ["VK_TAB", "VK_DOWN"],
    initialVal: "16:00",
    expectedVal: "16:59"
  },
  {
    // Advance to minute field and increment.
    keys: ["VK_TAB", "VK_UP"],
    initialVal: "16:59",
    expectedVal: "16:00"
  },
  {
    // PageUp on hour field increments hour by 3.
    keys: ["VK_PAGE_UP"],
    initialVal: "05:00",
    expectedVal: "08:00"
  },
  {
    // PageDown on hour field decrements hour by 3.
    keys: ["VK_PAGE_DOWN"],
    initialVal: "05:00",
    expectedVal: "02:00"
  },
  {
    // PageUp on minute field increments minute by 10.
    keys: ["VK_TAB", "VK_PAGE_UP"],
    initialVal: "14:00",
    expectedVal: "14:10"
  },
  {
    // PageDown on minute field decrements minute by 10.
    keys: ["VK_TAB", "VK_PAGE_DOWN"],
    initialVal: "14:00",
    expectedVal: "14:50"
  },
  {
    // Home key on hour field sets it to the minimum hour, which is 1 in 12-hour
    // clock.
    keys: ["VK_HOME"],
    initialVal: "03:10",
    expectedVal: "01:10"
  },
  {
    // End key on hour field sets it to the maximum hour, which is 12 in 12-hour
    // clock.
    keys: ["VK_END"],
    initialVal: "03:10",
    expectedVal: "00:10"
  },
  {
    // Home key on minute field sets it to the minimum minute, which is 0.
    keys: ["VK_TAB", "VK_HOME"],
    initialVal: "19:30",
    expectedVal: "19:00"
  },
  {
    // End key on minute field sets it to the minimum minute, which is 59.
    keys: ["VK_TAB", "VK_END"],
    initialVal: "19:30",
    expectedVal: "19:59"
  },
  // Second field will show up when needed.
  {
    // PageUp on second field increments second by 10.
    keys: ["VK_TAB", "VK_TAB", "VK_PAGE_UP"],
    initialVal: "08:10:10",
    expectedVal: "08:10:20"
  },
  {
    // PageDown on second field increments second by 10.
    keys: ["VK_TAB", "VK_TAB", "VK_PAGE_DOWN"],
    initialVal: "08:10:10",
    expectedVal: "08:10:00"
  },
  {
    // Home key on second field sets it to the minimum second, which is 0.
    keys: ["VK_TAB", "VK_TAB", "VK_HOME"],
    initialVal: "16:00:30",
    expectedVal: "16:00:00"
  },
  {
    // End key on second field sets it to the minimum second, which is 59.
    keys: ["VK_TAB", "VK_TAB", "VK_END"],
    initialVal: "16:00:30",
    expectedVal: "16:00:59"
  },
];

function sendKeys(aKeys) {
  for (let i = 0; i < aKeys.length; i++) {
    let key = aKeys[i];
    if (key.startsWith("VK")) {
      synthesizeKey(key, {});
    } else {
      sendString(key);
    }
  }
}

function test() {
  var elem = document.getElementById("input");

  for (let { keys, initialVal, expectedVal } of testData) {
    elem.focus();
    elem.value = initialVal;
    sendKeys(keys);
    elem.blur();
    is(elem.value, expectedVal,
       "Test with " + keys + ", result should be " + expectedVal);
    elem.value = "";
  }
}

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