// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Include test fixture.
GEN_INCLUDE(['../../testing/chromevox_unittest_base.js']);

/**
 * Test fixture.
 * @constructor
 * @extends {ChromeVoxUnitTestBase}
 */
function ChromeVoxEventWatcherUnitTest() {
  ChromeVoxUnitTestBase.call(this);
}

ChromeVoxEventWatcherUnitTest.prototype = {
  __proto__: ChromeVoxUnitTestBase.prototype,

  /** @override */
  isAsync: true,

  /** @override */
  closureModuleDeps: ChromeVoxUnitTestBase.prototype.closureModuleDeps.concat([
    'cvox.ChromeVoxTester',
  ]),

  /** @override */
  setUp: function() {
    cvox.ChromeVoxTester.setUp(document);
  },

  /** @override */
  tearDown: function() {
    cvox.ChromeVoxTester.tearDown(document);
  },

  /**
   * Create mock event object.
   * @param {Element} target The event target.
   * @param {number=} opt_keyCode The event key code (i.e. 13 for Enter).
   * @param {string=} opt_type The event type (i.e. 'keydown' or
   *  'focus').
   * @param {number=} opt_timeStamp The event timeStamp.
   * @return {Event} The mock event.
   * @suppress {invalidCasts}
   */
  createMockEvent: function(target, opt_keyCode, opt_type, opt_timeStamp) {
    var mockEvent = {};
    mockEvent.target = target;
    if (opt_keyCode) {
      mockEvent.keyCode = opt_keyCode;
    }
    if (opt_type) {
      mockEvent.type = opt_type;
    }
    if (opt_timeStamp) {
      mockEvent.timeStamp = opt_timeStamp;
    }

    return /** @type {Event} */ (mockEvent);
  },

  /**
   * Simulate typing a key into an text field by modifying a given field and
   * dispatching a keydown event to ChromeVoxEventWatcher. Allows modifying the
   * selection so arrow keypresses can be simulated.
   * @param {Element} textField The text field.
   * @param {string} newValue The new value for the text field.
   * @param {number} newSelStart The new selection start.
   * @param {number} newSelEnd The new selection end.
   * @param {number} keyCode The key code for the keydown event.
   * @return {Element} The modified text field.
   */
  changeTextField: function(
      textField, newValue, newSelStart, newSelEnd, keyCode) {
    textField.value = newValue;
    textField.selectionStart = newSelStart;
    textField.selectionEnd = newSelEnd;

    cvox.ChromeVoxEventWatcher.keyDownEventWatcher(
        this.createMockEvent(textField, keyCode, 'keydown'));
    return textField;
  }
};

// Flaky on Chromium OS: https://crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ButtonFocusFeedback', function() {
  this.loadHtml('<div> <button id="alpha">Alpha</button> </div>');
  this.setFocus('alpha');
  this.waitForCalm(this.assertSpoken, 'Alpha Button');
});

/**
 * Test feedback when focusing links backwards (like shift-tabbing).
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'FocusLinksBackwards', function() {
  this.loadHtml('<div> <p>before</p>' +
      '<p><a href="#" id="l1">1</a></p>' +
      '<p><a href="#" id="l2">2</a></p>' +
      '<p><a href="#" id="l3">3</a></p>' +
      '</div>');

  this.waitForCalm(this.setFocus, 'l1')
      .waitForCalm(this.setFocus, 'l2')
      .waitForCalm(this.setFocus, 'l3')
      .waitForCalm(this.setFocus, 'l2')
      .waitForCalm(this.setFocus, 'l1')
      .waitForCalm(this.assertSpoken,
          '1 Internal link 2 Internal link 3 Internal link ' +
          '2 Internal link 1 Internal link');
});

/**
 * Test feedback when an editable text field gets focus.
 */
// Flaky on Chromium OS: crbug.com/622387, crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_TextFocusFeedback', function() {
  this.loadHtml('<div>' +
      '<label for="mytext">Label</label>' +
      '<input id="mytext" value="Value" title="Title" />' +
      '</div>');

  this.setFocus('mytext');
  this.waitForCalm(this.assertSpoken, 'Label Value Edit text');
});

/**
 * Test feedback when a contenteditable field gets focus.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ContentEditableFocusFeedback',
       function() {
  this.loadHtml('<div>' +
      '<label for="mytext">Label</label>' +
      '<div id="mytext" contentEditable>This is editable</div>' +
      '</div>');

  this.setFocus('mytext');
  this.waitForCalm(this.assertSpoken, 'Label This is editable Edit text');
});

/**
 * Test feedback when an item in an dialog receives focus and then focus
 *     leaves the dialog.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_DialogFeedback', function() {
  this.loadHtml('<div>' +
      '<button id="show">Show</button>' +
      '<div aria-label="compose message" role="dialog">' +
      '  <button id="ok">OK</button>' +
      '  <button id="cancel">Cancel</button>' +
      '</div>' +
      '</div>');

  // Enter the dialog by focusing an element inside it.
  this.setFocus('ok');

  this.waitForCalm(this.assertSpoken,
                   'Entered dialog compose message Dialog OK Button')
      .waitForCalm(function() {
        this.setFocus('show')
            .setFocus('ok');
      })
      .waitForCalm(this.assertSpoken, 'OK Button')
      .waitForCalm(this.setFocus, 'show')
      .waitForCalm(this.assertSpoken, 'Exited dialog. Show Button');
});

/**
 * Test feedback when an item in an alert dialog receives focus.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_AlertDialogFeedback', function() {
  this.loadHtml('<div>' +
      '<div role="alertdialog">' +
      '  <p>Are you sure you want to install Windows?</p>' +
      '  <button id="yes">Yes</button>' +
      '  <button id="no">No</button>' +
      '</div> </div>');

  // Enter the dialog by focusing an element inside it.
  this.setFocus('no');
  this.waitForCalm(this.assertSpoken,
          'Entered dialog ' +
          'Are you sure you want to install Windows? Yes Button No Button ' +
          'No Button');
});

/**
 * Test feedback when focus moves to two different items in a alertdialog
 * quickly - make sure the notification that we entered the dialog
 * isn't interrupted.
 */
// Flaky on Chromium OS: crbug.com/622387, crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_DoubleFocusAlertDialogFeedback',
    function() {
  this.loadHtml('<div>' +
      '<div role="alertdialog">' +
      '  <p>Are these the droids you\'re looking for?</p>' +
      '  <button id="yes">Yes</button>' +
      '  <button id="no">No</button>' +
      '</div>' +
      '<button id="outside">Outside</button>' +
      '</div>');

  // Enter the dialog by focusing an element inside it, but then the Jedi
  // mind trick quickly changes the default answer.
  this.setFocus('yes')
      .setFocus('no');

  this.waitForCalm(this.assertSpokenList,
                   this.spokenList()
                       .categoryFlush('Entered dialog')
                       .queue('Are these the droids you\'re looking for?')
                       .queue('Yes')
                       .queue('Button'))
      .waitForCalm(this.setFocus, 'outside')
      .waitForCalm(this.assertSpoken, 'Exited dialog. Outside Button');
});

/**
 * Test recovery when a dialog box closes and the user sends a tab event.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'CloseDialogTabRecovery', function() {
  this.loadHtml('<div id="container">' +
      '<p id="first">first node</p>' +
      '<button id="button">valid button before</button>' +
      '<p id="before">valid text before</p>' +
      '<p id="dialog">invalid after click</p>' +
      '<p id="last">valid text after</p>' +
      '</div>');

  var first = $('first');
  var dialog = $('dialog');
  var displayNone = function() {
    dialog.style.display = 'none';
  };

  this.waitForCalm(cvox.ChromeVoxTester.syncToNode, first)
      .waitForCalm(cvox.ChromeVoxTester.setStrategy, 'lineardom')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'valid button before Button')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'valid text before')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'invalid after click')
      .waitForCalm(displayNone)
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'valid text after');
});

/**
 * Test feedback when a list box with an active descendant receives focus.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ListBoxFeedback', function() {
  this.loadHtml('<div>' +
      '<p id="before">My listbox</p>' +
      '<div id="listbox" role="listbox" tabindex="0"' +
      ' aria-activedescendant="red">' +
      '  <div id="red" aria-selected="true" role="option">Red</div>' +
      '  <div id="yellow" role="option">Yellow</div>' +
      '  <div id="green" role="option">Green</div>' +
      '</div>' +
      '<p id="after">After</p>' +
      '</div>');

  // Focus the listbox.
  this.setFocus('listbox');
  this.waitForCalm(this.assertSpoken, 'Red List box Selected 1 of 3')
      .waitForCalm(function() {
          // Set the activeDescendant and fire a keydown event.
          // TODO(dmazzoni): replace with a higher-level API that's
          // less brittle.
          var listbox = $('listbox');
          listbox.setAttribute('aria-activeDescendant', 'yellow');
          cvox.ChromeVoxEventWatcher.keyDownEventWatcher(/** @type {Event} */ (
              { 'target': listbox,
                'type': 'keydown' }));
        })
      .waitForCalm(this.assertSpoken, 'Yellow 2 of 3');
});

/**
 * Test feedback when the items of a list box receive focus.
 */
// Flaky on Chromium OS: https://crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ListBoxOptionFeedback', function() {
  this.loadHtml('<div>' +
      '<p id="before">My listbox</p>' +
      '<div id="listbox" role="listbox">' +
      ' <div id="red" tabindex="0" aria-selected="true" role="option">' +
      'Red</div>' +
      '  <div id="yellow" tabindex="-1" role="option">Yellow</div>' +
      '  <div id="green" tabindex="-1" role="option">Green</div>' +
      '</div>' +
      '<p id="after">After</p>' +
      '</div>');

  // Focus the second item.
  this.setFocus('yellow');

  this.waitForCalm(this.assertSpoken, 'List box Yellow 2 of 3')
      .waitForCalm(this.setFocus, 'red')
      .waitForCalm(this.assertSpoken, 'Red Selected 1 of 3');
});

/**
 * Test feedback when the list box is setting focus in response to arrow
 * (or some other) keypress and the user is also using ChromeVox navigation.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'ListBoxOptionFeedbackWithFocus',
       function() {
  this.loadHtml('<div>' +
      '<p id="before">My listbox</p>' +
      '<div id="listbox" role="listbox">' +
      '  <div id="red" tabindex="0" aria-selected="true" role="option">' +
      'Red</div>' +
      '  <div id="yellow" tabindex="-1" role="option">Yellow</div>' +
      '  <div id="green" tabindex="-1" role="option">Green</div>' +
      '  <div id="blue" tabindex="-1" role="option">Blue</div>' +
      '</div>' +
      '<p id="after">After</p>' +
      '</div>');

  // Simulate the user using ChromeVox navigation to move forward in the listbox
  this.waitForCalm(cvox.ChromeVoxTester.setStrategy, 'lineardom')
      .waitForCalm(cvox.ChromeVoxTester.syncToFirstNode)
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'List box Red Selected 1 of 4')
      .waitForCalm(this.setFocus, 'yellow')
      .waitForCalm(this.assertSpoken, 'Yellow 2 of 4')
      .waitForCalm(this.setFocus, 'green')
      .waitForCalm(this.assertSpoken, 'Green 3 of 4')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'Blue 4 of 4');
});

/**
 * Test feedback when interacting with an editable text field.
 * The low-level details are tested in editable_text_test.js, this is
 * a higher-level test of how that code interacts with the event watcher.
 */
// Flaky on Chromium OS: https://crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_EditableText', function() {
  cvox.ChromeVoxEditableTextBase.eventTypingEcho = false;
  this.loadHtml('<div>' +
      '<button id="before">Before</button>' +
      '<label for="input">Query</label>' +
      '<input id="input" value="abc">' +
      '<p>After</p>' +
      '</div>');

  var before = $('before');
  var input = $('input');

  // Focus the button first.
  before.focus();

  // Then focus the text field.
  input.focus();
  input.setSelectionRange(3, 3);

  this.waitForCalm(this.changeTextField, input, 'abcd', 3, 3, 68)  // 'd'
      .waitForCalm(this.changeTextField, input, 'abcde', 4, 4, 69) // 'e'
      .waitForCalm(this.assertSpokenList,
                   this.spokenList()
                       .categoryFlush('Query')
                       .queue('abc')
                       .queue('Edit text')
                       .flush('d')
                       .flush('e'));
});

/**
 * Test feedback when interacting with an editable text field that drives
 * an listbox (to form an auto-complete combobox) but doesn't get updated.
 * The low-level details are tested in editable_text_test.js, this is
 * a higher-level test of how that code interacts with the event watcher.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'EditableTextListbox', function() {
  this.loadHtml('<div>' +
      '<button id="before">Before</button>' +
      '<label for="input">Query</label>' +
      '<input id="input" value="" role="combobox" aria-autocomplete="list"' +
      '  aria-activedescendant>' +
      '<div role="listbox">' +
      '  <div id="option1" role="option">First pick</div>' +
      '  <div id="option2" role="option">Second pick</div>' +
      '</div>' +
      '<p>After</p>' +
      '</div>');

  var before = $('before');
  var input = $('input');

  // Focus the text field.
  this.waitForCalm(this.setFocus, 'input')
      .waitForCalm(this.assertSpoken, 'Query Combo box Autocompletion list');

  this.waitForCalm(function() {
          input.setAttribute('aria-activedescendant', 'option1');
          this.changeTextField(input, '', 0, 0, 40);  // 'down'
          })
      .waitForCalm(this.assertSpoken, 'First pick 1 of 2');
});

/**
 * Test feedback when interacting with an editable text field that drives
 * an listbox (to form an auto-complete combobox) and *does* get updated.
 * The low-level details are tested in editable_text_test.js, this is
 * a higher-level test of how that code interacts with the event watcher.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'EditableTextListboxUpdatingInput',
    function() {
  cvox.ChromeVoxEditableTextBase.shouldSpeakInsertions = true;
  this.loadHtml('<div>' +
      '<button id="before">Before</button>' +
      '<label for="input">Query</label>' +
      '<input id="input" value="" role="combobox" aria-autocomplete="list"' +
      '  aria-activedescendant>' +
      '<div role="listbox">' +
      '  <div id="option1" role="option">First pick</div>' +
      '  <div id="option2" role="option">Second pick</div>' +
      '</div>' +
      '<p>After</p>' +
      '</div>');

  var before = $('before');
  var input = $('input');

  // Focus the text field.
  this.waitForCalm(this.setFocus, 'input')
      .waitForCalm(this.assertSpoken, 'Query Combo box Autocompletion list');

  this.waitForCalm(function() {
          input.setAttribute('aria-activedescendant', 'option1');
          this.changeTextField(input, 'First pick', 9, 9, 40);  // 'down'
          })
      .waitForCalm(this.assertSpoken, 'First pick');
});

/**
 * Tests navigating through a multiline text area.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_MultilineNavigation', function() {
  this.loadHtml('<div> <textarea id="area">' +
      'one' +
      '\n\n' +
      'two' +
      '\n\n' +
      'three</textarea>' +
      '</div>');

  var area = $('area');

  function setAreaCursor(pos) {
    area.setSelectionRange(pos, pos);
    cvox.ChromeVoxEventWatcher.keyDownEventWatcher(/** @type {Event} */ (
        { 'target': area,
          'type': 'keydown' }));
  }

  area.focus();
  this.waitForCalm(this.assertSpoken, 'one two three Text area')
      .waitForCalm(setAreaCursor, 0)
  // The cursor did not move, so don't say anything -- even though we
  // did press a key.
      .waitForCalm(this.assertSpoken, '')
      .waitForCalm(setAreaCursor, 5) // in front on the 'two'
      .waitForCalm(this.assertSpoken, 'two')
      .waitForCalm(setAreaCursor, 10) // in front of the 'three'
      .waitForCalm(this.assertSpoken, 'three')
      .waitForCalm(setAreaCursor, 0) // back to the first line
      .waitForCalm(this.assertSpoken, 'one')
      .waitForCalm(setAreaCursor, 4) // on the first new line
      .waitForCalm(this.assertSpoken, 'Blank')
      .waitForCalm(setAreaCursor, 5)
      .waitForCalm(this.assertSpoken, 'two')
      .waitForCalm(setAreaCursor, 9)
      .waitForCalm(this.assertSpoken, 'Blank')
      .waitForCalm(setAreaCursor, 10)
      .waitForCalm(this.assertSpoken, 'three');
});

SYNC_TEST_F('ChromeVoxEventWatcherUnitTest', 'ShouldWaitToProcess', function() {
  // The focus event just happened, wait.
  assertTrue(
      cvox.ChromeVoxEventWatcherUtil.shouldWaitToProcess(100, 100, 100));
  // The focus event just happened, but the first event is old, don't wait.
  assertFalse(
      cvox.ChromeVoxEventWatcherUtil.shouldWaitToProcess(100, 0, 100));
  // The focus event is old, don't wait.
  assertFalse(
      cvox.ChromeVoxEventWatcherUtil.shouldWaitToProcess(0, 0, 100));

});

/**
 * Test that no feedback is received for events that fire on elements
 * that are hidden (or the descendant of a hidden element).
 */
// Flaky on Chromium OS: https://crbug.com/919033.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_AriaHiddenFeedback', function() {
  this.loadHtml('<div>' +
      '<div>' +
      '  <button id="button1">Button 1</button>' +
      '  <button id="button2" aria-hidden="true">Button 2</button>' +
      '</div>' +
      '<div aria-hidden="true">' +
      '  <h3>Random header</h3>' +
      '  <div>' +
      '     <button id="button3">Button 3</button>' +
      '  </div>' +
      '  <h3>Random header</h3>' +
      '</div>' +
      '<div>' +
      '  <button id="button4">Button 4</button>' +
      '</div>' +
      '</div>');

  this.setFocus('button1')
      .waitForCalm(this.assertSpoken, 'Button 1 Button')
      .waitForCalm(this.setFocus, 'button2')
      .waitForCalm(this.assertSpoken, '')
      .waitForCalm(this.setFocus, 'button3')
      .waitForCalm(this.assertSpoken, '')
      .waitForCalm(this.setFocus, 'button4')
      .waitForCalm(this.assertSpoken, 'Button 4 Button');
});

/**
 * Test that key down events don't cause excessive value and state announcements
 * when arrowing around radiobuttons.
 */
TEST_F('ChromeVoxEventWatcherUnitTest',
       'DISABLED_RadioButtonAnnouncements',
       function() {
  this.loadHtml(
    '<input id="radio1" type="radio" aria-label="green" tabindex=0>' +
    '<input id="radio2" type="radio" aria-label="blue" tabindex=0>');
  function performKeyDown(dir) {
    var evt = new KeyboardEvent("keydown", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };

  var radio1 = $('radio1');
  radio1.focus();

  // TODO(dtseng): Repeated actual spoken text here; this is most certainly a
  // test framework bug.
  this.waitForCalm(this.assertSpoken, 'green Radio button unselected')
      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      // Moves to next radiobutton.
      .waitForCalm(this.assertSpoken,
                   'blue Radio button selected blue Radio button selected')
      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      // Arrowed beyond end. Should be quiet.
      .waitForCalm(this.assertSpoken, '');

  this.waitForCalm(performKeyDown, 'ArrowLeft') // left arrow
      // Moves back to first radio.
      .waitForCalm(this.assertSpoken,
                   'green Radio button selected green Radio button selected')
      .waitForCalm(performKeyDown, 'ArrowLeft') // left arrow
      // Arrowed beyond beginning. Should be quiet.
      .waitForCalm(this.assertSpoken, '');
});

/**
 * Test time widget.
 * Disabled because test relies on removed behavior; see crbug.com/520519.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_TimeWidget', function() {
  this.loadHtml(
    '<label for="timewidget">Set alarm for:</label>' +
    '<input id="timewidget" type="time" value="12:00">');
  var performKeyDown = function(dir) {
    var evt = new KeyboardEvent("keydown", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };
  var performKeyUp = function(dir) {
    var evt = new KeyboardEvent("keyup", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };

  var timewidget = $('timewidget');
  timewidget.focus();

  this.waitForCalm(this.assertSpoken,
      'Set alarm for: 12:00 Set alarm for: 12 hours 00 minutes PM');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '11 hours');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '10 hours');

  this.waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken,
                   '01 minutes');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '00 minutes');

  this.waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken,
                   'AM');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   'PM');
});

/**
 * Test date widget.
 * Disabled because test relies on removed behavior; see crbug.com/520519.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_DateWidget', function() {
  this.loadHtml(
    '<label for="datewidget">Set birthdate:</label>' +
    '<input id="datewidget" type="date" value="1998-09-04"/>');
  var performKeyDown = function(dir) {
    var evt = new KeyboardEvent("keydown", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };
  var performKeyUp = function(dir) {
    var evt = new KeyboardEvent("keyup", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };

  var datewidget = $('datewidget');
  datewidget.focus();

  this.waitForCalm(this.assertSpoken,
      'Set birthdate: 1998-09-04 Date control Set birthdate: September 4 1998')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   'August')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken, 'July')

      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken, '5')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken, '4')

      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken,
                   '1999')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '1998');
});

/**
 * Test that ChromeVox speaks the correct state when a focused control
 * changes as the result of a key up, not just key down.
 */
// Flaky on Chromium OS: crbug.com/622387, crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ToggleOnKeyUp', function() {
  this.loadHtml('<div>' +
      '<div tabIndex=0 id="pressable" role="button" aria-pressed="false">' +
      'Toggle' +
      '</div>' +
      '</div>');

  // Focus on the button.
  this.setFocus('pressable');
  this.waitForCalm(this.assertSpoken, 'Toggle Button Not pressed');

  function keyupSpace() {
    var evt = document.createEvent('KeyboardEvent');
    evt.initKeyboardEvent(
        'keyup', true, true, window, ' ', 0, false, false, false, false);
    document.activeElement.dispatchEvent(evt);
  }

  function keyupSpaceAndMarkPressed() {
    keyupSpace();
    $('pressable').setAttribute('aria-pressed', 'true');
  };

  function keyupSpaceAndMarkNotPressed() {
    keyupSpace();
    $('pressable').setAttribute('aria-pressed', 'false');
  };

  this.waitForCalm(keyupSpaceAndMarkPressed)
      .waitForCalm(this.assertSpoken, 'Pressed')
      .waitForCalm(keyupSpaceAndMarkNotPressed)
      .waitForCalm(this.assertSpoken, 'Not pressed');
});

/**
 * Exiting dialog message should not interrupt a live region.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ExitDialogWithLiveRegion',
       function() {
  this.loadHtml(
      '<div role="dialog" aria-label="MyAlert">' +
      '  <h1>Heading</h1>' +
      '  <button id="initial">Initial focus</button>' +
      '</div>' +
      '<div>' +
      '  <button id="final">Final focus</button>' +
      '</div>' +
      '<div id="live" aria-live="polite"></div>');

  // Focus on the button in the dialog.
  this.setFocus('initial');
  this.waitForCalm(this.assertSpoken,
                   'Entered dialog MyAlert Dialog Initial focus Button')
      .waitForCalm(function() {
        $('live').innerText = 'Live region changed';
      })
      .waitForCalm(function() {
        this.setFocus('final');
      })
      .waitForCalm(function() {
        var ulist = cvox.ChromeVoxTester.testTts().getSpeechQueueOutput();
        assertEquals('Live region changed', ulist[0]);
        assertEquals('Exited dialog.', ulist[1]);
        assertEquals('Final focus', ulist[2]);
        assertEquals('Button', ulist[3]);
      });
});
