<import src="/mojo/services/input_events/public/interfaces/input_event_constants.mojom.sky" as="constants" />
<import src="/mojo/services/input_events/public/interfaces/input_events.mojom.sky" as="events" />
<import src="/mojo/services/input_events/public/interfaces/input_key_codes.mojom.sky" as="codes" />
<import src="/sky/framework/shell.sky" as="shell" />
<import src="/sky/services/testing/test_harness.mojom.sky" as="harness" />
<script>
var harness = shell.connectToService("mojo:sky_tester", harness.TestHarness);

var isDone = false;
var keyPressesRemaining = 0;

function keyDown(key, flag) {
  var eventFlags = constants.EventFlags.NONE;
  // TODO(abarth): Support more than one flag.
  if (constants.EventFlags.hasOwnProperty(flag))
    eventFlags = constants.EventFlags[flag];

  if (key.length != 1 && codes.KeyboardCode.hasOwnProperty(key)) {
    var keyCode = codes.KeyboardCode[key];

    harness.dispatchInputEvent(new events.Event({
      action: constants.EventType.KEY_PRESSED,
      flags: eventFlags,
      key_data: new events.KeyData({
        key_code: keyCode,
        windows_key_code: keyCode,
      })}));

    harness.dispatchInputEvent(new events.Event({
      action: constants.EventType.KEY_PRESSED,
      flags: eventFlags,
      key_data: new events.KeyData({
        is_char: true,
        windows_key_code: keyCode,
      })}));
  } else {
    ++keyPressesRemaining;
    var keyCode = key.charCodeAt(0);
    harness.dispatchInputEvent(new events.Event({
      action: constants.EventType.KEY_PRESSED,
      flags: eventFlags,
      key_data: new events.KeyData({
        key_code: keyCode,
        is_char: true,
        character: keyCode,
        text: keyCode,
        unmodified_text: keyCode,
      })}));
  }
}

function done() {
  if (isDone)
    throw "Already done.";
  isDone = true;
  checkComplete();
}

function checkComplete() {
  if (!isDone)
    return;
  if (keyPressesRemaining != 0)
    return;
  setTimeout(function() {
    internals.notifyTestComplete(internals.contentAsText());
  });
}

document.addEventListener('keypress', function() {
  --keyPressesRemaining;
  checkComplete();
});

module.exports = {
  keyDown: keyDown,
  done: done,
};
</script>
</sky>
