<html><head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript">
var defaultActions = {
  'keydown': true,
  'keypress': true,
  'keyup': true,
  'textInput': true,
};
var keyEventResult = [];
var focusedElement = "";
var lastFocusedElement = "";
var testStarted = false;
var expectedEventCount = 0;
var eventCount = 0;
var keyDownCount = 0;
var keyUpCount = 0;

function init() {
  document.addEventListener("keydown", handleEvent, false);
  document.addEventListener("keypress", handleEvent, false);
  document.addEventListener("keyup", handleEvent, false);
  document.addEventListener("textInput", handleEvent, false);
  window.addEventListener("blur", handleWindowBlur, false);
}

function log(text) {
  document.getElementById('log').innerHTML += text + '<br/>';
}

function setDefaultAction(type, value) {
  defaultActions[type] = value;
  document.getElementById(type).checked = !value;
  return defaultActions[type];
}

function startTest(count) {
  if (!testStarted) {
    clearResult();
    testStarted = true;
    expectedEventCount = count;
    log("Start test.");
    return true;
  }
  return false;
}

function finishTest() {
  testStarted = false;
  window.domAutomationController.setAutomationId(0);
  window.domAutomationController.send("FINISHED");
  log("Finish test.");
}

function handleEvent(e) {
  var prefixes = {
    'keydown': 'D',
    'keypress': 'P',
    'keyup': 'U',
    'textInput': 'T',
  };

  var evt = e || window.event;
  var result = prefixes[evt.type] + ' ';
  if (evt.type == 'textInput') {
    result += evt.data;
  } else {
    // On Linux, the keydown event of a modifier key doesn't have the
    // corresponding modifier attribute set, while the keyup event does have,
    // eg. pressing and releasing ctrl may generate a keydown event with
    // ctrlKey=false and a keyup event with ctrlKey=true.
    // But Windows and Mac have opposite behavior than Linux.
    // To make the C++ testing code simpler, if it's a modifier key event,
    // then ignores the corresponding modifier attribute by setting it to true.
    var keyId = evt.key;
    result += (evt.keyCode + ' ' + evt.charCode + ' ' +
        (keyId == 'Control' ? true : evt.ctrlKey) + ' ' +
        (keyId == 'Shift' ? true : evt.shiftKey) + ' ' +
        (keyId == 'Alt' ? true : evt.altKey) + ' ' +
        (keyId == 'Meta' ? true : evt.metaKey));
  }
  keyEventResult.push(result);
  log(result);

  if (testStarted) {
    ++eventCount;
    if (evt.type == "keydown") {
      ++keyDownCount;
    } else if (evt.type == "keyup") {
      ++keyUpCount;
      if (keyDownCount == keyUpCount || (eventCount >= expectedEventCount))
        finishTest();
    }
  }

  if (!defaultActions[evt.type]) {
    if (evt.preventDefault) evt.preventDefault();
    if (evt.stopPropagation) evt.stopPropagation();
  }
  return defaultActions[evt.type];
}

function handleWindowBlur() {
  if (testStarted)
    finishTest();
}

function clearResult() {
  keyEventResult = [];
  testStarted = false;
  expectedEventCount = 0;
  eventCount = 0;
  keyDownCount = 0;
  keyUpCount = 0;
  document.getElementById('log').innerHTML = "";
  return true;
}

function setFocusedElement(id) {
  if (id == "" && focusedElement != "") {
    var elem = document.getElementById(focusedElement);
    if (elem) {
      elem.blur();
      return true;
    }
  } else {
    var elem = document.getElementById(id);
    if (elem) {
      elem.focus();
      return true;
    }
  }
  return false;
}

function onFocus(element) {
  focusedElement = element.id;
  log("Focus: " + focusedElement);
}

function onBlur(element) {
  focusedElement = "";
  lastFocusedElement = element.id;
  log("Blur: " + element.id);
}

function onClick(element) {
  if (defaultActions[element.id] != undefined)
    defaultActions[element.id] = !element.checked;
}
</script>
</head>
<body onload="init()">
  <input type="checkbox" id="keydown" onclick="onClick(this)">keydown</input>
  <input type="checkbox" id="keypress" onclick="onClick(this)">keypress</input>
  <input type="checkbox" id="keyup" onclick="onClick(this)">keyup</input>
  <input type="checkbox" id="textInput" onclick="onClick(this)">textInput</input>
  <br/>
  <input type="checkbox" id="1" accesskey='1'
    onfocus="onFocus(this)" onblur="onBlur(this)"/>
  <input type="checkbox" id="2" accesskey='2'
    onfocus="onFocus(this)" onblur="onBlur(this)"/>
  <input type="checkbox" id="3" accesskey='3'
    onfocus="onFocus(this)" onblur="onBlur(this)"/>
  <input type="checkbox" id="D" accesskey='D'
    onfocus="onFocus(this)" onblur="onBlur(this)"/>
  <input type="text" id="A" accesskey="A"
    onfocus="onFocus(this)" onblur="onBlur(this)"/>
  <input type="password" id="B" accesskey="B"
    onfocus="onFocus(this)" onblur="onBlur(this)"/>
  <button id="clear" accesskey='C' onclick="clearResult()">Clear</button>
  <p id="log"></p>
</body>
</html>
