// 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); | |
}()); | |