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) 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var idGenerator = requireNative('id_generator'); 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var sendRequest = require('sendRequest').sendRequest; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var lazyBG = requireNative('lazy_background_page'); 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)binding.registerCustomHook(function(api) { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var apiFunctions = api.apiFunctions; 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var tts = api.compiledApi; 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) var handlers = {}; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function ttsEventListener(event) { 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) var eventHandler = handlers[event.srcId]; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eventHandler) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eventHandler({ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type: event.type, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charIndex: event.charIndex, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errorMessage: event.errorMessage 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.isFinalEvent) { 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) delete handlers[event.srcId]; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balanced in 'speak' handler. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazyBG.DecrementKeepaliveCount(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This file will get run if an extension needs the ttsEngine permission, but 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it doesn't necessarily have the tts permission. If it doesn't, trying to 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // add a listener to chrome.tts.onEvent will fail. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/122474. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tts.onEvent.addListener(ttsEventListener); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (e) {} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apiFunctions.setHandleRequest('speak', function() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var args = arguments; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (args.length > 1 && args[1] && args[1].onEvent) { 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var id = idGenerator.GetNextId(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args[1].srcId = id; 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) handlers[id] = args[1].onEvent; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep the page alive until the event finishes. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Balanced in eventHandler. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazyBG.IncrementKeepaliveCount(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sendRequest(this.name, args, this.definition.parameters); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.binding = binding.generate(); 58