diff options
Diffstat (limited to 'chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/event_watcher_test.unitjs')
-rw-r--r-- | chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/event_watcher_test.unitjs | 754 |
1 files changed, 0 insertions, 754 deletions
diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/event_watcher_test.unitjs b/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/event_watcher_test.unitjs deleted file mode 100644 index a934d41a7bd..00000000000 --- a/chromium/chrome/browser/resources/chromeos/chromevox/chromevox/injected/event_watcher_test.unitjs +++ /dev/null @@ -1,754 +0,0 @@ -// 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 CvoxEventWatcherUnitTest() { - ChromeVoxUnitTestBase.call(this); -} - -CvoxEventWatcherUnitTest.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; - } -}; - -TEST_F('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', '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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', 'EditableTextListboxUpdatingInput', - 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, 'First pick', 9, 9, 40); // 'down' - }) - .waitForCalm(this.assertSpoken, 'First pick'); -}); - -/** - * Tests navigating through a multiline text area. - */ -TEST_F('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', '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). - */ -TEST_F('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', - '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 = document.createEvent('KeyboardEvent'); - evt.initKeyboardEvent( - 'keydown', true, true, window, dir, 0, false, false, false, false); - - 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, 'Right') // right arrow - // Moves to next radiobutton. - .waitForCalm(this.assertSpoken, - 'blue Radio button selected blue Radio button selected') - .waitForCalm(performKeyDown, 'Right') // right arrow - // Arrowed beyond end. Should be quiet. - .waitForCalm(this.assertSpoken, ''); - - this.waitForCalm(performKeyDown, 'Left') // left arrow - // Moves back to first radio. - .waitForCalm(this.assertSpoken, - 'green Radio button selected green Radio button selected') - .waitForCalm(performKeyDown, 'Left') // left arrow - // Arrowed beyond beginning. Should be quiet. - .waitForCalm(this.assertSpoken, ''); -}); - -/** - * Test time widget. - */ -TEST_F('CvoxEventWatcherUnitTest', '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 = document.createEvent('KeyboardEvent'); - evt.initKeyboardEvent( - 'keydown', true, true, window, dir, 0, false, false, false, false); - - document.activeElement.dispatchEvent(evt); - }; - var performKeyUp = function(dir) { - var evt = document.createEvent('KeyboardEvent'); - evt.initKeyboardEvent( - 'keyup', true, true, window, dir, 0, false, false, false, false); - - 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, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // down arrow - .waitForCalm(this.assertSpoken, - '11 hours'); - - this.waitForCalm(performKeyDown, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // down arrow - .waitForCalm(this.assertSpoken, - '10 hours'); - - this.waitForCalm(performKeyDown, 'Right') // right arrow - .waitForCalm(performKeyUp, 'Right') // right arrow - .waitForCalm(performKeyDown, 'Up') // right arrow - .waitForCalm(performKeyUp, 'Up') // right arrow - .waitForCalm(this.assertSpoken, - '01 minutes'); - - this.waitForCalm(performKeyDown, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // down arrow - .waitForCalm(this.assertSpoken, - '00 minutes'); - - this.waitForCalm(performKeyDown, 'Right') // right arrow - .waitForCalm(performKeyUp, 'Right') // right arrow - .waitForCalm(performKeyDown, 'Up') // right arrow - .waitForCalm(performKeyUp, 'Up') // right arrow - .waitForCalm(this.assertSpoken, - 'AM'); - - this.waitForCalm(performKeyDown, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // down arrow - .waitForCalm(this.assertSpoken, - 'PM'); -}); - -/** - * Test date widget. - */ -TEST_F('CvoxEventWatcherUnitTest', '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 = document.createEvent('KeyboardEvent'); - evt.initKeyboardEvent( - 'keydown', true, true, window, dir, 0, false, false, false, false); - - document.activeElement.dispatchEvent(evt); - }; - var performKeyUp = function(dir) { - var evt = document.createEvent('KeyboardEvent'); - evt.initKeyboardEvent( - 'keyup', true, true, window, dir, 0, false, false, false, false); - - 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, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // down arrow - .waitForCalm(this.assertSpoken, - 'August') - - .waitForCalm(performKeyDown, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // down arrow - .waitForCalm(this.assertSpoken, 'July') - - .waitForCalm(performKeyDown, 'Right') // right arrow - .waitForCalm(performKeyUp, 'Right') // right arrow - .waitForCalm(performKeyDown, 'Up') // right arrow - .waitForCalm(performKeyUp, 'Up') // right arrow - .waitForCalm(this.assertSpoken, '5') - - .waitForCalm(performKeyDown, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // down arrow - .waitForCalm(this.assertSpoken, '4') - - .waitForCalm(performKeyDown, 'Right') // right arrow - .waitForCalm(performKeyUp, 'Right') // right arrow - .waitForCalm(performKeyDown, 'Up') // right arrow - .waitForCalm(performKeyUp, 'Up') // right arrow - .waitForCalm(this.assertSpoken, - '1999') - - .waitForCalm(performKeyDown, 'Down') // down arrow - .waitForCalm(performKeyUp, 'Down') // 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. - */ -TEST_F('CvoxEventWatcherUnitTest', '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('CvoxEventWatcherUnitTest', '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]); - }); -}); |