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