| Index: chrome/browser/resources/chromeos/chromevox/chromevox/injected/api.js
|
| diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/injected/api.js b/chrome/browser/resources/chromeos/chromevox/chromevox/injected/api.js
|
| index 4804bd68a21cb99e0c470cf3dd580eab58e0326b..632d3f8ee7df39099cbb15ca23d2f7522caa744b 100644
|
| --- a/chrome/browser/resources/chromeos/chromevox/chromevox/injected/api.js
|
| +++ b/chrome/browser/resources/chromeos/chromevox/chromevox/injected/api.js
|
| @@ -16,248 +16,243 @@ if (typeof(goog) != 'undefined' && goog.require) {
|
| }
|
|
|
| (function() {
|
| - /*
|
| - * Private data and methods.
|
| - */
|
| -
|
| - /**
|
| - * The name of the port between the content script and background page.
|
| - * @type {string}
|
| - * @const
|
| - */
|
| - var PORT_NAME = 'cvox.Port';
|
| -
|
| - /**
|
| - * The name of the message between the page and content script that sets
|
| - * up the bidirectional port between them.
|
| - * @type {string}
|
| - * @const
|
| - */
|
| - var PORT_SETUP_MSG = 'cvox.PortSetup';
|
| -
|
| - /**
|
| - * The message between content script and the page that indicates the
|
| - * connection to the background page has been lost.
|
| - * @type {string}
|
| - * @const
|
| - */
|
| - var DISCONNECT_MSG = 'cvox.Disconnect';
|
| -
|
| - /**
|
| - * The channel between the page and content script.
|
| - * @type {MessageChannel}
|
| - */
|
| - var channel;
|
| -
|
| - /**
|
| - * Tracks whether or not the ChromeVox API should be considered active.
|
| - * @type {boolean}
|
| - */
|
| - var isActive = false;
|
| -
|
| - /**
|
| - * The next id to use for async callbacks.
|
| - * @type {number}
|
| - */
|
| - var nextCallbackId = 1;
|
| -
|
| - /**
|
| - * Map from callback ID to callback function.
|
| - * @type {Object<number, function(*)>}
|
| - */
|
| - var callbackMap = {};
|
| -
|
| - /**
|
| - * Internal function to connect to the content script.
|
| - */
|
| - function connect_() {
|
| - if (channel) {
|
| - // If there is already an existing channel, close the existing ports.
|
| - channel.port1.close();
|
| - channel.port2.close();
|
| - channel = null;
|
| - }
|
| -
|
| - channel = new MessageChannel();
|
| - channel.port1.onmessage = function(event) {
|
| - if (event.data == DISCONNECT_MSG) {
|
| - channel = null;
|
| - }
|
| - try {
|
| - var message = JSON.parse(event.data);
|
| - if (message['id'] && callbackMap[message['id']]) {
|
| - callbackMap[message['id']](message);
|
| - delete callbackMap[message['id']];
|
| - }
|
| - } catch (e) {
|
| - }
|
| - };
|
| - window.postMessage(PORT_SETUP_MSG, '*', [channel.port2]);
|
| - }
|
| -
|
| - /**
|
| - * Internal function to send a message to the content script and
|
| - * call a callback with the response.
|
| - * @param {Object} message A serializable message.
|
| - * @param {function(*)} callback A callback that will be called
|
| - * with the response message.
|
| - */
|
| - function callAsync_(message, callback) {
|
| - var id = nextCallbackId;
|
| - nextCallbackId++;
|
| - if (message['args'] === undefined) {
|
| - message['args'] = [];
|
| - }
|
| - message['args'] = [id].concat(message['args']);
|
| - callbackMap[id] = callback;
|
| - channel.port1.postMessage(JSON.stringify(message));
|
| - }
|
| -
|
| - /**
|
| - * Wraps callAsync_ for sending speak requests.
|
| - * @param {Object} message A serializable message.
|
| - * @param {Object=} properties Speech properties to use for this utterance.
|
| - * @private
|
| - */
|
| - function callSpeakAsync_(message, properties) {
|
| - var callback = null;
|
| - /* Use the user supplied callback as callAsync_'s callback. */
|
| - if (properties && properties['endCallback']) {
|
| - callback = properties['endCallback'];
|
| - }
|
| - callAsync_(message, callback);
|
| - }
|
| -
|
| - /**
|
| - * Gets an object given a dotted namespace object path.
|
| - * @param {string} path
|
| - * @return {*}
|
| - */
|
| - function getObjectByName(path) {
|
| - var pieces = path.split('.');
|
| - var resolved = window;
|
| - for (var i = 0; i < pieces.length; i++) {
|
| - resolved = resolved[pieces[i]];
|
| - if (!resolved) {
|
| - return null;
|
| - }
|
| - }
|
| - return resolved;
|
| - }
|
| -
|
| -
|
| - /**
|
| - * Maybe enable MathJaX support.
|
| - */
|
| - function maybeEnableMathJaX() {
|
| - if (!getObjectByName('MathJax.Hub.Register.LoadHook') ||
|
| - !getObjectByName('MathJax.Ajax.Require')) {
|
| - return;
|
| - }
|
| -
|
| - MathJax.Hub.Register.LoadHook('[a11y]/explorer.js', function() {
|
| - // |explorer| is an object instance, so we get it to call an instance
|
| - // |method.
|
| - var explorer = getObjectByName('MathJax.Extension.explorer');
|
| - if (explorer.Enable) {
|
| - explorer.Enable(true, true);
|
| - }
|
| - });
|
| - MathJax.Ajax.Require('[a11y]/explorer.js');
|
| - }
|
| -
|
| -
|
| - /*
|
| - * Public API.
|
| - */
|
| -
|
| - if (!window['cvox']) {
|
| - window['cvox'] = {};
|
| - }
|
| - var cvox = window.cvox;
|
| -
|
| -
|
| - /**
|
| - * ApiImplementation - this is only visible if all the scripts are compiled
|
| - * together like in the Android case. Otherwise, implementation will remain
|
| - * null which means communication must happen over the bridge.
|
| - *
|
| - * @type {*}
|
| - */
|
| - var implementation = null;
|
| - if (typeof(cvox.ApiImplementation) != 'undefined') {
|
| - implementation = cvox.ApiImplementation;
|
| - }
|
| -
|
| -
|
| - /**
|
| - * @constructor
|
| - */
|
| - cvox.Api = function() {
|
| - };
|
| -
|
| - /**
|
| - * Internal-only function, only to be called by the content script.
|
| - * Enables the API and connects to the content script.
|
| - */
|
| - cvox.Api.internalEnable = function() {
|
| - isActive = true;
|
| - maybeEnableMathJaX();
|
| - if (!implementation) {
|
| - connect_();
|
| - }
|
| - var event = document.createEvent('UIEvents');
|
| - event.initEvent('chromeVoxLoaded', true, false);
|
| - document.dispatchEvent(event);
|
| - };
|
| -
|
| - /**
|
| - * Returns true if ChromeVox is currently running. If the API is available
|
| - * in the JavaScript namespace but this method returns false, it means that
|
| - * the user has (temporarily) disabled ChromeVox.
|
| - *
|
| - * You can listen for the 'chromeVoxLoaded' event to be notified when
|
| - * ChromeVox is loaded.
|
| - *
|
| - * @return {boolean} True if ChromeVox is currently active.
|
| - */
|
| - cvox.Api.isChromeVoxActive = function() {
|
| - if (implementation) {
|
| - return isActive;
|
| - }
|
| - return !!channel;
|
| - };
|
| -
|
| - /**
|
| - * Speaks the given string using the specified queueMode and properties.
|
| - *
|
| - * @param {string} textString The string of text to be spoken.
|
| - * @param {number=} queueMode Valid modes are 0 for flush; 1 for queue.
|
| - * @param {Object=} properties Speech properties to use for this utterance.
|
| - */
|
| - cvox.Api.speak = function(textString, queueMode, properties) {
|
| - if (!cvox.Api.isChromeVoxActive()) {
|
| - return;
|
| - }
|
| -
|
| - if (implementation) {
|
| - implementation.speak(textString, queueMode, properties);
|
| - } else {
|
| - var message = {
|
| - 'cmd': 'speak',
|
| - 'args': [textString, queueMode, properties]
|
| - };
|
| - callSpeakAsync_(message, properties);
|
| - }
|
| - };
|
| -
|
| - /**
|
| - * This method is kept to keep Docs from throwing an error.
|
| - *
|
| - */
|
| - cvox.Api.stop = function() {
|
| - };
|
| -
|
| - cvox.Api.internalEnable();
|
| +/*
|
| + * Private data and methods.
|
| + */
|
| +
|
| +/**
|
| + * The name of the port between the content script and background page.
|
| + * @type {string}
|
| + * @const
|
| + */
|
| +var PORT_NAME = 'cvox.Port';
|
| +
|
| +/**
|
| + * The name of the message between the page and content script that sets
|
| + * up the bidirectional port between them.
|
| + * @type {string}
|
| + * @const
|
| + */
|
| +var PORT_SETUP_MSG = 'cvox.PortSetup';
|
| +
|
| +/**
|
| + * The message between content script and the page that indicates the
|
| + * connection to the background page has been lost.
|
| + * @type {string}
|
| + * @const
|
| + */
|
| +var DISCONNECT_MSG = 'cvox.Disconnect';
|
| +
|
| +/**
|
| + * The channel between the page and content script.
|
| + * @type {MessageChannel}
|
| + */
|
| +var channel;
|
| +
|
| +/**
|
| + * Tracks whether or not the ChromeVox API should be considered active.
|
| + * @type {boolean}
|
| + */
|
| +var isActive = false;
|
| +
|
| +/**
|
| + * The next id to use for async callbacks.
|
| + * @type {number}
|
| + */
|
| +var nextCallbackId = 1;
|
| +
|
| +/**
|
| + * Map from callback ID to callback function.
|
| + * @type {Object<number, function(*)>}
|
| + */
|
| +var callbackMap = {};
|
| +
|
| +/**
|
| + * Internal function to connect to the content script.
|
| + */
|
| +function connect_() {
|
| + if (channel) {
|
| + // If there is already an existing channel, close the existing ports.
|
| + channel.port1.close();
|
| + channel.port2.close();
|
| + channel = null;
|
| + }
|
| +
|
| + channel = new MessageChannel();
|
| + channel.port1.onmessage = function(event) {
|
| + if (event.data == DISCONNECT_MSG) {
|
| + channel = null;
|
| + }
|
| + try {
|
| + var message = JSON.parse(event.data);
|
| + if (message['id'] && callbackMap[message['id']]) {
|
| + callbackMap[message['id']](message);
|
| + delete callbackMap[message['id']];
|
| + }
|
| + } catch (e) {
|
| + }
|
| + };
|
| + window.postMessage(PORT_SETUP_MSG, '*', [channel.port2]);
|
| +}
|
| +
|
| +/**
|
| + * Internal function to send a message to the content script and
|
| + * call a callback with the response.
|
| + * @param {Object} message A serializable message.
|
| + * @param {function(*)} callback A callback that will be called
|
| + * with the response message.
|
| + */
|
| +function callAsync_(message, callback) {
|
| + var id = nextCallbackId;
|
| + nextCallbackId++;
|
| + if (message['args'] === undefined) {
|
| + message['args'] = [];
|
| + }
|
| + message['args'] = [id].concat(message['args']);
|
| + callbackMap[id] = callback;
|
| + channel.port1.postMessage(JSON.stringify(message));
|
| +}
|
| +
|
| +/**
|
| + * Wraps callAsync_ for sending speak requests.
|
| + * @param {Object} message A serializable message.
|
| + * @param {Object=} properties Speech properties to use for this utterance.
|
| + * @private
|
| + */
|
| +function callSpeakAsync_(message, properties) {
|
| + var callback = null;
|
| + /* Use the user supplied callback as callAsync_'s callback. */
|
| + if (properties && properties['endCallback']) {
|
| + callback = properties['endCallback'];
|
| + }
|
| + callAsync_(message, callback);
|
| +}
|
| +
|
| +/**
|
| + * Gets an object given a dotted namespace object path.
|
| + * @param {string} path
|
| + * @return {*}
|
| + */
|
| +function getObjectByName(path) {
|
| + var pieces = path.split('.');
|
| + var resolved = window;
|
| + for (var i = 0; i < pieces.length; i++) {
|
| + resolved = resolved[pieces[i]];
|
| + if (!resolved) {
|
| + return null;
|
| + }
|
| + }
|
| + return resolved;
|
| +}
|
| +
|
| +
|
| +/**
|
| + * Maybe enable MathJaX support.
|
| + */
|
| +function maybeEnableMathJaX() {
|
| + if (!getObjectByName('MathJax.Hub.Register.LoadHook') ||
|
| + !getObjectByName('MathJax.Ajax.Require')) {
|
| + return;
|
| + }
|
| +
|
| + MathJax.Hub.Register.LoadHook('[a11y]/explorer.js', function() {
|
| + // |explorer| is an object instance, so we get it to call an instance
|
| + // |method.
|
| + var explorer = getObjectByName('MathJax.Extension.explorer');
|
| + if (explorer.Enable) {
|
| + explorer.Enable(true, true);
|
| + }
|
| + });
|
| + MathJax.Ajax.Require('[a11y]/explorer.js');
|
| +}
|
| +
|
| +
|
| +/*
|
| + * Public API.
|
| + */
|
| +
|
| +if (!window['cvox']) {
|
| + window['cvox'] = {};
|
| +}
|
| +var cvox = window.cvox;
|
| +
|
| +
|
| +/**
|
| + * ApiImplementation - this is only visible if all the scripts are compiled
|
| + * together like in the Android case. Otherwise, implementation will remain
|
| + * null which means communication must happen over the bridge.
|
| + *
|
| + * @type {*}
|
| + */
|
| +var implementation = null;
|
| +if (typeof(cvox.ApiImplementation) != 'undefined') {
|
| + implementation = cvox.ApiImplementation;
|
| +}
|
| +
|
| +
|
| +/**
|
| + * @constructor
|
| + */
|
| +cvox.Api = function() {};
|
| +
|
| +/**
|
| + * Internal-only function, only to be called by the content script.
|
| + * Enables the API and connects to the content script.
|
| + */
|
| +cvox.Api.internalEnable = function() {
|
| + isActive = true;
|
| + maybeEnableMathJaX();
|
| + if (!implementation) {
|
| + connect_();
|
| + }
|
| + var event = document.createEvent('UIEvents');
|
| + event.initEvent('chromeVoxLoaded', true, false);
|
| + document.dispatchEvent(event);
|
| +};
|
| +
|
| +/**
|
| + * Returns true if ChromeVox is currently running. If the API is available
|
| + * in the JavaScript namespace but this method returns false, it means that
|
| + * the user has (temporarily) disabled ChromeVox.
|
| + *
|
| + * You can listen for the 'chromeVoxLoaded' event to be notified when
|
| + * ChromeVox is loaded.
|
| + *
|
| + * @return {boolean} True if ChromeVox is currently active.
|
| + */
|
| +cvox.Api.isChromeVoxActive = function() {
|
| + if (implementation) {
|
| + return isActive;
|
| + }
|
| + return !!channel;
|
| +};
|
| +
|
| +/**
|
| + * Speaks the given string using the specified queueMode and properties.
|
| + *
|
| + * @param {string} textString The string of text to be spoken.
|
| + * @param {number=} queueMode Valid modes are 0 for flush; 1 for queue.
|
| + * @param {Object=} properties Speech properties to use for this utterance.
|
| + */
|
| +cvox.Api.speak = function(textString, queueMode, properties) {
|
| + if (!cvox.Api.isChromeVoxActive()) {
|
| + return;
|
| + }
|
| +
|
| + if (implementation) {
|
| + implementation.speak(textString, queueMode, properties);
|
| + } else {
|
| + var message = {'cmd': 'speak', 'args': [textString, queueMode, properties]};
|
| + callSpeakAsync_(message, properties);
|
| + }
|
| +};
|
| +
|
| +/**
|
| + * This method is kept to keep Docs from throwing an error.
|
| + *
|
| + */
|
| +cvox.Api.stop = function() {};
|
| +
|
| +cvox.Api.internalEnable();
|
|
|
| })();
|
|
|