1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5/** 6 * @fileoverview Defines a global object. The initialization of this 7 * object happens in init.js. 8 * 9 */ 10 11goog.provide('cvox.ChromeVox'); 12 13// Forward declarations. 14// TODO (stoarca): Put these in a separate file and pass that 15// into the build system instead of having it here. This will allow 16// us to group all of the forward declarations for each file without 17// having them overwrite the mapping in deps.js 18goog.addDependency( 19 '../host/interface/abstract_host.js', 20 ['cvox.AbstractHost'], 21 []); 22 23goog.addDependency( 24 '../host/interface/tts_interface.js', 25 ['cvox.TtsInterface'], 26 []); 27 28goog.addDependency( 29 '../host/interface/braille_interface.js', 30 ['cvox.BrailleInterface'], 31 []); 32 33goog.addDependency( 34 '../host/interface/mathjax_interface.js', 35 ['cvox.MathJaxInterface'], 36 []); 37 38goog.addDependency( 39 '../chromevox/messages/msgs.js', 40 ['cvox.Msgs'], 41 []); 42 43goog.addDependency( 44 '../host/interface/abstract_earcons.js', 45 ['cvox.AbstractEarcons'], 46 []); 47 48goog.addDependency( 49 '../chromevox/common/key_sequence.js', 50 ['cvox.KeySequence'], 51 []); 52 53goog.addDependency( 54 '../chromevox/injected/navigation_manager.js', 55 ['cvox.NavigationManager'], 56 []); 57 58goog.addDependency( 59 '../chromevox/injected/serializer.js', 60 ['cvox.Serializer'], 61 []); 62 63// Constants 64/** 65 * Constant for verbosity setting (cvox.ChromeVox.verbosity). 66 * @const 67 * @type {number} 68 */ 69cvox.VERBOSITY_VERBOSE = 0; 70/** 71 * Constant for verbosity setting (cvox.ChromeVox.verbosity). 72 * @const 73 * @type {number} 74 */ 75cvox.VERBOSITY_BRIEF = 1; 76 77 78/** 79 * @constructor 80 */ 81cvox.ChromeVox = function() {}; 82 83/** 84 * @type {cvox.AbstractHost} 85 */ 86cvox.ChromeVox.host = null; 87/** 88 * @type {cvox.TtsInterface} 89 */ 90cvox.ChromeVox.tts; 91/** 92 * @type {cvox.BrailleInterface} 93 */ 94cvox.ChromeVox.braille; 95/** 96 * @type {cvox.MathJaxInterface} 97 */ 98cvox.ChromeVox.mathJax; 99/** 100 * @type {cvox.Msgs} 101 */ 102cvox.ChromeVox.msgs = null; 103/** 104 * @type {boolean} 105 */ 106cvox.ChromeVox.isActive = true; 107/** 108 * @type {?string} 109 */ 110cvox.ChromeVox.version = null; 111/** 112 * @type {cvox.AbstractEarcons} 113 */ 114cvox.ChromeVox.earcons = null; 115/** 116 * @type {cvox.NavigationManager} 117 */ 118cvox.ChromeVox.navigationManager = null; 119/** 120 * @type {cvox.Serializer} 121 */ 122cvox.ChromeVox.serializer = null; 123/** 124 * This indicates whether or not the sticky mode pref is toggled on. 125 * Use cvox.ChromeVox.isStickyModeOn() to test if sticky mode is enabled 126 * either through the pref or due to being temporarily toggled on. 127 * @type {boolean} 128 */ 129cvox.ChromeVox.isStickyPrefOn = false; 130/** 131 * If set to true or false, this value overrides cvox.ChromeVox.isStickyPrefOn 132 * temporarily - in order to temporarily enable sticky mode while doing 133 * 'read from here' or to temporarily disable it while using a widget. 134 * @type {?boolean} 135 */ 136cvox.ChromeVox.stickyOverride = null; 137/** 138 * @type {boolean} 139 */ 140cvox.ChromeVox.keyPrefixOn = false; 141/** 142 * Verbosity setting. 143 * See: cvox.VERBOSITY_VERBOSE and cvox.VERBOSITY_BRIEF 144 * @type {number} 145 */ 146cvox.ChromeVox.verbosity = cvox.VERBOSITY_VERBOSE; 147/** 148 * @type {number} 149 */ 150cvox.ChromeVox.typingEcho = 0; 151/** 152 * Echoing on key press events. 153 * @type {Object.<string, boolean>} 154 */ 155cvox.ChromeVox.keyEcho = {}; 156/** 157 * @type {Object.<string, {x:number, y:number}>} 158 */ 159cvox.ChromeVox.position = {}; 160/** 161 * @type {boolean} 162 */ 163cvox.ChromeVox.isChromeOS = navigator.userAgent.indexOf('CrOS') != -1; 164/** 165 * @type {boolean} 166 */ 167cvox.ChromeVox.isMac = navigator.platform.indexOf('Mac') != -1; 168/** 169 * @type {string} 170 */ 171cvox.ChromeVox.modKeyStr; 172if (cvox.ChromeVox.isChromeOS) { 173 cvox.ChromeVox.modKeyStr = 'Shift+Search'; 174} else if (cvox.ChromeVox.isMac) { 175 cvox.ChromeVox.modKeyStr = 'Ctrl+Cmd'; 176} else { 177 cvox.ChromeVox.modKeyStr = 'Shift+Alt'; 178} 179/** 180 * If any of these keys is pressed with the modifier key, we go in sequence mode 181 * where the subsequent independent key downs (while modifier keys are down) 182 * are a part of the same shortcut. This array is populated in 183 * cvox.ChromeVoxKbHandler.loadKeyToFunctionsTable(). 184 * @type {!Array.<cvox.KeySequence>} 185 */ 186cvox.ChromeVox.sequenceSwitchKeyCodes = []; 187/** @type {Object.<string, boolean>} */ 188cvox.ChromeVox.visitedUrls = {}; 189/** 190 * This function can be called before doing an operation that may trigger 191 * focus events and other events that would normally be announced. This 192 * tells the event manager that these events should be ignored, they're 193 * a result of another command that's already announced them. This is 194 * a temporary state that's automatically reverted after a few milliseconds, 195 * there's no way to explicitly "un-mark". 196 * @type {Function} 197 */ 198cvox.ChromeVox.markInUserCommand = function() {}; 199/** 200 * Synchronizes ChromeVox's internal cursor to the targetNode. 201 * @param {Node} targetNode The node that ChromeVox should be synced to. 202 * @param {boolean=} speakNode If true, speaks out the node. 203 * @param {number=} opt_queueMode The queue mode to use for speaking. 204 */ 205cvox.ChromeVox.syncToNode = function( 206 targetNode, speakNode, opt_queueMode) {}; 207 208/** 209 * Speaks the given node. 210 * @param {Node} targetNode The node that ChromeVox should be synced to. 211 * @param {number=} queueMode The queue mode to use for speaking. 212 * @param {Object=} properties Speech properties to use for this utterance. 213 */ 214cvox.ChromeVox.speakNode = function(targetNode, queueMode, properties) {}; 215 216/** 217 * Provide a way for modules that can't depend on cvox.ChromeVoxUserCommands 218 * to execute commands. 219 * 220 * @param {string} commandName The command name as a string. 221 */ 222cvox.ChromeVox.executeUserCommand = function(commandName) {}; 223 224/** 225 * True if the document body has aria-hidden='true' when we first load. 226 * ChromeVox will disallow any navigation and not eat any keystrokes. 227 * @type {boolean} 228 */ 229cvox.ChromeVox.entireDocumentIsHidden = false; 230 231/** 232 * Stores state variables in a provided object. 233 * 234 * @param {Object} store The object. 235 */ 236cvox.ChromeVox.storeOn = function(store) { 237 store['isStickyPrefOn'] = cvox.ChromeVox.isStickyPrefOn; 238 cvox.ChromeVox.navigationManager.storeOn(store); 239}; 240 241/** 242 * Updates the object with state variables from an earlier storeOn call. 243 * 244 * @param {Object} store The object. 245 */ 246cvox.ChromeVox.readFrom = function(store) { 247 cvox.ChromeVox.isStickyPrefOn = store['isStickyPrefOn']; 248 cvox.ChromeVox.navigationManager.readFrom(store); 249}; 250 251/** 252 * Returns whether sticky mode is on, taking both the global sticky mode 253 * pref and the temporary sticky mode override into account. 254 * 255 * @return {boolean} Whether sticky mode is on. 256 */ 257cvox.ChromeVox.isStickyModeOn = function() { 258 if (cvox.ChromeVox.stickyOverride !== null) { 259 return cvox.ChromeVox.stickyOverride; 260 } else { 261 return cvox.ChromeVox.isStickyPrefOn; 262 } 263}; 264 265/** 266 * Shortcut for document.getElementById. 267 * @param {string} id of the element. 268 * @return {HTMLElement} with the id. 269 */ 270function $(id) { 271 return document.getElementById(id); 272} 273