blob: 3be7da63f6668d434b294ffc70494db508df0887 [file] [log] [blame]
// 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 Defines a global object. The initialization of this
* object happens in init.js.
*
*/
goog.provide('cvox.ChromeVox');
// Forward declarations.
// TODO (stoarca): Put these in a separate file and pass that
// into the build system instead of having it here. This will allow
// us to group all of the forward declarations for each file without
// having them overwrite the mapping in deps.js
goog.addDependency(
'../host/interface/abstract_host.js',
['cvox.AbstractHost'],
[]);
goog.addDependency(
'../host/interface/tts_interface.js',
['cvox.TtsInterface'],
[]);
goog.addDependency(
'../host/interface/braille_interface.js',
['cvox.BrailleInterface'],
[]);
goog.addDependency(
'../host/interface/mathjax_interface.js',
['cvox.MathJaxInterface'],
[]);
goog.addDependency(
'../chromevox/messages/msgs.js',
['Msgs'],
[]);
goog.addDependency(
'../host/interface/abstract_earcons.js',
['cvox.AbstractEarcons'],
[]);
goog.addDependency(
'../chromevox/common/key_sequence.js',
['cvox.KeySequence'],
[]);
goog.addDependency(
'../chromevox/injected/navigation_manager.js',
['cvox.NavigationManager'],
[]);
goog.addDependency(
'../chromevox/injected/serializer.js',
['cvox.Serializer'],
[]);
// Constants
/**
* Constant for verbosity setting (cvox.ChromeVox.verbosity).
* @const
* @type {number}
*/
cvox.VERBOSITY_VERBOSE = 0;
/**
* Constant for verbosity setting (cvox.ChromeVox.verbosity).
* @const
* @type {number}
*/
cvox.VERBOSITY_BRIEF = 1;
/**
* @constructor
*/
cvox.ChromeVox = function() {};
/**
* @type {cvox.AbstractHost}
*/
cvox.ChromeVox.host = null;
/**
* @type {cvox.TtsInterface}
*/
cvox.ChromeVox.tts;
/**
* @type {cvox.BrailleInterface}
*/
cvox.ChromeVox.braille;
/**
* @type {cvox.MathJaxInterface}
*/
cvox.ChromeVox.mathJax;
/**
* @type {boolean}
*/
cvox.ChromeVox.isActive = true;
/**
* @type {?string}
*/
cvox.ChromeVox.version = null;
/**
* @type {cvox.AbstractEarcons}
*/
cvox.ChromeVox.earcons = null;
/**
* @type {cvox.NavigationManager}
*/
cvox.ChromeVox.navigationManager = null;
/**
* @type {cvox.Serializer}
*/
cvox.ChromeVox.serializer = null;
/**
* This indicates whether or not the sticky mode pref is toggled on.
* Use cvox.ChromeVox.isStickyModeOn() to test if sticky mode is enabled
* either through the pref or due to being temporarily toggled on.
* @type {boolean}
*/
cvox.ChromeVox.isStickyPrefOn = false;
/**
* If set to true or false, this value overrides cvox.ChromeVox.isStickyPrefOn
* temporarily - in order to temporarily enable sticky mode while doing
* 'read from here' or to temporarily disable it while using a widget.
* @type {?boolean}
*/
cvox.ChromeVox.stickyOverride = null;
/**
* @type {boolean}
*/
cvox.ChromeVox.keyPrefixOn = false;
/**
* Verbosity setting.
* See: cvox.VERBOSITY_VERBOSE and cvox.VERBOSITY_BRIEF
* @type {number}
*/
cvox.ChromeVox.verbosity = cvox.VERBOSITY_VERBOSE;
/**
* @type {number}
*/
cvox.ChromeVox.typingEcho = 0;
/**
* Echoing on key press events.
* @type {Object<boolean>}
*/
cvox.ChromeVox.keyEcho = {};
/**
* @typedef {{x: number, y: number}}
*/
cvox.Point;
/**
* @type {Object<string, cvox.Point>}
*/
cvox.ChromeVox.position = {};
/**
* @type {boolean}
*/
cvox.ChromeVox.isChromeOS = navigator.userAgent.indexOf('CrOS') != -1;
/**
* @type {boolean}
*/
cvox.ChromeVox.isMac = navigator.platform.indexOf('Mac') != -1;
/**
* @type {string}
*/
cvox.ChromeVox.modKeyStr;
if (cvox.ChromeVox.isChromeOS) {
cvox.ChromeVox.modKeyStr = 'Shift+Search';
} else if (cvox.ChromeVox.isMac) {
cvox.ChromeVox.modKeyStr = 'Ctrl+Cmd';
} else {
cvox.ChromeVox.modKeyStr = 'Shift+Alt';
}
/**
* If any of these keys is pressed with the modifier key, we go in sequence mode
* where the subsequent independent key downs (while modifier keys are down)
* are a part of the same shortcut. This array is populated in
* cvox.ChromeVoxKbHandler.loadKeyToFunctionsTable().
* @type {!Array<cvox.KeySequence>}
*/
cvox.ChromeVox.sequenceSwitchKeyCodes = [];
/** @type {Object<boolean>} */
cvox.ChromeVox.visitedUrls = {};
/**
* This function can be called before doing an operation that may trigger
* focus events and other events that would normally be announced. This
* tells the event manager that these events should be ignored, they're
* a result of another command that's already announced them. This is
* a temporary state that's automatically reverted after a few milliseconds,
* there's no way to explicitly "un-mark".
* @type {Function}
*/
cvox.ChromeVox.markInUserCommand = function() {};
/**
* Synchronizes ChromeVox's internal cursor to the targetNode.
* @param {Node} targetNode The node that ChromeVox should be synced to.
* @param {boolean=} speakNode If true, speaks out the node.
* @param {number=} opt_queueMode The queue mode to use for speaking.
*/
cvox.ChromeVox.syncToNode = function(
targetNode, speakNode, opt_queueMode) {};
/**
* Speaks the given node.
* @param {Node} targetNode The node that ChromeVox should be synced to.
* @param {number=} queueMode The queue mode to use for speaking.
* @param {Object=} properties Speech properties to use for this utterance.
*/
cvox.ChromeVox.speakNode = function(targetNode, queueMode, properties) {};
/**
* Provide a way for modules that can't depend on cvox.ChromeVoxUserCommands
* to execute commands.
*
* @param {string} commandName The command name as a string.
*/
cvox.ChromeVox.executeUserCommand = function(commandName) {};
/**
* True if the document body has aria-hidden='true' when we first load.
* ChromeVox will deny any navigation and not eat any keystrokes.
* @type {boolean}
*/
cvox.ChromeVox.entireDocumentIsHidden = false;
/**
* Stores state variables in a provided object.
*
* @param {Object} store The object.
*/
cvox.ChromeVox.storeOn = function(store) {
store['isStickyPrefOn'] = cvox.ChromeVox.isStickyPrefOn;
cvox.ChromeVox.navigationManager.storeOn(store);
};
/**
* Updates the object with state variables from an earlier storeOn call.
*
* @param {Object} store The object.
*/
cvox.ChromeVox.readFrom = function(store) {
cvox.ChromeVox.isStickyPrefOn = store['isStickyPrefOn'];
cvox.ChromeVox.navigationManager.readFrom(store);
};
/**
* Returns whether sticky mode is on, taking both the global sticky mode
* pref and the temporary sticky mode override into account.
*
* @return {boolean} Whether sticky mode is on.
*/
cvox.ChromeVox.isStickyModeOn = function() {
if (cvox.ChromeVox.stickyOverride !== null) {
return cvox.ChromeVox.stickyOverride;
} else {
return cvox.ChromeVox.isStickyPrefOn;
}
};
/**
* Shortcut for document.getElementById.
* @param {string} id of the element.
* @return {Element} with the id.
*/
function $(id) {
return document.getElementById(id);
}
/**
* @param {Array} tabs
*/
cvox.ChromeVox.injectChromeVoxIntoTabs = function(tabs) {};
/**
* Returns whether the document has focus, taking into account whether
* it's hidden and also that if an iframe or webview element has focus,
* the focus is really inside that frame and not in this document.
* @return {boolean} True if the document has focus.
*/
cvox.ChromeVox.documentHasFocus = function() {
if (!document.hasFocus() || document.hidden) {
return false;
}
if (document.activeElement.tagName == 'IFRAME' ||
document.activeElement.tagName == 'WEBVIEW') {
return false;
}
return true;
};