15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Custom binding for the tts API. 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var binding = require('binding').Binding.create('tts'); 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var ttsNatives = requireNative('tts'); 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var GetNextTTSEventId = ttsNatives.GetNextTTSEventId; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var sendRequest = require('sendRequest').sendRequest; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var lazyBG = requireNative('lazy_background_page'); 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)binding.registerCustomHook(function(api) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var apiFunctions = api.apiFunctions; 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var tts = api.compiledApi; 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) var handlers = {}; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function ttsEventListener(event) { 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) var eventHandler = handlers[event.srcId]; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eventHandler) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eventHandler({ 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type: event.type, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charIndex: event.charIndex, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errorMessage: event.errorMessage 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.isFinalEvent) { 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) delete handlers[event.srcId]; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balanced in 'speak' handler. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazyBG.DecrementKeepaliveCount(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This file will get run if an extension needs the ttsEngine permission, but 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it doesn't necessarily have the tts permission. If it doesn't, trying to 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // add a listener to chrome.tts.onEvent will fail. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/122474. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tts.onEvent.addListener(ttsEventListener); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (e) {} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apiFunctions.setHandleRequest('speak', function() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var args = arguments; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (args.length > 1 && args[1] && args[1].onEvent) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var id = GetNextTTSEventId(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args[1].srcId = id; 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) handlers[id] = args[1].onEvent; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep the page alive until the event finishes. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balanced in eventHandler. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazyBG.IncrementKeepaliveCount(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sendRequest(this.name, args, this.definition.parameters); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.binding = binding.generate(); 59