forked from mozilla/chromeless
/
console-service.js
61 lines (55 loc) · 1.66 KB
/
console-service.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
let {Cc, Ci} = require("chrome");
var cService = Cc['@mozilla.org/consoleservice;1'].getService()
.QueryInterface(Ci.nsIConsoleService);
function Listener(cb) {
this._cb = cb;
cService.registerListener(this);
}
Listener.prototype = {
remove: function() {
cService.unregisterListener(this);
},
observe: function(object) {
var newObj = new Object();
try {
var scriptError = object.QueryInterface(Ci.nsIScriptError);
newObj.isWarning = (scriptError.flags &
Ci.nsIScriptError.warningFlag) != 0;
newObj.isStrictWarning = (scriptError.flags &
Ci.nsIScriptError.strictFlag) != 0;
newObj.isException = (scriptError.flags &
Ci.nsIScriptError.exceptionFlag) != 0;
newObj.isError = (!(newObj.isWarning || newObj.isStrictWarning));
newObj.message = scriptError.errorMessage;
["category", "lineNumber", "sourceName", "sourceLine",
"columnNumber"].forEach(
function(propName) {
newObj[propName] = scriptError[propName];
});
} catch (e) {
try {
newObj.message = object.QueryInterface(Ci.nsIConsoleMessage)
.message;
} catch (e) {
newObj.message = object.toString();
}
}
try {
this._cb.call(undefined, newObj);
} catch (e) {
console.exception(e);
}
}
};
var listeners = [];
exports.addListener = function addListener(cb) {
listeners.push(new Listener(cb));
};
require("unload").when(
function() {
listeners.forEach(
function(listener) {
listener.remove();
});
listeners = [];
});