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