1 /* See license.txt for terms of usage */
  2 
  3 define([
  4     "firebug/lib/object",
  5     "firebug/firebug",
  6     "firebug/lib/trace",
  7     "firebug/lib/events",
  8     "firebug/lib/locale",
  9 ],
 10 function(Obj, Firebug, FBTrace, Events, Locale) {
 11 
 12 // ********************************************************************************************* //
 13 // EventMonitor Module
 14 
 15 var EventMonitor = Obj.extend(Firebug.Module,
 16 {
 17     dispatchName: "eventMonitor",
 18 
 19     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 20     // Module
 21 
 22     destroyContext: function(context, persistedState)
 23     {
 24         // Clean up all existing monitors.
 25         var eventsMonitored = context.eventsMonitored;
 26         if (eventsMonitored)
 27         {
 28             for (var i=0; i<eventsMonitored.length; ++i)
 29             {
 30                 var m = eventsMonitored[i];
 31 
 32                 if (!m.type)
 33                     Events.detachAllListeners(m.object, context.onMonitorEvent, context);
 34                 else
 35                     Events.removeEventListener(m.object, m.type, context.onMonitorEvent, false);
 36             }
 37         }
 38     },
 39 
 40     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 41     // Event Monitor
 42 
 43     toggleMonitorEvents: function(object, types, state, context)
 44     {
 45         if (state)
 46             this.unmonitorEvents(object, types, context);
 47         else
 48             this.monitorEvents(object, types, context);
 49     },
 50 
 51     monitorEvents: function(object, types, context)
 52     {
 53         if (object && object.addEventListener)
 54         {
 55             if (!context.onMonitorEvent)
 56             {
 57                 var self = this;
 58                 context.onMonitorEvent = function(event) {
 59                     self.onMonitorEvent(event, context);
 60                 };
 61             }
 62 
 63             if (!context.eventsMonitored)
 64                 context.eventsMonitored = [];
 65 
 66             var eventTypes = getMonitoredEventTypes(types);
 67 
 68             if (FBTrace.DBG_EVENTS)
 69                 FBTrace.sysout("EventMonitor.monitorEvents", eventTypes);
 70 
 71             for (var i = 0; i < eventTypes.length; ++i)
 72             {
 73                 if (!this.areEventsMonitored(object, eventTypes[i], context))
 74                 {
 75                     Events.addEventListener(object, eventTypes[i], context.onMonitorEvent, false);
 76                     context.eventsMonitored.push({object: object, type: eventTypes[i]});
 77                 }
 78             }
 79         }
 80     },
 81 
 82     unmonitorEvents: function(object, types, context)
 83     {
 84         var eventsMonitored = context.eventsMonitored;
 85         var eventTypes = getMonitoredEventTypes(types);
 86 
 87         if (FBTrace.DBG_EVENTS)
 88             FBTrace.sysout("EventMonitor.unmonitorEvents", eventTypes);
 89 
 90         for (var i = 0; i < eventTypes.length; ++i)
 91         {
 92             for (var j = 0; j < eventsMonitored.length; ++j)
 93             {
 94                 if (eventsMonitored[j].object == object && eventsMonitored[j].type == eventTypes[i])
 95                 {
 96                     eventsMonitored.splice(j, 1);
 97 
 98                     Events.removeEventListener(object, eventTypes[i], context.onMonitorEvent, false);
 99                     break;
100                 }
101             }
102         }
103     },
104 
105     areEventsMonitored: function(object, types, context)
106     {
107         var eventsMonitored = context.eventsMonitored;
108         if (!eventsMonitored)
109         {
110             if (FBTrace.DBG_EVENTS)
111                 FBTrace.sysout("EventMonitor.areEventsMonitored - No events monitored", object);
112 
113             return false;
114         }
115 
116         if (!types)
117             var eventTypes = Events.getEventTypes();
118         else
119             var eventTypes = typeof types == "string" ? [types] : types;
120 
121         for (var i = 0; i < eventTypes.length; ++i)
122         {
123             var monitored = false;
124             for (var j = 0; j < eventsMonitored.length; ++j)
125             {
126                 if (eventsMonitored[j].object == object && eventsMonitored[j].type == eventTypes[i])
127                 {
128                     monitored = true;
129                     break;
130                 }
131             }
132 
133             if (!monitored)
134             {
135                 if (FBTrace.DBG_EVENTS)
136                 {
137                     FBTrace.sysout("EventMonitor.areEventsMonitored - Events not monitored for '" +
138                         eventTypes[i] + "'");
139                 }
140 
141                 return false;
142             }
143             else
144             {
145                 if (FBTrace.DBG_EVENTS)
146                 {
147                     FBTrace.sysout("EventMonitor.areEventsMonitored - Events monitored for '" +
148                         eventTypes[i] + "'");
149                 }
150             }
151         }
152 
153         return true;
154     },
155 
156     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
157     // Logging
158 
159     onMonitorEvent: function(event, context)
160     {
161         var obj = new EventMonitor.EventLog(event);
162         Firebug.Console.log(obj, context);
163     }
164 });
165 
166 // ********************************************************************************************* //
167 
168 EventMonitor.EventLog = function(event)
169 {
170     this.event = event;
171 }
172 
173 // ********************************************************************************************* //
174 // Helpers
175 
176 function getMonitoredEventTypes(types)
177 {
178     var eventTypes = [];
179     if (!types)
180     {
181         eventTypes = Events.getEventTypes();
182     }
183     else
184     {
185         if (typeof types == "string")
186         {
187             eventTypes = Events.isEventFamily(types) ? Events.getEventTypes(types) : [types];
188         }
189         else
190         {
191             for (var i = 0; i < types.length; ++i)
192             {
193                 if (Events.isEventFamily(types[i]))
194                 {
195                     var familyEventTypes = Events.getEventTypes(types[i]);
196                     for (var j = 0; j < familyEventTypes.length; ++j)
197                         eventTypes.push(familyEventTypes[j]);
198                 }
199                 else
200                 {
201                     eventTypes.push(types[i]);
202                 }
203             }
204         }
205     }
206 
207     return eventTypes;
208 }
209 
210 // ********************************************************************************************* //
211 // CommandLine Support
212 
213 function monitorEvents(context, args)
214 {
215     var object = args[0];
216     var types = args[1];
217 
218     EventMonitor.monitorEvents(object, types, context);
219     return Firebug.Console.getDefaultReturnValue(context.window);
220 }
221 
222 function unmonitorEvents(context, args)
223 {
224     var object = args[0];
225     var types = args[1];
226 
227     EventMonitor.unmonitorEvents(object, types, context);
228     return Firebug.Console.getDefaultReturnValue(context.window);
229 }
230 
231 // ********************************************************************************************* //
232 // Registration
233 
234 Firebug.registerModule(EventMonitor);
235 
236 Firebug.registerCommand("monitorEvents", {
237     handler: monitorEvents.bind(this),
238     helpUrl: "http://getfirebug.com/wiki/index.php/monitorEvents",
239     description: Locale.$STR("console.cmd.help.monitorEvents")
240 })
241 
242 Firebug.registerCommand("unmonitorEvents", {
243     handler: unmonitorEvents.bind(this),
244     helpUrl: "http://getfirebug.com/wiki/index.php/unmonitorEvents",
245     description: Locale.$STR("console.cmd.help.unmonitorEvents")
246 })
247 
248 return EventMonitor;
249 
250 // ********************************************************************************************* //
251 });
252