15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Content script for Chrome Sounds. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Tracks in-page events and notifies the background page. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function sendEvent(event, value) { 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) console.log("sendEvent: " + event + "," + value); 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.extension.sendRequest({eventName: event, eventValue: value}); 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Timers to trigger "stopEvent" for coalescing events. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var timers = {}; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function stopEvent(type) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timers[type] = 0; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sendEvent(type, "stopped"); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Automatically coalesces repeating events into a start and a stop event. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |validator| is a function which should return true if the event is 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// considered to be a valid event of this type. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function handleEvent(event, type, validator) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (validator) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!validator(event)) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var timerId = timers[type]; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var eventInProgress = (timerId > 0); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (eventInProgress) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clearTimeout(timerId); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timers[type] = 0; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sendEvent(type, "started"); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) timers[type] = setTimeout(stopEvent, 300, type); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function listenAndCoalesce(target, type, validator) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target.addEventListener(type, function(event) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handleEvent(event, type, validator); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, true); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)listenAndCoalesce(document, "scroll"); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For some reason, "resize" doesn't seem to work with addEventListener. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if ((window == window.top) && document.body && !document.body.onresize) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document.body.onresize = function(event) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sendEvent("resize", ""); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)listenAndCoalesce(document, "keypress", function(event) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.charCode == 13) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erikkay) This doesn't work in gmail's rich text compose window. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event.target.tagName == "TEXTAREA" || 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.target.tagName == "INPUT" || 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.target.isContentEditable; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}); 63