blob: 931b5aa7b89627ad134cfbf7ff6248f114864e09 [file] [log] [blame]
// Copyright (c) 2013 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.
/**
* Namespace for keyboard utility functions.
*/
var keyboard = {};
/**
* Swallows keypress and keyup events of arrow keys.
* @param {KeyboardEvent} event Raised event.
* @private
*/
keyboard.onKeyIgnore_ = function(event) {
if (event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)
return;
if (event.keyIdentifier == 'Left' ||
event.keyIdentifier == 'Right' ||
event.keyIdentifier == 'Up' ||
event.keyIdentifier == 'Down') {
event.stopPropagation();
event.preventDefault();
}
};
/**
* Converts arrow keys into tab/shift-tab key events.
* @param {KeyboardEvent} event Raised event.
* @private
*/
keyboard.onKeyDown_ = function(event) {
if (event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)
return;
var needsUpDownKeys = event.target.classList.contains('needs-up-down-keys');
if (event.keyIdentifier == 'Left' ||
(!needsUpDownKeys && event.keyIdentifier == 'Up')) {
keyboard.raiseKeyFocusPrevious(document.activeElement);
event.stopPropagation();
event.preventDefault();
} else if (event.keyIdentifier == 'Right' ||
(!needsUpDownKeys && event.keyIdentifier == 'Down')) {
keyboard.raiseKeyFocusNext(document.activeElement);
event.stopPropagation();
event.preventDefault();
}
};
/**
* Raises tab/shift-tab keyboard events.
* @param {HTMLElement} element Element that should receive the event.
* @param {string} eventType Keyboard event type.
* @param {boolean} shift True if shift should be on.
* @private
*/
keyboard.raiseTabKeyEvent_ = function(element, eventType, shift) {
var event = document.createEvent('KeyboardEvent');
event.initKeyboardEvent(
eventType,
true, // canBubble
true, // cancelable
window,
'U+0009',
0, // keyLocation
false, // ctrl
false, // alt
shift, // shift
false); // meta
element.dispatchEvent(event);
};
/**
* Raises shift+tab keyboard events to focus previous element.
* @param {HTMLElement} element Element that should receive the event.
*/
keyboard.raiseKeyFocusPrevious = function(element) {
keyboard.raiseTabKeyEvent_(element, 'keydown', true);
keyboard.raiseTabKeyEvent_(element, 'keypress', true);
keyboard.raiseTabKeyEvent_(element, 'keyup', true);
};
/**
* Raises tab keyboard events to focus next element.
* @param {HTMLElement} element Element that should receive the event.
*/
keyboard.raiseKeyFocusNext = function(element) {
keyboard.raiseTabKeyEvent_(element, 'keydown', false);
keyboard.raiseTabKeyEvent_(element, 'keypress', false);
keyboard.raiseTabKeyEvent_(element, 'keyup', false);
};
/**
* Initializes event handling for arrow keys driven focus flow.
*/
keyboard.initializeKeyboardFlow = function() {
document.addEventListener('keydown',
keyboard.onKeyDown_, true);
document.addEventListener('keypress',
keyboard.onKeyIgnore_, true);
document.addEventListener('keyup',
keyboard.onKeyIgnore_, true);
};