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