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