1
/* See license.txt for terms of usage */
3
// UI control of debug Logging for Firebug internals
5
FBL.ns(function() { with (FBL) {
7
//***********************************************************************************
9
const Cc = Components.classes;
10
const Ci = Components.interfaces;
11
const PrefService = Cc["@mozilla.org/preferences-service;1"];
12
const nsIPrefBranch2 = Ci.nsIPrefBranch2;
13
const prefs = PrefService.getService(nsIPrefBranch2);
14
const nsIPrefService = Ci.nsIPrefService;
15
const prefService = PrefService.getService(nsIPrefService);
16
const prefDomain = "extensions.firebug";
18
this.namespaceName = "TracePanel";
20
Firebug.TraceModule = extend(Firebug.Console,
22
// These will appear as options in FBTrace panel, with the DBG_ removed.
23
// Also add extension.firebug.BP etc to defaults/preferences/chromebug.js if you want persistence.
24
DBG_BP: false, // debugger.js and firebug-services.js; lots of output
25
DBG_CSS: false, // CSS panel or css stuff
26
DBG_CACHE: false, // sourceCache
27
DBG_CONSOLE: false, // console
28
DBG_DISPATCH: false, // lib.dispatch
29
DBG_DOM: false, // includes domplate
30
DBG_DBG2FIREBUG: false, // put trace output to Firebug console
31
DBG_ERRORS: false, // error.js
32
DBG_EVENTS: false, // debugger.js for event handlers, need more
33
DBG_EVAL: false, // debugger.js and firebug-service.js
34
DBG_FUNCTION_NAMES: false, // heuristics for anon functions
35
DBG_INSPECT: false, // inspector.js
36
DBG_INITIALIZE: false, // registry (modules panels); initialize FB
37
DBG_HTML: false, // HTML panel
38
DBG_LINETABLE: false, // lib.js creating line tables.
39
DBG_NET: false, // net.js
41
DBG_PANELS: false, // panel selection.
42
DBG_SHOW_SYSTEM: false, // isSystemURL return false always.
43
DBG_SOURCEFILES: false, // debugger and sourceCache
44
DBG_STACK: false, // call stack, mostly debugger.js
45
DBG_TOPLEVEL: false, // firebug-service
46
DBG_UI_LOOP: false, // debugger.js
47
DBG_WINDOWS: false, // tabWatcher, dispatch events; very useful for understand modules/panels
48
DBG_FBS_CREATION: false, // firebug-service script creation
49
DBG_FBS_SRCUNITS: false, // firebug-service compilation units
50
DBG_FBS_STEP: false, // firebug-service stepping
51
DBG_FBS_FUNCTION: false, // firebug-service new Function
52
DBG_FBS_BP: false, // firebug-service breakpoints
53
DBG_FBS_ERRORS: false, // firebug-service error handling
54
DBG_FBS_FINDDEBUGGER: false, // firebug-service routing calls to debug windows
55
DBG_FBS_FF_START: false, // firebug-service trace from start of firefox
56
DBG_FBS_FLUSH: false, // firebug-service flush to see crash point
57
DBG_FBS_JSDCONTEXT: false, // firebug-service dump contexts
59
debug: this.DBG_OPTIONS,
61
injectOptions: function()
63
if (this.debug) FBTrace.sysout("TraceModule.injectOptions\n");
66
var m = reDBG.exec(p);
72
initialize: function(prefDomain, prefNames)
74
if (this.debug) FBTrace.sysout("TraceModule.initialize prefDomain="+prefDomain+"\n");
78
var f = reDBG_FBS.exec(p);
81
FBTrace[p] = Firebug.getPref("extensions.firebug-service", p);
83
FBTrace.sysout("TraceModule.initialize extensions.firebug-service."+p+"="+FBTrace[p]+"\n");
87
var m = p.indexOf("DBG_");
89
FBTrace[p] = Firebug.getPref(prefDomain, p); // set to 'true' to turn on all traces;
91
FBTrace.sysout("TraceModule.initialize "+prefDomain+"."+p+"="+FBTrace[p]+"\n");
94
prefs.setBoolPref("browser.dom.window.dump.enabled", true);
95
prefs.addObserver("extensions", this, false);
98
observe: function(subject, topic, data)
100
var m = reDBG.exec(data);
103
var prefDomain = "extensions."+m[1];
104
this.resetOption(prefDomain, m[2]);
107
FBTrace.sysout("TraceFirebug.panel observe data: "+data+"\n");
110
updateOption: function(name, value)
112
this.debug = FBTrace.DBG_OPTIONS;
114
FBTrace.sysout("TraceFirebug.panel updateOption this.debug="+this.debug+" name:"+name+" value:"+value+"\n");
117
resetOption: function(prefDomain, optionName)
119
if (!FBTrace) // we get called in a weird scope
123
FBTrace[optionName] = Firebug.getPref(prefDomain, optionName);
125
FBTrace.sysout("tracePanel.resetOption set FBTrace."+optionName+" to "+FBTrace[optionName]+" using prefDomain:"+prefDomain+"\n");
129
FBTrace.sysout("tracePanel.resetOption "+optionName+" is not an option; not set in defaults/prefs.js?\n");
133
watchWindow: function(context, win)
135
// Don't call the predecessor
136
// Firebug.Console module injects loadFirebugConsole method into the current-page.
137
// It shouldn't be done twice.
140
initContext: function(context)
143
FBTrace.sysout("TraceModule.initContext try sysout\n");
144
this.context = context;
147
getPanel: function(context, noCreate)
149
return context ? context.getPanel("TraceFirebug", noCreate) : this.context.getPanel("TraceFirebug", noCreate);
152
showPanel: function(browser, panel)
154
if (!panel || panel.name != "TraceFirebug")
157
if (this.debug) FBTrace.sysout("TraceModule showPanel module:\n");
160
logInfoOnce: function(obj, context, rep)
162
if (!FBTrace.avoidRecursion)
164
var noThrottle = true;
165
FBTrace.avoidRecursion = true;
167
Firebug.TraceModule.log(obj, context, "info", rep, noThrottle);
171
dump("avoided recursion \n");
173
FBTrace.avoidRecursion = false;
176
logRow: function(appender, objects, context, className, rep, sourceLink, noThrottle, noRow)
179
context = FirebugContext;
180
var panel = this.getPanel(context);
181
return panel.append(appender, objects, className, rep, sourceLink, noRow);
186
// ************************************************************************************************
188
Firebug.TracePanel = function() {};
189
const reDBG = /extensions\.([^\.]*)\.(DBG_.*)/;
190
const reDBG_FBS = /DBG_FBS_(.*)/;
191
Firebug.TracePanel.prototype = extend(Firebug.ConsolePanel.prototype,
193
name: "TraceFirebug",
197
debug: Firebug.TraceModule.DBG_OPTIONS,
199
initializeNode: function(myPanelNode)
201
if (this.debug) FBTrace.sysout("TracePanel initializeNode\n");
202
var options = this.getOptionsMenuItems();
204
var numbers_of_columns = 6;
205
var number_of_rows = Math.round((options.length / numbers_of_columns));
207
for (var i = 0; i < options.length; i++)
209
var depth = i % number_of_rows;
212
var optionsColumn = this.document.createElement("div");
213
setClass(optionsColumn, "FBTraceColumn");
214
myPanelNode.appendChild(optionsColumn);
217
var button = this.document.createElement("button");
218
setClass(button, "FBTraceOption");
219
button.innerHTML = options[i].label;
220
setItemIntoElement(button, options[i]);
221
optionsColumn.appendChild(button);
222
button.addEventListener("click", options[i].command, false);
224
prefs.addObserver("extensions", { observe: bind(this.observePrefs, this)}, false);
227
observePrefs: function(subject, topic, data)
229
var m = reDBG.exec(data);
232
this.updateButtons();
236
show: function(state)
238
if (this.debug) FBTrace.sysout("TraceFirebug.panel show context="+this.context+"\n");
239
var consoleButtons = this.context.browser.chrome.$("fbConsoleButtons");
240
collapse(consoleButtons, false);
242
this.updateButtons(state);
243
// TODO update options based on state to make tracing per-page
246
updateButtons: function()
248
var buttons = this.panelNode.getElementsByTagName("button");
249
for (var i = 0; i < buttons.length; i++)
251
var label = buttons[i].getAttribute("label");
252
var prop = "DBG_"+label;
253
if (FBTrace.hasOwnProperty(prop))
255
var optionOn = FBTrace[prop];
256
//FBTrace.sysout("tracePanel.show label: "+label+" optionOn: "+optionOn+"\n");
257
buttons[i].setAttribute("checked", optionOn);
264
if (this.debug) FBTrace.dumpStack("TraceFirebug.panel hide\n");
265
if (this.context && this.context.browser)
267
var consoleButtons = this.context.browser.chrome.$("fbConsoleButtons");
268
collapse(consoleButtons, true);
272
watchWindow: function(win)
274
if (this.debug) FBTrace.sysout("TraceFirebug.panel watchWindow\n");
277
unwatchWindow: function(win)
279
if (this.debug) FBTrace.sysout("TraceFirebug.panel unwatchWindow\n");
280
var errorWin = fbs.lastErrorWindow;
282
FBTrace.sysout("tracePanel had to clear lastErrorWindow <*><*><*><*>\n");
286
updateSelection: function(object)
288
if (this.debug) FBTrace.sysout("TraceFirebug.panel updateSelection\n");
291
getObjectPath: function(object)
293
if (this.debug) FBTrace.sysout("TraceFirebug.panel getObjectPath\n");
294
return TabWatcher.contexts;
297
getDefaultSelection: function()
299
if (this.debug) FBTrace.sysout("TraceFirebug.panel getDefaultSelection\n");
302
getOptionsMenuItems: function()
304
if (this.debug) FBTrace.sysout("TraceFirebug.panel getOptionsMenuItems for this.context="+this.context+"\n");
310
var m = p.indexOf("DBG_");
313
var label = p.substr(4);
319
command: this.setOption
326
setOption: function(event)
328
var menuitem = event.target;
329
var label = menuitem.getAttribute("label");
330
var category = 'DBG_'+label;
331
FBTrace[category] = !FBTrace[category];
332
menuitem.checked = FBTrace[category];
334
if (category.indexOf("_FBS_") == -1)
336
var prefDomain = Firebug.prefDomain;
337
Firebug.setPref(Firebug.prefDomain, category, FBTrace[category] );
338
prefService.savePrefFile(null);
342
var prefDomain = "extensions.firebug-service";
343
prefs.setBoolPref(prefDomain+"."+category, FBTrace[category]);
344
prefService.savePrefFile(null);
347
if (FBTrace.DBG_OPTIONS)
348
FBTrace.sysout("tracePanel.setOption: "+prefDomain+"."+category+ " = " + FBTrace[category] + "\n");
352
getContextMenuItems: function(object, target)
354
if (this.debug) FBTrace.sysout("TraceFirebug.panel getContextMenuItems\n");
357
getEditor: function(target, value)
359
if (this.debug) FBTrace.sysout("TraceFirebug.panel getEditor\n");
364
Firebug.TraceModule.injectOptions();
365
Firebug.registerModule(Firebug.TraceModule);
366
Firebug.registerPanel(Firebug.TracePanel);