// 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); };