From 76cb0a48f91e1b0d3af22e379a7fbe4c8f872f8c Mon Sep 17 00:00:00 2001 From: Dave Townsend Date: Mon, 26 Apr 2010 12:14:19 -0700 Subject: [PATCH] Bug 553112: Add a shared module for add-ons manager logging. r=robstrong --- toolkit/mozapps/extensions/AddonLogging.jsm | 137 ++++++++++++++++++ toolkit/mozapps/extensions/AddonManager.jsm | 35 +---- .../mozapps/extensions/AddonUpdateChecker.jsm | 35 +---- toolkit/mozapps/extensions/Makefile.in | 1 + toolkit/mozapps/extensions/PluginProvider.jsm | 35 +---- toolkit/mozapps/extensions/XPIProvider.jsm | 35 +---- .../extensions/amWebInstallListener.js | 18 +-- 7 files changed, 174 insertions(+), 122 deletions(-) create mode 100644 toolkit/mozapps/extensions/AddonLogging.jsm diff --git a/toolkit/mozapps/extensions/AddonLogging.jsm b/toolkit/mozapps/extensions/AddonLogging.jsm new file mode 100644 index 000000000000..c88c13b487b4 --- /dev/null +++ b/toolkit/mozapps/extensions/AddonLogging.jsm @@ -0,0 +1,137 @@ +/* +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Extension Manager. +# +# The Initial Developer of the Original Code is +# the Mozilla Foundation. +# Portions created by the Initial Developer are Copyright (C) 2010 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Dave Townsend +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** +*/ + +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cr = Components.results; + +const KEY_PROFILEDIR = "ProfD"; +const FILE_EXTENSIONS_LOG = "extensions.log"; + +Components.utils.import("resource://gre/modules/FileUtils.jsm"); +Components.utils.import("resource://gre/modules/Services.jsm"); + +var EXPORTED_SYMBOLS = [ "LogManager" ]; + +var gDebugLogEnabled = false; + +function formatLogMessage(aType, aName, aStr) { + return aType.toUpperCase() + " " + aName + ": " + aStr; +} + +function AddonLogger(aName) { + this.name = aName; +} + +AddonLogger.prototype = { + name: null, + + error: function(aStr) { + let message = formatLogMessage("error", this.name, aStr); + + let consoleMessage = Cc["@mozilla.org/scripterror;1"]. + createInstance(Ci.nsIScriptError); + consoleMessage.init(message, null, null, 0, 0, Ci.nsIScriptError.errorFlag, + "component javascript"); + Services.console.logMessage(consoleMessage); + + if (gDebugLogEnabled) + dump("*** " + message + "\n"); + + try { + var tstamp = new Date(); + var logfile = FileUtils.getFile(KEY_PROFILEDIR, [FILE_EXTENSIONS_LOG]); + var stream = Cc["@mozilla.org/network/file-output-stream;1"]. + createInstance(Ci.nsIFileOutputStream); + stream.init(logfile, 0x02 | 0x08 | 0x10, 0666, 0); // write, create, append + var writer = Cc["@mozilla.org/intl/converter-output-stream;1"]. + createInstance(Ci.nsIConverterOutputStream); + writer.init(stream, "UTF-8", 0, 0x0000); + writer.writeString(tstamp.toLocaleFormat("%Y-%m-%d %H:%M:%S ") + + message + "\n"); + writer.close(); + } + catch (e) { } + }, + + warn: function(aStr) { + let message = formatLogMessage("warn", this.name, aStr); + + let consoleMessage = Cc["@mozilla.org/scripterror;1"]. + createInstance(Ci.nsIScriptError); + consoleMessage.init(message, null, null, 0, 0, Ci.nsIScriptError.warningFlag, + "component javascript"); + Services.console.logMessage(consoleMessage); + + if (gDebugLogEnabled) + dump("*** " + message + "\n"); + }, + + log: function(aStr) { + if (gDebugLogEnabled) { + let message = formatLogMessage("log", this.name, aStr); + dump("*** " + message + "\n"); + Services.console.logStringMessage(message); + } + } +}; + +var LogManager = { + getLogger: function(aName, aTarget) { + let logger = new AddonLogger(aName); + + if (aTarget) { + ["error", "warn", "log"].forEach(function(name) { + let fname = name.toUpperCase(); + delete aTarget[fname]; + aTarget[fname] = function(aStr) { + logger[name](aStr); + }; + }); + } + + return logger; + } +}; + +try { + gDebugLogEnabled = Services.prefs.getBoolPref("extensions.logging.enabled"); +} +catch (e) { +} diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm index 39c3f3cdb937..102039be9a8b 100644 --- a/toolkit/mozapps/extensions/AddonManager.jsm +++ b/toolkit/mozapps/extensions/AddonManager.jsm @@ -54,35 +54,14 @@ const PROVIDERS = [ "resource://gre/modules/LightweightThemeManager.jsm" ]; -/** - * Logs a debugging message. - * - * @param aStr - * The string to log - */ -function LOG(aStr) { - dump("*** addons.manager: " + aStr + "\n"); -} +["LOG", "WARN", "ERROR"].forEach(function(aName) { + this.__defineGetter__(aName, function() { + Components.utils.import("resource://gre/modules/AddonLogging.jsm"); -/** - * Logs a warning message. - * - * @param aStr - * The string to log - */ -function WARN(aStr) { - LOG(aStr); -} - -/** - * Logs an error message. - * - * @param aStr - * The string to log - */ -function ERROR(aStr) { - LOG(aStr); -} + LogManager.getLogger("addons.manager", this); + return this[aName]; + }); +}, this); /** * Calls a callback method consuming any thrown exception. Any parameters after diff --git a/toolkit/mozapps/extensions/AddonUpdateChecker.jsm b/toolkit/mozapps/extensions/AddonUpdateChecker.jsm index 577c416f401d..bccafebddb6b 100644 --- a/toolkit/mozapps/extensions/AddonUpdateChecker.jsm +++ b/toolkit/mozapps/extensions/AddonUpdateChecker.jsm @@ -63,35 +63,14 @@ Components.utils.import("resource://gre/modules/CertUtils.jsm"); var gRDF = Cc["@mozilla.org/rdf/rdf-service;1"]. getService(Ci.nsIRDFService); -/** - * Logs a debug message. - * - * @param aStr - * The string to log - */ -function LOG(aStr) { - dump("*** addons.updates: " + aStr + "\n"); -} +["LOG", "WARN", "ERROR"].forEach(function(aName) { + this.__defineGetter__(aName, function() { + Components.utils.import("resource://gre/modules/AddonLogging.jsm"); -/** - * Logs a warning message - * - * @param aStr - * The string to log - */ -function WARN(aStr) { - LOG(aStr); -} - -/** - * Logs an error message - * - * @param aStr - * The string to log - */ -function ERROR(aStr) { - LOG(str); -} + LogManager.getLogger("addons.updates", this); + return this[aName]; + }); +}, this); /** * A serialisation method for RDF data that produces an identical string diff --git a/toolkit/mozapps/extensions/Makefile.in b/toolkit/mozapps/extensions/Makefile.in index b5972ae7d6af..20b9f42e3623 100644 --- a/toolkit/mozapps/extensions/Makefile.in +++ b/toolkit/mozapps/extensions/Makefile.in @@ -73,6 +73,7 @@ EXTRA_PP_JS_MODULES = \ XPIProvider.jsm \ PluginProvider.jsm \ AddonUpdateChecker.jsm \ + AddonLogging.jsm \ $(NULL) EXTRA_JS_MODULES = \ diff --git a/toolkit/mozapps/extensions/PluginProvider.jsm b/toolkit/mozapps/extensions/PluginProvider.jsm index 539b80f58152..354a8ee274de 100644 --- a/toolkit/mozapps/extensions/PluginProvider.jsm +++ b/toolkit/mozapps/extensions/PluginProvider.jsm @@ -45,35 +45,14 @@ var EXPORTED_SYMBOLS = []; Components.utils.import("resource://gre/modules/AddonManager.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); -/** - * Logs a debug message. - * - * @param aStr - * The string to log - */ -function LOG(aStr) { - dump("*** addons.plugins: " + aStr + "\n"); -} +["LOG", "WARN", "ERROR"].forEach(function(aName) { + this.__defineGetter__(aName, function() { + Components.utils.import("resource://gre/modules/AddonLogging.jsm"); -/** - * Logs a warning message. - * - * @param aStr - * The string to log - */ -function WARN(aStr) { - LOG(aStr); -} - -/** - * Logs an error message. - * - * @param aStr - * The string to log - */ -function ERROR(aStr) { - LOG(aStr); -} + LogManager.getLogger("addons.plugins", this); + return this[aName]; + }); +}, this); var PluginProvider = { // A dictionary mapping IDs to names and descriptions diff --git a/toolkit/mozapps/extensions/XPIProvider.jsm b/toolkit/mozapps/extensions/XPIProvider.jsm index 3684b74e117d..2bb82607a8d6 100644 --- a/toolkit/mozapps/extensions/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/XPIProvider.jsm @@ -132,35 +132,14 @@ const TYPES = { */ var gIDTest = /^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)$/i; -/** - * Logs a debug message. - * - * @param aStr - * The string to log - */ -function LOG(aStr) { - dump("*** addons.xpi: " + aStr + "\n"); -} +["LOG", "WARN", "ERROR"].forEach(function(aName) { + this.__defineGetter__(aName, function() { + Components.utils.import("resource://gre/modules/AddonLogging.jsm"); -/** - * Logs a warning message. - * - * @param str - * The string to log - */ -function WARN(aStr) { - LOG(aStr); -} - -/** - * Logs an error message. - * - * @param str - * The string to log - */ -function ERROR(aStr) { - LOG(aStr); -} + LogManager.getLogger("addons.xpi", this); + return this[aName]; + }) +}, this); /** * Gets the currently selected locale for display. diff --git a/toolkit/mozapps/extensions/amWebInstallListener.js b/toolkit/mozapps/extensions/amWebInstallListener.js index 0ef3a48c26bc..6d96f1d9b518 100644 --- a/toolkit/mozapps/extensions/amWebInstallListener.js +++ b/toolkit/mozapps/extensions/amWebInstallListener.js @@ -52,15 +52,14 @@ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); Components.utils.import("resource://gre/modules/AddonManager.jsm"); Components.utils.import("resource://gre/modules/Services.jsm"); -/** - * Logs a warning message - * - * @param aStr - * The string to log - */ -function WARN(aStr) { - dump("*** addons.weblistener: " + aStr + "\n"); -} +["LOG", "WARN", "ERROR"].forEach(function(aName) { + this.__defineGetter__(aName, function() { + Components.utils.import("resource://gre/modules/AddonLogging.jsm"); + + LogManager.getLogger("addons.weblistener", this); + return this[aName]; + }); +}, this); /** * Creates a new installer to monitor downloads and prompt to install when @@ -190,7 +189,6 @@ extWebInstallListener.prototype = { installs: aInstalls, install: function() { - dump("Start installs\n"); new Installer(this.originatingWindow, this.originatingURI, this.installs); },