(function(){
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const Cr = Components.results;
// Get this in a way where we can load the page automatically
// where it doesn't need to be focused...
var homeWindow = Cc["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher)
.activeWindow;
var consoleService = Cc["@mozilla.org/consoleservice;1"]
.getService(Components.interfaces.nsIConsoleService);
var extensionManager = Cc["@mozilla.org/extensions/manager;1"]
.getService(Ci.nsIExtensionManager);
var Utils = {
// ___ Windows and Tabs
get activeWindow(){
var win = Cc["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Ci.nsIWindowWatcher)
.activeWindow;
if( win != null ) return win;
else return homeWindow;
},
get activeTab(){
var tabBrowser = this.activeWindow.gBrowser;
return tabBrowser.selectedTab;
},
get homeTab(){
for( var i=0; i')
.appendTo("head");
$('')
.appendTo("body");
var args = arguments;
(function(){
var fb = window.firebug;
if(fb && fb.version){
fb.init();
fb.win.setHeight(100);
fb.d.console.cmd.log.apply(null, args);
}
else{setTimeout(arguments.callee);}
})();
},
log: function() { // pass as many arguments as you want, it'll print them all
var text = this.expandArgumentsForLog(arguments);
consoleService.logStringMessage(text);
},
error: function() { // pass as many arguments as you want, it'll print them all
var text = this.expandArgumentsForLog(arguments);
Cu.reportError('tabcandy error: ' + text);
},
trace: function() { // pass as many arguments as you want, it'll print them all
var text = this.expandArgumentsForLog(arguments);
if(typeof(printStackTrace) != 'function')
this.log(text + ' trace: you need to include stacktrace.js');
else {
var calls = printStackTrace();
calls.splice(0, 3); // Remove this call and the printStackTrace calls
this.log('trace: ' + text + '\n' + calls.join('\n'));
}
},
assert: function(label, condition) {
if(!condition) {
var text = 'tabcandy assert: ' + label;
if(typeof(printStackTrace) == 'function') {
var calls = printStackTrace();
text += '\n' + calls[3];
}
Cu.reportError(text);
}
},
expandObject: function(obj) {
var s = obj + ' = {';
for(prop in obj) {
var value = obj[prop];
s += prop + ": "
+ (typeof(value) == 'string' ? '\'' : '')
+ value
+ (typeof(value) == 'string' ? '\'' : '')
+ ", ";
}
return s + '}';
},
expandArgumentsForLog: function(args) {
var s = '';
var count = args.length;
var a;
for(a = 0; a < count; a++) {
var arg = args[a];
if(typeof(arg) == 'object')
arg = this.expandObject(arg);
s += arg;
if(a < count - 1)
s += '; ';
}
return s;
},
testLogging: function() {
this.log('beginning logging test');
this.error('this is an error');
this.trace('this is a trace');
this.log(1, null, {'foo': 'hello', 'bar': 2}, 'whatever');
this.log('ending logging test');
},
// ___ Event
isRightClick: function(event) {
if(event.which)
return (event.which == 3);
else if(event.button)
return (event.button == 2);
return false;
},
// ___ Time
getMilliseconds: function() {
var date = new Date();
return date.getTime();
},
// ___ Misc
isJQuery: function(object) {
// TODO: need more robust way
return (object && typeof(object.fadeIn) == 'function' ? true : false);
}
};
window.Utils = Utils;
})();