1/*
2 * Content script for Chrome Sounds.
3 * Tracks in-page events and notifies the background page.
4 */
5
6function sendEvent(event, value) {
7  console.log("sendEvent: " + event + "," + value);
8  chrome.extension.sendRequest({eventName: event, eventValue: value});
9}
10
11// Timers to trigger "stopEvent" for coalescing events.
12var timers = {};
13
14function stopEvent(type) {
15  timers[type] = 0;
16  sendEvent(type, "stopped");
17}
18
19// Automatically coalesces repeating events into a start and a stop event.
20// |validator| is a function which should return true if the event is
21// considered to be a valid event of this type.
22function handleEvent(event, type, validator) {
23  if (validator) {
24    if (!validator(event)) {
25      return;
26    }
27  }
28  var timerId = timers[type];
29  var eventInProgress = (timerId > 0);
30  if (eventInProgress) {
31    clearTimeout(timerId);
32    timers[type] = 0;
33  } else {
34    sendEvent(type, "started");
35  }
36  timers[type] = setTimeout(stopEvent, 300, type);
37}
38
39function listenAndCoalesce(target, type, validator) {
40  target.addEventListener(type, function(event) {
41    handleEvent(event, type, validator);
42  }, true);
43}
44
45listenAndCoalesce(document, "scroll");
46
47// For some reason, "resize" doesn't seem to work with addEventListener.
48if ((window == window.top) && document.body && !document.body.onresize) {
49  document.body.onresize = function(event) {
50    sendEvent("resize", "");
51  };
52}
53
54listenAndCoalesce(document, "keypress", function(event) {
55  if (event.charCode == 13)
56    return false;
57
58  // TODO(erikkay) This doesn't work in gmail's rich text compose window.
59  return event.target.tagName == "TEXTAREA" ||
60         event.target.tagName == "INPUT" ||
61         event.target.isContentEditable;
62});
63