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