<import src="/gen/mojo/services/input_events/public/interfaces/input_event_constants.mojom.sky" as="constants" />
<import src="/gen/mojo/services/input_events/public/interfaces/input_events.mojom.sky" as="events" />
<import src="/gen/mojo/services/input_events/public/interfaces/input_key_codes.mojom.sky" as="codes" />
<import src="/gen/sky/services/testing/test_harness.mojom.sky" as="harness" />
<import src="/sky/framework/shell.sky" as="shell" />
<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>
