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