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 Bridge that sends TTS messages from content scripts or 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * other pages to the main background page. 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.provide('cvox.ChromeTts'); 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.require('cvox.ChromeTtsBase'); 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.require('cvox.HostFactory'); 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @constructor 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @extends {cvox.ChromeTtsBase} 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts = function() { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) goog.base(this); 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.addBridgeListener(); 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)goog.inherits(cvox.ChromeTts, cvox.ChromeTtsBase); 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Current call id, used for matching callback functions. 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @type {number} 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.callId = 1; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Maps call ids to callback functions. 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @type {Object.<number, Function>} 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.functionMap = new Object(); 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */ 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.speak = function(textString, queueMode, properties) { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!properties) { 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) properties = {}; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) goog.base(this, 'speak', textString, queueMode, properties); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ExtensionBridge.send( 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.createMessageForProperties_(textString, queueMode, properties)); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */ 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.isSpeaking = function() { 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeTts.superClass_.isSpeaking.call(this); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */ 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.stop = function() { 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeTts.superClass_.stop.call(this); 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ExtensionBridge.send( 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {'target': 'TTS', 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'action': 'stop'}); 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** @override */ 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.increaseOrDecreaseProperty = 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) function(propertyName, increase) { 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ExtensionBridge.send( 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {'target': 'TTS', 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'action': 'increaseOrDecrease', 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'property': propertyName, 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'increase': increase}); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Increases a TTS speech property. 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {string} property_name The name of the property to increase. 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {boolean} announce Whether to announce that the property is 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * changing. 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.increaseProperty = function(property_name, announce) { 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) goog.base(this, 'increaseProperty', property_name, announce); 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ExtensionBridge.send( 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) {'target': 'TTS', 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'action': 'increase' + property_name, 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'announce': announce}); 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Listens for TTS_COMPLETED message and executes the callback function. 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.addBridgeListener = function() { 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ExtensionBridge.addMessageListener( 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) function(msg, port) { 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var message = msg['message']; 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (message == 'TTS_CALLBACK') { 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var id = msg['id']; 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var func = cvox.ChromeTts.functionMap[id]; 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (func != undefined) { 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) func(); 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delete cvox.ChromeTts.functionMap[id]; 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Creates a message suitable for sending as a speak action to background tts. 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {string} textString The string of text to be spoken. 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {number=} queueMode The queue mode: cvox.AbstractTts.QUEUE_MODE_FLUSH, 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * for flush, cvox.AbstractTts.QUEUE_MODE_QUEUE for adding to queue. 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @param {Object=} properties Speech properties to use for this utterance. 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @return {Object} A message. 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * @private 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.ChromeTts.prototype.createMessageForProperties_ = 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) function(textString, queueMode, properties) { 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var message = {'target': 'TTS', 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'action': 'speak', 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'text': textString, 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'queueMode': queueMode, 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 'properties': properties}; 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (properties['startCallback'] != undefined) { 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeTts.functionMap[cvox.ChromeTts.callId] = 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) properties['startCallback']; 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message['startCallbackId'] = cvox.ChromeTts.callId++; 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (properties['endCallback'] != undefined) { 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cvox.ChromeTts.functionMap[cvox.ChromeTts.callId] = 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) properties['endCallback']; 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message['endCallbackId'] = cvox.ChromeTts.callId++; 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return message; 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)cvox.HostFactory.ttsConstructor = cvox.ChromeTts; 138