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 Abstract interface to methods that differ depending on the 7 * host platform. 8 * 9 */ 10 11 goog.provide('cvox.AbstractHost'); 12 13 14 /** 15 * @constructor 16 */ 17 cvox.AbstractHost = function() { 18 }; 19 20 21 /** 22 * @enum {number} 23 */ 24 cvox.AbstractHost.State = { 25 ACTIVE: 0, 26 INACTIVE: 1, 27 KILLED: 2 28 }; 29 30 31 /** 32 * Do all host-platform-specific initialization. 33 */ 34 cvox.AbstractHost.prototype.init = function() { 35 }; 36 37 38 /** 39 * Used to reinitialize ChromeVox if initialization fails. 40 */ 41 cvox.AbstractHost.prototype.reinit = function() { 42 }; 43 44 45 /** 46 * Executed on page load. 47 */ 48 cvox.AbstractHost.prototype.onPageLoad = function() { 49 }; 50 51 52 /** 53 * Sends a message to the background page (if it exists) for this host. 54 * @param {Object} message The message to pass to the background page. 55 */ 56 cvox.AbstractHost.prototype.sendToBackgroundPage = function(message) { 57 }; 58 59 60 /** 61 * Returns the absolute URL to the API source. 62 * @return {string} The URL. 63 */ 64 cvox.AbstractHost.prototype.getApiSrc = function() { 65 return ''; 66 }; 67 68 69 /** 70 * Return the absolute URL to the given file. 71 * @param {string} path The URL suffix. 72 * @return {string} The full URL. 73 */ 74 cvox.AbstractHost.prototype.getFileSrc = function(path) { 75 return ''; 76 }; 77 78 79 /** 80 * @return {boolean} True if the host has a Tts callback. 81 */ 82 cvox.AbstractHost.prototype.hasTtsCallback = function() { 83 return true; 84 }; 85 86 87 /** 88 * @return {boolean} True if the TTS has been loaded. 89 */ 90 cvox.AbstractHost.prototype.ttsLoaded = function() { 91 return true; 92 }; 93 94 95 /** 96 * @return {boolean} True if the ChromeVox is supposed to intercept and handle 97 * mouse clicks for the platform, instead of just letting the clicks fall 98 * through. 99 * 100 * Note: This behavior is only needed for Android because of the way touch 101 * exploration and double-tap to click is implemented by the platform. 102 */ 103 cvox.AbstractHost.prototype.mustRedispatchClickEvent = function() { 104 return false; 105 }; 106 107 /** 108 * Activate or deactivate ChromeVox on this host. 109 * @param {boolean} active The desired state; true for active, false for 110 * inactive. 111 */ 112 cvox.AbstractHost.prototype.activateOrDeactivateChromeVox = function(active) { 113 this.onStateChanged_(active ? cvox.AbstractHost.State.ACTIVE : 114 cvox.AbstractHost.State.INACTIVE); 115 }; 116 117 118 /** 119 * Kills ChromeVox on this host. 120 */ 121 cvox.AbstractHost.prototype.killChromeVox = function() { 122 this.onStateChanged_(cvox.AbstractHost.State.KILLED); 123 }; 124 125 126 /** 127 * Helper managing the three states of ChromeVox -- 128 * active: all event listeners registered 129 * inactive: only key down listener registered 130 * killed: no listeners registered 131 * @param {cvox.AbstractHost.State} state The new state. 132 * @private 133 */ 134 cvox.AbstractHost.prototype.onStateChanged_ = function(state) { 135 var active = state == cvox.AbstractHost.State.ACTIVE; 136 if (active == cvox.ChromeVox.isActive) { 137 return; 138 } 139 cvox.ChromeVoxEventWatcher.cleanup(window); 140 switch (state) { 141 case cvox.AbstractHost.State.ACTIVE: 142 cvox.ChromeVox.isActive = true; 143 cvox.ChromeVox.navigationManager.showOrHideIndicator(true); 144 cvox.ChromeVoxEventWatcher.init(window); 145 if (document.activeElement) { 146 var speakNodeAlso = document.hasFocus() && !document.webkitHidden; 147 cvox.ApiImplementation.syncToNode( 148 document.activeElement, speakNodeAlso); 149 } else { 150 cvox.ChromeVox.navigationManager.updateIndicator(); 151 } 152 break; 153 case cvox.AbstractHost.State.INACTIVE: 154 cvox.ChromeVox.isActive = false; 155 cvox.ChromeVox.navigationManager.showOrHideIndicator(false); 156 // If ChromeVox is inactive, the event watcher will only listen for key 157 // down events. 158 cvox.ChromeVoxEventWatcher.init(window); 159 break; 160 case cvox.AbstractHost.State.KILLED: 161 cvox.ChromeVox.isActive = false; 162 cvox.ChromeVox.navigationManager.showOrHideIndicator(false); 163 break; 164 } 165 }; 166