| // 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. |
| |
| /** |
| * @fileoverview A collection of JavaScript utilities used to manage focus |
| * within a document. |
| */ |
| |
| |
| goog.provide('cvox.FocusUtil'); |
| |
| |
| /** |
| * Utilities for managing focus. |
| * @constructor |
| */ |
| cvox.FocusUtil = function() {}; |
| |
| /** |
| * Maps whether an input element of specified type accepts text selection or |
| * not. True if the element does accept text selection, false if it does not. |
| * This can be used to determine whether a visitor to that element should |
| * provide interactive text editing to the user. |
| * From the W3C table of possible type keywords: |
| * http://www.w3.org/TR/html5/the-input-element.html#attr-input-type |
| * |
| * TODO(dmazzoni): merge this with cvox.DomUtil.isInputTypeText |
| * |
| * @type {Object} |
| */ |
| cvox.FocusUtil.INPUT_TYPE_ACCEPTS_SELECTION_TABLE = { |
| 'hidden': false, |
| 'text': true, |
| 'search': true, |
| 'tel': true, |
| 'url': true, |
| 'email': true, |
| 'password': true, |
| 'datetime': false, |
| 'date': false, |
| 'month': false, |
| 'week': false, |
| 'time': false, |
| 'datetime-local': false, |
| 'number': false, |
| 'range': false, |
| 'color': false, |
| 'checkbox': false, |
| 'radio': false, |
| 'file': false, |
| 'submit': false, |
| 'image': false, |
| 'reset': false, |
| 'button': false |
| }; |
| |
| /** |
| * Checks if the currently focused element is a field that accepts text input |
| * (This can include text fields and selectors) |
| * |
| * @return {boolean} True if the currently focused element accepts text input. |
| */ |
| cvox.FocusUtil.isFocusInTextInputField = function() { |
| var activeElement = document.activeElement; |
| |
| if (!activeElement) { |
| return false; |
| } |
| |
| if (activeElement.isContentEditable) { |
| return true; |
| } |
| |
| if (activeElement.getAttribute('role') == 'textbox') { |
| return true; |
| } |
| |
| if (activeElement.getAttribute('readOnly') == 'true') { |
| return false; |
| } |
| |
| if (activeElement.tagName === 'TEXTAREA' || |
| activeElement.tagName === 'SELECT') { |
| return true; |
| } |
| |
| if (activeElement.tagName === 'INPUT') { |
| if (!activeElement.hasAttribute('type')) { |
| return true; |
| } else { |
| var activeType = activeElement.getAttribute('type').toLowerCase(); |
| return cvox.FocusUtil.INPUT_TYPE_ACCEPTS_SELECTION_TABLE[activeType]; |
| } |
| } |
| return false; |
| }; |