Home | History | Annotate | Download | only in interface
      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