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