15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var speakKeyStr;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function speakSelection() {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var focused = document.activeElement;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var selectedText;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focused) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selectedText = focused.value.substring(
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          focused.selectionStart, focused.selectionEnd);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } catch (err) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selectedText == undefined) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var sel = window.getSelection();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var selectedText = sel.toString();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.extension.sendRequest({'speak': selectedText});
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function onExtensionMessage(request) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (request['speakSelection'] != undefined) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!document.hasFocus()) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    speakSelection();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (request['key'] != undefined) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    speakKeyStr = request['key'];
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function initContentScript() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.extension.onRequest.addListener(onExtensionMessage);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome.extension.sendRequest({'init': true}, onExtensionMessage);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document.addEventListener('keydown', function(evt) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!document.hasFocus()) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var keyStr = keyEventToString(evt);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (keyStr == speakKeyStr && speakKeyStr.length > 0) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      speakSelection();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      evt.stopPropagation();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      evt.preventDefault();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, false);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)initContentScript();
57