(async function(testRunner) {
  var {page, session, dp} = await testRunner.startBlank(`Tests Input.dispatchKeyEvent method.`);

  await session.evaluate(`
    window.addEventListener('keydown', logEvent);
    window.addEventListener('keypress', logEvent);
    window.addEventListener('keyup', logEvent);

    window.logs = [];
    function log(text) {
      logs.push(text);
    }

    function logEvent(event) {
      log('-----Event-----');
      log('type: ' + event.type);
      if (event.altKey)
        log('altKey');
      if (event.ctrlKey)
        log('ctrlKey');
      if (event.metaKey)
        log('metaKey');
      if (event.shiftKey)
        log('shiftKey');
      if (event.keyCode)
        log('keyCode: ' + event.keyCode);
      if (event.key)
        log('key: ' + event.key);
      if (event.charCode)
        log('charCode: ' + event.charCode);
      if (event.text)
        log('text: ' + event.text);
      if (event.location)
        log('location: ' + event.location);
      if (event.code)
        log('code: ' + event.code);
      log('');
    }
  `);

  function dumpError(message) {
    if (message.error)
      testRunner.log('Error: ' + message.error.message);
  }

  dumpError(await dp.Input.dispatchKeyEvent({
    type: 'rawKeyDown',
    windowsVirtualKeyCode: 65, // VK_A
    key: 'A'
  }));
  dumpError(await dp.Input.dispatchKeyEvent({
    type: 'char',
    modifiers: 8, // shift
    text: 'A',
    unmodifiedText: 'a'
  }));
  dumpError(await dp.Input.dispatchKeyEvent({
    type: 'keyUp',
    windowsVirtualKeyCode: 65,
    key: 'A'
  }));
  dumpError(await dp.Input.dispatchKeyEvent({
    type: 'char',
    text: '\u05E9',  // Hebrew Shin (sh)
    unmodifiedText: '\u05E9'
  }));
  dumpError(await dp.Input.dispatchKeyEvent({
    type: 'keyDown',
    modifiers: 8, // shift
    windowsVirtualKeyCode: 16,
    location: 1,
    code: 'ShiftLeft'
  }));
  dumpError(await dp.Input.dispatchKeyEvent({
    type: 'keyDown',
    modifiers: 8, // shift
    windowsVirtualKeyCode: 16,
    location: 2,
    code: 'ShiftRight'
  }));

  testRunner.log(await session.evaluate(`window.logs.join('\\n')`));
  testRunner.completeTest();
})
