blob: af46de469f1e0cbeacd9eb4e3e07c23ad762591d [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// This Firefox add-on exposes the Javascript console contents to Javascript
// running in the browser. Once this is installed there will be a new
// window.ConsoleCollector object with read() and clear() functions.
var ConsoleCollector = {};
(function() {
// An array for collecting the messages.
var messages = [];
// Add a console message to the collection.
this.add = function(message) {
messages.push(message);
};
// Read the message collection. As a side effect we clear the message list.
this.read = function(type) {
var rtn = [];
for (var i = 0; i < messages.length; i++) {
var message = messages[i];
if (message.errorMessage) {
rtn.push({ 'time' : message.timeStamp,
'source' : message.sourceName,
'line': message.lineNumber,
'column': message.columnNumber,
'category': message.category,
'message' : message.errorMessage });
}
}
messages = [];
return rtn;
};
// Clear the message list.
this.clear = function() {
messages = [];
};
}).apply(ConsoleCollector);
// A Console Listener.
// See https://developer.mozilla.org/en-US/docs/Console_service for
// details.
(function() {
var consoleService;
var consoleListener = {
observe: function(e) {
try {
var message = e.QueryInterface(Components.interfaces.nsIScriptError);
ConsoleCollector.add(message);
} catch (exception) {
ConsoleCollector.add(e);
}
},
QueryInterface: function (iid) {
if (!iid.equals(Components.interfaces.nsIConsoleListener) &&
!iid.equals(Components.interfaces.nsISupports)) {
throw Components.results.NS_ERROR_NO_INTERFACE;
}
return this;
}
};
// Start collecting console messages.
function initialize(event) {
consoleService = Components.classes['@mozilla.org/consoleservice;1']
.getService(Components.interfaces.nsIConsoleService);
if (consoleService) {
consoleService.registerListener(consoleListener);
}
// Add the handler for hooking in to each page's DOM. This handler
// is for each "gBrowser", representing a tab/window.
window.getBrowser().addEventListener("load", onPageLoad, true);
}
// Stop collecting console messages.
function shutdown(event) {
window.getBrowser().removeEventListener("load", onPageLoad);
consoleService.unregisterListener(consoleListener);
ConsoleCollector.clear();
}
// Hook the ConsoleCollector into the DOM as window.ConsoleCollector.
var onPageLoad = function(e) {
var win = e.originalTarget.defaultView;
if (win) {
win.wrappedJSObject.ConsoleCollector = ConsoleCollector;
}
};
// Add the handlers to initialize the add-on and shut it down.
// These handlers are for the application as a whole.
window.addEventListener('load', initialize, false);
window.addEventListener('unload', shutdown, false);
}());