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