зеркало из https://github.com/mozilla/gecko-dev.git
Bug 661982: Toolkit Add-ons Manager logging to be changed to use Log.jsm;r=irving
This commit is contained in:
Родитель
23792bbdb4
Коммит
1885d7760f
|
@ -83,14 +83,70 @@ const DEFAULT_PROVIDERS = [
|
|||
"resource://gre/modules/LightweightThemeManager.jsm"
|
||||
];
|
||||
|
||||
["LOG", "WARN", "ERROR"].forEach(function(aName) {
|
||||
this.__defineGetter__(aName, function logFuncGetter() {
|
||||
Components.utils.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
// Configure a logger at the parent 'addons' level to format
|
||||
// messages for all the modules under addons.*
|
||||
const PARENT_LOGGER_ID = "addons";
|
||||
let parentLogger = Log.repository.getLogger(PARENT_LOGGER_ID);
|
||||
parentLogger.level = Log.Level.Warn;
|
||||
let formatter = new Log.BasicFormatter();
|
||||
// Set parent logger (and its children) to append to
|
||||
// the Javascript section of the Browser Console
|
||||
parentLogger.addAppender(new Log.ConsoleAppender(formatter));
|
||||
// Set parent logger (and its children) to
|
||||
// also append to standard out
|
||||
parentLogger.addAppender(new Log.DumpAppender(formatter));
|
||||
|
||||
LogManager.getLogger("addons.manager", this);
|
||||
return this[aName];
|
||||
});
|
||||
}, this);
|
||||
// Create a new logger (child of 'addons' logger)
|
||||
// for use by the Addons Manager
|
||||
const LOGGER_ID = "addons.manager";
|
||||
let logger = Log.repository.getLogger(LOGGER_ID);
|
||||
|
||||
// Provide the ability to enable/disable logging
|
||||
// messages at runtime.
|
||||
// If the "extensions.logging.enabled" preference is
|
||||
// missing or 'false', messages at the WARNING and higher
|
||||
// severity should be logged to the JS console and standard error.
|
||||
// If "extensions.logging.enabled" is set to 'true', messages
|
||||
// at DEBUG and higher should go to JS console and standard error.
|
||||
const PREF_LOGGING_ENABLED = "extensions.logging.enabled";
|
||||
const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
|
||||
|
||||
/**
|
||||
* Preference listener which listens for a change in the
|
||||
* "extensions.logging.enabled" preference and changes the logging level of the
|
||||
* parent 'addons' level logger accordingly.
|
||||
*/
|
||||
var PrefObserver = {
|
||||
init: function PrefObserver_init() {
|
||||
Services.prefs.addObserver(PREF_LOGGING_ENABLED, this, false);
|
||||
Services.obs.addObserver(this, "xpcom-shutdown", false);
|
||||
this.observe(null, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID, PREF_LOGGING_ENABLED);
|
||||
},
|
||||
|
||||
observe: function PrefObserver_observe(aSubject, aTopic, aData) {
|
||||
if (aTopic == "xpcom-shutdown") {
|
||||
Services.prefs.removeObserver(PREF_LOGGING_ENABLED, this);
|
||||
Services.obs.removeObserver(this, "xpcom-shutdown");
|
||||
}
|
||||
else if (aTopic == NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) {
|
||||
let debugLogEnabled = false;
|
||||
try {
|
||||
debugLogEnabled = Services.prefs.getBoolPref(PREF_LOGGING_ENABLED);
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
if (debugLogEnabled) {
|
||||
parentLogger.level = Log.Level.Debug;
|
||||
}
|
||||
else {
|
||||
parentLogger.level = Log.Level.Warn;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PrefObserver.init();
|
||||
|
||||
/**
|
||||
* Calls a callback method consuming any thrown exception. Any parameters after
|
||||
|
@ -104,7 +160,7 @@ function safeCall(aCallback, ...aArgs) {
|
|||
aCallback.apply(null, aArgs);
|
||||
}
|
||||
catch (e) {
|
||||
WARN("Exception calling callback", e);
|
||||
logger.warn("Exception calling callback", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,7 +186,7 @@ function callProvider(aProvider, aMethod, aDefault, ...aArgs) {
|
|||
return aProvider[aMethod].apply(aProvider, aArgs);
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("Exception calling provider " + aMethod, e);
|
||||
logger.error("Exception calling provider " + aMethod, e);
|
||||
return aDefault;
|
||||
}
|
||||
}
|
||||
|
@ -496,7 +552,7 @@ var AddonManagerInternal = {
|
|||
catch (e) { }
|
||||
|
||||
if (appChanged !== false) {
|
||||
LOG("Application has been upgraded");
|
||||
logger.debug("Application has been upgraded");
|
||||
Services.prefs.setCharPref(PREF_EM_LAST_APP_VERSION,
|
||||
Services.appinfo.version);
|
||||
Services.prefs.setCharPref(PREF_EM_LAST_PLATFORM_VERSION,
|
||||
|
@ -558,7 +614,7 @@ var AddonManagerInternal = {
|
|||
}
|
||||
catch (e) {
|
||||
AddonManagerPrivate.recordException("AMI", "provider " + url + " load failed", e);
|
||||
ERROR("Exception loading default provider \"" + url + "\"", e);
|
||||
logger.error("Exception loading default provider \"" + url + "\"", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -576,7 +632,7 @@ var AddonManagerInternal = {
|
|||
}
|
||||
catch (e) {
|
||||
AddonManagerPrivate.recordException("AMI", "provider " + url + " load failed", e);
|
||||
ERROR("Exception loading provider " + entry + " from category \"" +
|
||||
logger.error("Exception loading provider " + entry + " from category \"" +
|
||||
url + "\"", e);
|
||||
}
|
||||
}
|
||||
|
@ -601,7 +657,7 @@ var AddonManagerInternal = {
|
|||
this.recordTimestamp("AMI_startup_end");
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("startup failed", e);
|
||||
logger.error("startup failed", e);
|
||||
AddonManagerPrivate.recordException("AMI", "startup failed", e);
|
||||
}
|
||||
},
|
||||
|
@ -629,7 +685,7 @@ var AddonManagerInternal = {
|
|||
aTypes.forEach(function(aType) {
|
||||
if (!(aType.id in this.types)) {
|
||||
if (!VALID_TYPES_REGEXP.test(aType.id)) {
|
||||
WARN("Ignoring invalid type " + aType.id);
|
||||
logger.warn("Ignoring invalid type " + aType.id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -716,7 +772,7 @@ var AddonManagerInternal = {
|
|||
provider[aMethod].apply(provider, aArgs);
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("Exception calling provider " + aMethod, e);
|
||||
logger.error("Exception calling provider " + aMethod, e);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -751,12 +807,12 @@ var AddonManagerInternal = {
|
|||
// Log and swallow the errors from methods that do return promises.
|
||||
nextPromise = nextPromise.then(
|
||||
null,
|
||||
e => ERROR("Exception calling provider " + aMethod, e));
|
||||
e => logger.error("Exception calling provider " + aMethod, e));
|
||||
allProviders.push(nextPromise);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("Exception calling provider " + aMethod, e);
|
||||
logger.error("Exception calling provider " + aMethod, e);
|
||||
}
|
||||
}
|
||||
// Because we use promise.then to catch and log all errors above, Promise.all()
|
||||
|
@ -771,7 +827,7 @@ var AddonManagerInternal = {
|
|||
* have finished shutting down
|
||||
*/
|
||||
shutdown: function AMI_shutdown() {
|
||||
LOG("shutdown");
|
||||
logger.debug("shutdown");
|
||||
// Clean up listeners
|
||||
Services.prefs.removeObserver(PREF_EM_CHECK_COMPATIBILITY, this);
|
||||
Services.prefs.removeObserver(PREF_EM_STRICT_COMPATIBILITY, this);
|
||||
|
@ -786,15 +842,15 @@ var AddonManagerInternal = {
|
|||
if (gStarted) {
|
||||
shuttingDown = this.callProvidersAsync("shutdown")
|
||||
.then(null,
|
||||
err => ERROR("Failure during async provider shutdown", err))
|
||||
err => logger.error("Failure during async provider shutdown", err))
|
||||
.then(() => AddonRepository.shutdown());
|
||||
}
|
||||
else {
|
||||
shuttingDown = AddonRepository.shutdown();
|
||||
}
|
||||
|
||||
shuttingDown.then(val => LOG("Async provider shutdown done"),
|
||||
err => ERROR("Failure during AddonRepository shutdown", err))
|
||||
shuttingDown.then(val => logger.debug("Async provider shutdown done"),
|
||||
err => logger.error("Failure during AddonRepository shutdown", err))
|
||||
.then(() => {
|
||||
this.managerListeners.splice(0, this.managerListeners.length);
|
||||
this.installListeners.splice(0, this.installListeners.length);
|
||||
|
@ -1088,7 +1144,7 @@ var AddonManagerInternal = {
|
|||
return;
|
||||
}
|
||||
|
||||
LOG("Downloading hotfix version " + update.version);
|
||||
logger.debug("Downloading hotfix version " + update.version);
|
||||
AddonManager.getInstallForURL(update.updateURL,
|
||||
function BUC_getInstallForURL(aInstall) {
|
||||
aInstall.addListener({
|
||||
|
@ -1107,7 +1163,7 @@ var AddonManagerInternal = {
|
|||
CertUtils.readCertPrefs(PREF_EM_HOTFIX_CERTS));
|
||||
}
|
||||
catch (e) {
|
||||
WARN("The hotfix add-on was not signed by the expected " +
|
||||
logger.warn("The hotfix add-on was not signed by the expected " +
|
||||
"certificate and so will not be installed.");
|
||||
aInstall.cancel();
|
||||
}
|
||||
|
@ -1224,7 +1280,7 @@ var AddonManagerInternal = {
|
|||
listener[aMethod].apply(listener, aArgs);
|
||||
}
|
||||
catch (e) {
|
||||
WARN("AddonManagerListener threw exception when calling " + aMethod, e);
|
||||
logger.warn("AddonManagerListener threw exception when calling " + aMethod, e);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -1268,7 +1324,7 @@ var AddonManagerInternal = {
|
|||
}
|
||||
}
|
||||
catch (e) {
|
||||
WARN("InstallListener threw exception when calling " + aMethod, e);
|
||||
logger.warn("InstallListener threw exception when calling " + aMethod, e);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
@ -1297,7 +1353,7 @@ var AddonManagerInternal = {
|
|||
listener[aMethod].apply(listener, aArgs);
|
||||
}
|
||||
catch (e) {
|
||||
WARN("AddonListener threw exception when calling " + aMethod, e);
|
||||
logger.warn("AddonListener threw exception when calling " + aMethod, e);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -1676,7 +1732,7 @@ var AddonManagerInternal = {
|
|||
Cr.NS_ERROR_INVALID_ARG);
|
||||
|
||||
if (!("@mozilla.org/addons/web-install-listener;1" in Cc)) {
|
||||
WARN("No web installer available, cancelling all installs");
|
||||
logger.warn("No web installer available, cancelling all installs");
|
||||
aInstalls.forEach(function(aInstall) {
|
||||
aInstall.cancel();
|
||||
});
|
||||
|
@ -1710,7 +1766,7 @@ var AddonManagerInternal = {
|
|||
// In the event that the weblistener throws during instantiation or when
|
||||
// calling onWebInstallBlocked or onWebInstallRequested all of the
|
||||
// installs should get cancelled.
|
||||
WARN("Failure calling web installer", e);
|
||||
logger.warn("Failure calling web installer", e);
|
||||
aInstalls.forEach(function(aInstall) {
|
||||
aInstall.cancel();
|
||||
});
|
||||
|
|
|
@ -19,6 +19,68 @@ this.EXPORTED_SYMBOLS = ["DeferredSave"];
|
|||
// If delay parameter is not provided, default is 50 milliseconds.
|
||||
const DEFAULT_SAVE_DELAY_MS = 50;
|
||||
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
//Configure a logger at the parent 'DeferredSave' level to format
|
||||
//messages for all the modules under DeferredSave.*
|
||||
const DEFERREDSAVE_PARENT_LOGGER_ID = "DeferredSave";
|
||||
let parentLogger = Log.repository.getLogger(DEFERREDSAVE_PARENT_LOGGER_ID);
|
||||
parentLogger.level = Log.Level.Warn;
|
||||
let formatter = new Log.BasicFormatter();
|
||||
//Set parent logger (and its children) to append to
|
||||
//the Javascript section of the Browser Console
|
||||
parentLogger.addAppender(new Log.ConsoleAppender(formatter));
|
||||
//Set parent logger (and its children) to
|
||||
//also append to standard out
|
||||
parentLogger.addAppender(new Log.DumpAppender(formatter));
|
||||
|
||||
//Provide the ability to enable/disable logging
|
||||
//messages at runtime.
|
||||
//If the "extensions.logging.enabled" preference is
|
||||
//missing or 'false', messages at the WARNING and higher
|
||||
//severity should be logged to the JS console and standard error.
|
||||
//If "extensions.logging.enabled" is set to 'true', messages
|
||||
//at DEBUG and higher should go to JS console and standard error.
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
const PREF_LOGGING_ENABLED = "extensions.logging.enabled";
|
||||
const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
|
||||
|
||||
/**
|
||||
* Preference listener which listens for a change in the
|
||||
* "extensions.logging.enabled" preference and changes the logging level of the
|
||||
* parent 'addons' level logger accordingly.
|
||||
*/
|
||||
var PrefObserver = {
|
||||
init: function PrefObserver_init() {
|
||||
Services.prefs.addObserver(PREF_LOGGING_ENABLED, this, false);
|
||||
Services.obs.addObserver(this, "xpcom-shutdown", false);
|
||||
this.observe(null, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID, PREF_LOGGING_ENABLED);
|
||||
},
|
||||
|
||||
observe: function PrefObserver_observe(aSubject, aTopic, aData) {
|
||||
if (aTopic == "xpcom-shutdown") {
|
||||
Services.prefs.removeObserver(PREF_LOGGING_ENABLED, this);
|
||||
Services.obs.removeObserver(this, "xpcom-shutdown");
|
||||
}
|
||||
else if (aTopic == NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) {
|
||||
let debugLogEnabled = false;
|
||||
try {
|
||||
debugLogEnabled = Services.prefs.getBoolPref(PREF_LOGGING_ENABLED);
|
||||
}
|
||||
catch (e) {
|
||||
}
|
||||
if (debugLogEnabled) {
|
||||
parentLogger.level = Log.Level.Debug;
|
||||
}
|
||||
else {
|
||||
parentLogger.level = Log.Level.Warn;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PrefObserver.init();
|
||||
|
||||
/**
|
||||
* A module to manage deferred, asynchronous writing of data files
|
||||
* to disk. Writing is deferred by waiting for a specified delay after
|
||||
|
@ -42,10 +104,11 @@ const DEFAULT_SAVE_DELAY_MS = 50;
|
|||
* begins writing the data to disk. Default 50 milliseconds.
|
||||
*/
|
||||
this.DeferredSave = function (aPath, aDataProvider, aDelay) {
|
||||
// Set up loggers for this instance of DeferredSave
|
||||
// Create a new logger (child of 'DeferredSave' logger)
|
||||
// for use by this particular instance of DeferredSave object
|
||||
let leafName = OS.Path.basename(aPath);
|
||||
Cu.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
LogManager.getLogger("DeferredSave/" + leafName, this);
|
||||
let logger_id = DEFERREDSAVE_PARENT_LOGGER_ID + "." + leafName;
|
||||
this.logger = Log.repository.getLogger(logger_id);
|
||||
|
||||
// @type {Deferred|null}, null when no data needs to be written
|
||||
// @resolves with the result of OS.File.writeAtomic when all writes complete
|
||||
|
@ -105,7 +168,7 @@ this.DeferredSave.prototype = {
|
|||
return;
|
||||
}
|
||||
|
||||
this.LOG("Starting timer");
|
||||
this.logger.debug("Starting timer");
|
||||
if (!this._timer)
|
||||
this._timer = MakeTimer();
|
||||
this._timer.initWithCallback(() => this._deferredSave(),
|
||||
|
@ -118,10 +181,10 @@ this.DeferredSave.prototype = {
|
|||
* the promise is resolved with the number of bytes written.
|
||||
*/
|
||||
saveChanges: function() {
|
||||
this.LOG("Save changes");
|
||||
this.logger.debug("Save changes");
|
||||
if (!this._pending) {
|
||||
if (this.writeInProgress) {
|
||||
this.LOG("Data changed while write in progress");
|
||||
this.logger.debug("Data changed while write in progress");
|
||||
this.overlappedSaves++;
|
||||
}
|
||||
this._pending = Promise.defer();
|
||||
|
@ -145,7 +208,7 @@ this.DeferredSave.prototype = {
|
|||
toSave = this._dataProvider();
|
||||
}
|
||||
catch(e) {
|
||||
this.ERROR("Deferred save dataProvider failed", e);
|
||||
this.logger.error("Deferred save dataProvider failed", e);
|
||||
writing.then(null, error => {})
|
||||
.then(count => {
|
||||
pending.reject(e);
|
||||
|
@ -155,7 +218,7 @@ this.DeferredSave.prototype = {
|
|||
|
||||
writing.then(null, error => {return 0;})
|
||||
.then(count => {
|
||||
this.LOG("Starting write");
|
||||
this.logger.debug("Starting write");
|
||||
this.totalSaves++;
|
||||
this.writeInProgress = true;
|
||||
|
||||
|
@ -164,13 +227,13 @@ this.DeferredSave.prototype = {
|
|||
result => {
|
||||
this._lastError = null;
|
||||
this.writeInProgress = false;
|
||||
this.LOG("Write succeeded");
|
||||
this.logger.debug("Write succeeded");
|
||||
pending.resolve(result);
|
||||
},
|
||||
error => {
|
||||
this._lastError = error;
|
||||
this.writeInProgress = false;
|
||||
this.WARN("Write failed", error);
|
||||
this.logger.warn("Write failed", error);
|
||||
pending.reject(error);
|
||||
});
|
||||
});
|
||||
|
@ -198,7 +261,7 @@ this.DeferredSave.prototype = {
|
|||
// immediately (_deferredSave queues the write for after the most
|
||||
// recent write completes, if it hasn't already)
|
||||
if (this._pending) {
|
||||
this.LOG("Flush called while data is dirty");
|
||||
this.logger.debug("Flush called while data is dirty");
|
||||
if (this._timer) {
|
||||
this._timer.cancel();
|
||||
this._timer = null;
|
||||
|
@ -208,4 +271,4 @@ this.DeferredSave.prototype = {
|
|||
|
||||
return this._writing;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -14,10 +14,11 @@
|
|||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
const Cr = Components.results;
|
||||
const Cu = Components.utils;
|
||||
|
||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Components.utils.import("resource://gre/modules/AddonManager.jsm");
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/AddonManager.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
const URI_XPINSTALL_DIALOG = "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul";
|
||||
|
||||
|
@ -29,14 +30,12 @@ const READY_STATES = [
|
|||
AddonManager.STATE_CANCELLED
|
||||
];
|
||||
|
||||
["LOG", "WARN", "ERROR"].forEach(function(aName) {
|
||||
this.__defineGetter__(aName, function logFuncGetter() {
|
||||
Components.utils.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
const LOGGER_ID = "addons.weblistener";
|
||||
|
||||
LogManager.getLogger("addons.weblistener", this);
|
||||
return this[aName];
|
||||
});
|
||||
}, this);
|
||||
// Create a new logger for use by the Addons Web Listener
|
||||
// (Requires AddonManager.jsm)
|
||||
let logger = Log.repository.getLogger(LOGGER_ID);
|
||||
|
||||
function notifyObservers(aTopic, aWindow, aUri, aInstalls) {
|
||||
let info = {
|
||||
|
@ -129,7 +128,7 @@ Installer.prototype = {
|
|||
// Just ignore cancelled downloads
|
||||
break;
|
||||
default:
|
||||
WARN("Download of " + install.sourceURI.spec + " in unexpected state " +
|
||||
logger.warn("Download of " + install.sourceURI.spec + " in unexpected state " +
|
||||
install.state);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,14 +61,12 @@ const BLANK_DB = function() {
|
|||
|
||||
const TOOLKIT_ID = "toolkit@mozilla.org";
|
||||
|
||||
["LOG", "WARN", "ERROR"].forEach(function(aName) {
|
||||
this.__defineGetter__(aName, function logFuncGetter() {
|
||||
Components.utils.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
const LOGGER_ID = "addons.repository";
|
||||
|
||||
LogManager.getLogger("addons.repository", this);
|
||||
return this[aName];
|
||||
});
|
||||
}, this);
|
||||
// Create a new logger for use by the Addons Repository
|
||||
// (Requires AddonManager.jsm)
|
||||
let logger = Log.repository.getLogger(LOGGER_ID);
|
||||
|
||||
// A map between XML keys to AddonSearchResult keys for string values
|
||||
// that require no extra parsing from XML
|
||||
|
@ -445,7 +443,7 @@ AddonSearchResult.prototype = {
|
|||
json[property] = value;
|
||||
}
|
||||
} catch (ex) {
|
||||
WARN("Error writing property value for " + property);
|
||||
logger.warn("Error writing property value for " + property);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -484,7 +482,7 @@ this.AddonRepository = {
|
|||
try {
|
||||
enabled = Services.prefs.getBoolPref(preference);
|
||||
} catch(e) {
|
||||
WARN("cacheEnabled: Couldn't get pref: " + preference);
|
||||
logger.warn("cacheEnabled: Couldn't get pref: " + preference);
|
||||
}
|
||||
|
||||
return enabled;
|
||||
|
@ -639,7 +637,7 @@ this.AddonRepository = {
|
|||
AddonDatabase.repopulate(aAddons, aCallback);
|
||||
},
|
||||
searchFailed: function repopulateCacheInternal_searchFailed() {
|
||||
WARN("Search failed when repopulating cache");
|
||||
logger.warn("Search failed when repopulating cache");
|
||||
if (aCallback)
|
||||
aCallback();
|
||||
}
|
||||
|
@ -679,7 +677,7 @@ this.AddonRepository = {
|
|||
AddonDatabase.insertAddons(aAddons, aCallback);
|
||||
},
|
||||
searchFailed: function cacheAddons_searchFailed() {
|
||||
WARN("Search failed when adding add-ons to cache");
|
||||
logger.warn("Search failed when adding add-ons to cache");
|
||||
if (aCallback)
|
||||
aCallback();
|
||||
}
|
||||
|
@ -1067,7 +1065,7 @@ this.AddonRepository = {
|
|||
addon.type = "dictionary";
|
||||
break;
|
||||
default:
|
||||
WARN("Unknown type id when parsing addon: " + id);
|
||||
logger.warn("Unknown type id when parsing addon: " + id);
|
||||
}
|
||||
break;
|
||||
case "authors":
|
||||
|
@ -1312,7 +1310,7 @@ this.AddonRepository = {
|
|||
_parseAddonCompatElement: function AddonRepo_parseAddonCompatElement(aResultObj, aElement) {
|
||||
let guid = this._getDescendantTextContent(aElement, "guid");
|
||||
if (!guid) {
|
||||
LOG("Compatibility override is missing guid.");
|
||||
logger.debug("Compatibility override is missing guid.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1348,7 +1346,7 @@ this.AddonRepository = {
|
|||
let type = aNode.getAttribute("type");
|
||||
// Only "incompatible" (blacklisting) is supported for now.
|
||||
if (type != "incompatible") {
|
||||
LOG("Compatibility override of unsupported type found.");
|
||||
logger.debug("Compatibility override of unsupported type found.");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -1358,18 +1356,18 @@ this.AddonRepository = {
|
|||
override.maxVersion = this._getDirectDescendantTextContent(aNode, "max_version");
|
||||
|
||||
if (!override.minVersion) {
|
||||
LOG("Compatibility override is missing min_version.");
|
||||
logger.debug("Compatibility override is missing min_version.");
|
||||
return null;
|
||||
}
|
||||
if (!override.maxVersion) {
|
||||
LOG("Compatibility override is missing max_version.");
|
||||
logger.debug("Compatibility override is missing max_version.");
|
||||
return null;
|
||||
}
|
||||
|
||||
let appRanges = aNode.querySelectorAll("compatible_applications > application");
|
||||
let appRange = findMatchingAppRange.bind(this)(appRanges);
|
||||
if (!appRange) {
|
||||
LOG("Compatibility override is missing a valid application range.");
|
||||
logger.debug("Compatibility override is missing a valid application range.");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -1407,7 +1405,7 @@ this.AddonRepository = {
|
|||
this._callback = aCallback;
|
||||
this._maxResults = aMaxResults;
|
||||
|
||||
LOG("Requesting " + aURI);
|
||||
logger.debug("Requesting " + aURI);
|
||||
|
||||
this._request = new XHRequest();
|
||||
this._request.mozBackgroundRequest = true;
|
||||
|
@ -1475,7 +1473,7 @@ this.AddonRepository = {
|
|||
try {
|
||||
url = Services.prefs.getCharPref(aPreference);
|
||||
} catch(e) {
|
||||
WARN("_formatURLPref: Couldn't get pref: " + aPreference);
|
||||
logger.warn("_formatURLPref: Couldn't get pref: " + aPreference);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -1575,7 +1573,7 @@ var AddonDatabase = {
|
|||
}
|
||||
|
||||
} catch (e if e.result == Cr.NS_ERROR_FILE_NOT_FOUND) {
|
||||
LOG("No " + FILE_DATABASE + " found.");
|
||||
logger.debug("No " + FILE_DATABASE + " found.");
|
||||
|
||||
// Create a blank addons.json file
|
||||
this._saveDBToDisk();
|
||||
|
@ -1604,7 +1602,7 @@ var AddonDatabase = {
|
|||
return;
|
||||
|
||||
} catch (e) {
|
||||
ERROR("Malformed " + FILE_DATABASE + ": " + e);
|
||||
logger.error("Malformed " + FILE_DATABASE + ": " + e);
|
||||
this.databaseOk = false;
|
||||
return;
|
||||
|
||||
|
@ -1675,7 +1673,7 @@ var AddonDatabase = {
|
|||
// shutdown(true) never rejects
|
||||
.then(() => this.shutdown(true))
|
||||
.then(() => OS.File.remove(this.jsonFile.path, {}))
|
||||
.then(null, error => ERROR("Unable to delete Addon Repository file " +
|
||||
.then(null, error => logger.error("Unable to delete Addon Repository file " +
|
||||
this.jsonFile.path, error))
|
||||
.then(aCallback);
|
||||
},
|
||||
|
@ -1866,7 +1864,7 @@ var AddonDatabase = {
|
|||
addon[expectedProperty] = value;
|
||||
}
|
||||
} catch (ex) {
|
||||
WARN("Error in parsing property value for " + expectedProperty + " | " + ex);
|
||||
logger.warn("Error in parsing property value for " + expectedProperty + " | " + ex);
|
||||
}
|
||||
|
||||
// delete property from obj to indicate we've already
|
||||
|
@ -1910,7 +1908,7 @@ var AddonDatabase = {
|
|||
_saveDBToDisk: function() {
|
||||
return this.Writer.saveChanges().then(
|
||||
function() Services.obs.notifyObservers(null, DB_DATA_WRITTEN_TOPIC, null),
|
||||
ERROR);
|
||||
logger.error);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -6,10 +6,11 @@
|
|||
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
const Cu = Components.utils;
|
||||
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
Components.utils.import("resource://gre/modules/AddonManager.jsm");
|
||||
Components.utils.import("resource://gre/modules/FileUtils.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/AddonManager.jsm");
|
||||
Cu.import("resource://gre/modules/FileUtils.jsm");
|
||||
|
||||
const KEY_PROFILEDIR = "ProfD";
|
||||
const FILE_DATABASE = "addons.sqlite";
|
||||
|
@ -24,16 +25,12 @@ const PROP_SINGLE = ["id", "type", "name", "version", "creator", "description",
|
|||
"dailyUsers", "sourceURI", "repositoryStatus", "size",
|
||||
"updateDate"];
|
||||
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
const LOGGER_ID = "addons.repository.sqlmigrator";
|
||||
|
||||
["LOG", "WARN", "ERROR"].forEach(function(aName) {
|
||||
this.__defineGetter__(aName, function logFuncGetter() {
|
||||
Components.utils.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
|
||||
LogManager.getLogger("addons.repository.sqlmigrator", this);
|
||||
return this[aName];
|
||||
});
|
||||
}, this);
|
||||
|
||||
// Create a new logger for use by the Addons Repository SQL Migrator
|
||||
// (Requires AddonManager.jsm)
|
||||
let logger = Log.repository.getLogger(LOGGER_ID);
|
||||
|
||||
this.EXPORTED_SYMBOLS = ["AddonRepository_SQLiteMigrator"];
|
||||
|
||||
|
@ -59,12 +56,12 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
return false;
|
||||
}
|
||||
|
||||
LOG("Importing addon repository from previous " + FILE_DATABASE + " storage.");
|
||||
logger.debug("Importing addon repository from previous " + FILE_DATABASE + " storage.");
|
||||
|
||||
this._retrieveStoredData((results) => {
|
||||
this._closeConnection();
|
||||
let resultArray = [addon for ([,addon] of Iterator(results))];
|
||||
LOG(resultArray.length + " addons imported.")
|
||||
logger.debug(resultArray.length + " addons imported.")
|
||||
aCallback(resultArray);
|
||||
});
|
||||
|
||||
|
@ -100,13 +97,13 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
return false;
|
||||
|
||||
case 1:
|
||||
LOG("Upgrading database schema to version 2");
|
||||
logger.debug("Upgrading database schema to version 2");
|
||||
this.connection.executeSimpleSQL("ALTER TABLE screenshot ADD COLUMN width INTEGER");
|
||||
this.connection.executeSimpleSQL("ALTER TABLE screenshot ADD COLUMN height INTEGER");
|
||||
this.connection.executeSimpleSQL("ALTER TABLE screenshot ADD COLUMN thumbnailWidth INTEGER");
|
||||
this.connection.executeSimpleSQL("ALTER TABLE screenshot ADD COLUMN thumbnailHeight INTEGER");
|
||||
case 2:
|
||||
LOG("Upgrading database schema to version 3");
|
||||
logger.debug("Upgrading database schema to version 3");
|
||||
this.connection.createTable("compatibility_override",
|
||||
"addon_internal_id INTEGER, " +
|
||||
"num INTEGER, " +
|
||||
|
@ -118,7 +115,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
"appMaxVersion TEXT, " +
|
||||
"PRIMARY KEY (addon_internal_id, num)");
|
||||
case 3:
|
||||
LOG("Upgrading database schema to version 4");
|
||||
logger.debug("Upgrading database schema to version 4");
|
||||
this.connection.createTable("icon",
|
||||
"addon_internal_id INTEGER, " +
|
||||
"size INTEGER, " +
|
||||
|
@ -134,7 +131,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
}
|
||||
this.connection.commitTransaction();
|
||||
} catch (e) {
|
||||
ERROR("Failed to open " + FILE_DATABASE + ". Data import will not happen.", e);
|
||||
logger.error("Failed to open " + FILE_DATABASE + ". Data import will not happen.", e);
|
||||
this.logSQLError(this.connection.lastError, this.connection.lastErrorString);
|
||||
this.connection.rollbackTransaction();
|
||||
return false;
|
||||
|
@ -180,7 +177,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
|
||||
handleCompletion: function getAllAddons_handleCompletion(aReason) {
|
||||
if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) {
|
||||
ERROR("Error retrieving add-ons from database. Returning empty results");
|
||||
logger.error("Error retrieving add-ons from database. Returning empty results");
|
||||
aCallback({});
|
||||
return;
|
||||
}
|
||||
|
@ -198,7 +195,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
while ((row = aResults.getNextRow())) {
|
||||
let addon_internal_id = row.getResultByName("addon_internal_id");
|
||||
if (!(addon_internal_id in addons)) {
|
||||
WARN("Found a developer not linked to an add-on in database");
|
||||
logger.warn("Found a developer not linked to an add-on in database");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -214,7 +211,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
|
||||
handleCompletion: function getAllDevelopers_handleCompletion(aReason) {
|
||||
if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) {
|
||||
ERROR("Error retrieving developers from database. Returning empty results");
|
||||
logger.error("Error retrieving developers from database. Returning empty results");
|
||||
aCallback({});
|
||||
return;
|
||||
}
|
||||
|
@ -232,7 +229,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
while ((row = aResults.getNextRow())) {
|
||||
let addon_internal_id = row.getResultByName("addon_internal_id");
|
||||
if (!(addon_internal_id in addons)) {
|
||||
WARN("Found a screenshot not linked to an add-on in database");
|
||||
logger.warn("Found a screenshot not linked to an add-on in database");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -247,7 +244,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
|
||||
handleCompletion: function getAllScreenshots_handleCompletion(aReason) {
|
||||
if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) {
|
||||
ERROR("Error retrieving screenshots from database. Returning empty results");
|
||||
logger.error("Error retrieving screenshots from database. Returning empty results");
|
||||
aCallback({});
|
||||
return;
|
||||
}
|
||||
|
@ -264,7 +261,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
while ((row = aResults.getNextRow())) {
|
||||
let addon_internal_id = row.getResultByName("addon_internal_id");
|
||||
if (!(addon_internal_id in addons)) {
|
||||
WARN("Found a compatibility override not linked to an add-on in database");
|
||||
logger.warn("Found a compatibility override not linked to an add-on in database");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -279,7 +276,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
|
||||
handleCompletion: function getAllCompatOverrides_handleCompletion(aReason) {
|
||||
if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) {
|
||||
ERROR("Error retrieving compatibility overrides from database. Returning empty results");
|
||||
logger.error("Error retrieving compatibility overrides from database. Returning empty results");
|
||||
aCallback({});
|
||||
return;
|
||||
}
|
||||
|
@ -296,7 +293,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
while ((row = aResults.getNextRow())) {
|
||||
let addon_internal_id = row.getResultByName("addon_internal_id");
|
||||
if (!(addon_internal_id in addons)) {
|
||||
WARN("Found an icon not linked to an add-on in database");
|
||||
logger.warn("Found an icon not linked to an add-on in database");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -312,7 +309,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
|
||||
handleCompletion: function getAllIcons_handleCompletion(aReason) {
|
||||
if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) {
|
||||
ERROR("Error retrieving icons from database. Returning empty results");
|
||||
logger.error("Error retrieving icons from database. Returning empty results");
|
||||
aCallback({});
|
||||
return;
|
||||
}
|
||||
|
@ -349,7 +346,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
try {
|
||||
return this.asyncStatementsCache[aKey] = this.connection.createAsyncStatement(sql);
|
||||
} catch (e) {
|
||||
ERROR("Error creating statement " + aKey + " (" + sql + ")");
|
||||
logger.error("Error creating statement " + aKey + " (" + sql + ")");
|
||||
throw Components.Exception("Error creating statement " + aKey + " (" + sql + "): " + e,
|
||||
e.result);
|
||||
}
|
||||
|
@ -478,7 +475,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
* An error message
|
||||
*/
|
||||
logSQLError: function AD_logSQLError(aError, aErrorString) {
|
||||
ERROR("SQL error " + aError + ": " + aErrorString);
|
||||
logger.error("SQL error " + aError + ": " + aErrorString);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -488,7 +485,7 @@ this.AddonRepository_SQLiteMigrator = {
|
|||
* A mozIStorageError to log
|
||||
*/
|
||||
asyncErrorLogger: function AD_asyncErrorLogger(aError) {
|
||||
ERROR("Async SQL error " + aError.result + ": " + aError.message);
|
||||
logger.error("Async SQL error " + aError.result + ": " + aError.message);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -44,15 +44,12 @@ XPCOMUtils.defineLazyGetter(this, "CertUtils", function certUtilsLazyGetter() {
|
|||
var gRDF = Cc["@mozilla.org/rdf/rdf-service;1"].
|
||||
getService(Ci.nsIRDFService);
|
||||
|
||||
["LOG", "WARN", "ERROR"].forEach(function(aName) {
|
||||
this.__defineGetter__(aName, function logFuncGetter() {
|
||||
Components.utils.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
|
||||
LogManager.getLogger("addons.updates", this);
|
||||
return this[aName];
|
||||
});
|
||||
}, this);
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
const LOGGER_ID = "addons.updates";
|
||||
|
||||
// Create a new logger for use by the Addons Update Checker
|
||||
// (Requires AddonManager.jsm)
|
||||
let logger = Log.repository.getLogger(LOGGER_ID);
|
||||
|
||||
/**
|
||||
* A serialisation method for RDF data that produces an identical string
|
||||
|
@ -309,7 +306,7 @@ function parseRDFManifest(aId, aUpdateKey, aRequest) {
|
|||
// A missing updates property doesn't count as a failure, just as no avialable
|
||||
// update information
|
||||
if (!updates) {
|
||||
WARN("Update manifest for " + aId + " did not contain an updates property");
|
||||
logger.warn("Update manifest for " + aId + " did not contain an updates property");
|
||||
return [];
|
||||
}
|
||||
|
||||
|
@ -330,11 +327,11 @@ function parseRDFManifest(aId, aUpdateKey, aRequest) {
|
|||
let item = items.getNext().QueryInterface(Ci.nsIRDFResource);
|
||||
let version = getProperty(ds, item, "version");
|
||||
if (!version) {
|
||||
WARN("Update manifest is missing a required version property.");
|
||||
logger.warn("Update manifest is missing a required version property.");
|
||||
continue;
|
||||
}
|
||||
|
||||
LOG("Found an update entry for " + aId + " version " + version);
|
||||
logger.debug("Found an update entry for " + aId + " version " + version);
|
||||
|
||||
let targetApps = ds.GetTargets(item, EM_R("targetApplication"), true);
|
||||
while (targetApps.hasMoreElements()) {
|
||||
|
@ -347,7 +344,7 @@ function parseRDFManifest(aId, aUpdateKey, aRequest) {
|
|||
appEntry.maxVersion = getRequiredProperty(ds, targetApp, "maxVersion");
|
||||
}
|
||||
catch (e) {
|
||||
WARN(e);
|
||||
logger.warn(e);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -364,7 +361,7 @@ function parseRDFManifest(aId, aUpdateKey, aRequest) {
|
|||
if (result.updateURL && AddonManager.checkUpdateSecurity &&
|
||||
result.updateURL.substring(0, 6) != "https:" &&
|
||||
(!result.updateHash || result.updateHash.substring(0, 3) != "sha")) {
|
||||
WARN("updateLink " + result.updateURL + " is not secure and is not verified" +
|
||||
logger.warn("updateLink " + result.updateURL + " is not secure and is not verified" +
|
||||
" by a strong enough hash (needs to be sha1 or stronger).");
|
||||
delete result.updateURL;
|
||||
delete result.updateHash;
|
||||
|
@ -401,7 +398,7 @@ function UpdateParser(aId, aUpdateKey, aUrl, aObserver) {
|
|||
catch (e) {
|
||||
}
|
||||
|
||||
LOG("Requesting " + aUrl);
|
||||
logger.debug("Requesting " + aUrl);
|
||||
try {
|
||||
this.request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
|
||||
createInstance(Ci.nsIXMLHttpRequest);
|
||||
|
@ -419,7 +416,7 @@ function UpdateParser(aId, aUpdateKey, aUrl, aObserver) {
|
|||
this.request.send(null);
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("Failed to request update manifest", e);
|
||||
logger.error("Failed to request update manifest", e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -453,14 +450,14 @@ UpdateParser.prototype = {
|
|||
}
|
||||
|
||||
if (!Components.isSuccessCode(request.status)) {
|
||||
WARN("Request failed: " + this.url + " - " + request.status);
|
||||
logger.warn("Request failed: " + this.url + " - " + request.status);
|
||||
this.notifyError(AddonUpdateChecker.ERROR_DOWNLOAD_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
let channel = request.channel;
|
||||
if (channel instanceof Ci.nsIHttpChannel && !channel.requestSucceeded) {
|
||||
WARN("Request failed: " + this.url + " - " + channel.responseStatus +
|
||||
logger.warn("Request failed: " + this.url + " - " + channel.responseStatus +
|
||||
": " + channel.responseStatusText);
|
||||
this.notifyError(AddonUpdateChecker.ERROR_DOWNLOAD_ERROR);
|
||||
return;
|
||||
|
@ -468,7 +465,7 @@ UpdateParser.prototype = {
|
|||
|
||||
let xml = request.responseXML;
|
||||
if (!xml || xml.documentElement.namespaceURI == XMLURI_PARSE_ERROR) {
|
||||
WARN("Update manifest was not valid XML");
|
||||
logger.warn("Update manifest was not valid XML");
|
||||
this.notifyError(AddonUpdateChecker.ERROR_PARSE_ERROR);
|
||||
return;
|
||||
}
|
||||
|
@ -481,7 +478,7 @@ UpdateParser.prototype = {
|
|||
results = parseRDFManifest(this.id, this.updateKey, request);
|
||||
}
|
||||
catch (e) {
|
||||
WARN(e);
|
||||
logger.warn(e);
|
||||
this.notifyError(AddonUpdateChecker.ERROR_PARSE_ERROR);
|
||||
return;
|
||||
}
|
||||
|
@ -490,13 +487,13 @@ UpdateParser.prototype = {
|
|||
this.observer.onUpdateCheckComplete(results);
|
||||
}
|
||||
catch (e) {
|
||||
WARN("onUpdateCheckComplete notification failed", e);
|
||||
logger.warn("onUpdateCheckComplete notification failed", e);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
WARN("Update manifest had an unrecognised namespace: " + xml.documentElement.namespaceURI);
|
||||
logger.warn("Update manifest had an unrecognised namespace: " + xml.documentElement.namespaceURI);
|
||||
this.notifyError(AddonUpdateChecker.ERROR_UNKNOWN_FORMAT);
|
||||
},
|
||||
|
||||
|
@ -505,7 +502,7 @@ UpdateParser.prototype = {
|
|||
*/
|
||||
onTimeout: function() {
|
||||
this.request = null;
|
||||
WARN("Request for " + this.url + " timed out");
|
||||
logger.warn("Request for " + this.url + " timed out");
|
||||
this.notifyError(AddonUpdateChecker.ERROR_TIMEOUT);
|
||||
},
|
||||
|
||||
|
@ -514,22 +511,22 @@ UpdateParser.prototype = {
|
|||
*/
|
||||
onError: function UP_onError() {
|
||||
if (!Components.isSuccessCode(this.request.status)) {
|
||||
WARN("Request failed: " + this.url + " - " + this.request.status);
|
||||
logger.warn("Request failed: " + this.url + " - " + this.request.status);
|
||||
}
|
||||
else if (this.request.channel instanceof Ci.nsIHttpChannel) {
|
||||
try {
|
||||
if (this.request.channel.requestSucceeded) {
|
||||
WARN("Request failed: " + this.url + " - " +
|
||||
logger.warn("Request failed: " + this.url + " - " +
|
||||
this.request.channel.responseStatus + ": " +
|
||||
this.request.channel.responseStatusText);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
WARN("HTTP Request failed for an unknown reason");
|
||||
logger.warn("HTTP Request failed for an unknown reason");
|
||||
}
|
||||
}
|
||||
else {
|
||||
WARN("Request failed for an unknown reason");
|
||||
logger.warn("Request failed for an unknown reason");
|
||||
}
|
||||
|
||||
this.request = null;
|
||||
|
@ -546,7 +543,7 @@ UpdateParser.prototype = {
|
|||
this.observer.onUpdateCheckError(aStatus);
|
||||
}
|
||||
catch (e) {
|
||||
WARN("onUpdateCheckError notification failed", e);
|
||||
logger.warn("onUpdateCheckError notification failed", e);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -6,24 +6,23 @@
|
|||
|
||||
const Cc = Components.classes;
|
||||
const Ci = Components.interfaces;
|
||||
const Cu = Components.utils;
|
||||
|
||||
this.EXPORTED_SYMBOLS = [];
|
||||
|
||||
Components.utils.import("resource://gre/modules/AddonManager.jsm");
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/AddonManager.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
const URI_EXTENSION_STRINGS = "chrome://mozapps/locale/extensions/extensions.properties";
|
||||
const STRING_TYPE_NAME = "type.%ID%.name";
|
||||
const LIST_UPDATED_TOPIC = "plugins-list-updated";
|
||||
|
||||
for (let name of ["LOG", "WARN", "ERROR"]) {
|
||||
this.__defineGetter__(name, function() {
|
||||
Components.utils.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
const LOGGER_ID = "addons.plugins";
|
||||
|
||||
LogManager.getLogger("addons.plugins", this);
|
||||
return this[name];
|
||||
});
|
||||
}
|
||||
// Create a new logger for use by the Addons Plugin Provider
|
||||
// (Requires AddonManager.jsm)
|
||||
let logger = Log.repository.getLogger(LOGGER_ID);
|
||||
|
||||
function getIDHashForString(aStr) {
|
||||
// return the two-digit hexadecimal code for a byte
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -24,18 +24,12 @@ XPCOMUtils.defineLazyModuleGetter(this, "Promise",
|
|||
XPCOMUtils.defineLazyModuleGetter(this, "OS",
|
||||
"resource://gre/modules/osfile.jsm");
|
||||
|
||||
["LOG", "WARN", "ERROR"].forEach(function(aName) {
|
||||
Object.defineProperty(this, aName, {
|
||||
get: function logFuncGetter () {
|
||||
Cu.import("resource://gre/modules/addons/AddonLogging.jsm");
|
||||
|
||||
LogManager.getLogger("addons.xpi-utils", this);
|
||||
return this[aName];
|
||||
},
|
||||
configurable: true
|
||||
});
|
||||
}, this);
|
||||
Cu.import("resource://gre/modules/Log.jsm");
|
||||
const LOGGER_ID = "addons.xpi-utils";
|
||||
|
||||
// Create a new logger for use by the Addons XPI Provider Utils
|
||||
// (Requires AddonManager.jsm)
|
||||
let logger = Log.repository.getLogger(LOGGER_ID);
|
||||
|
||||
const KEY_PROFILEDIR = "ProfD";
|
||||
const FILE_DATABASE = "extensions.sqlite";
|
||||
|
@ -152,7 +146,7 @@ function makeSafe(aCallback) {
|
|||
aCallback(...aArgs);
|
||||
}
|
||||
catch(ex) {
|
||||
WARN("XPI Database callback failed", ex);
|
||||
logger.warn("XPI Database callback failed", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -195,7 +189,7 @@ function asyncMap(aObjects, aMethod, aCallback) {
|
|||
});
|
||||
}
|
||||
catch (e) {
|
||||
WARN("Async map function failed", e);
|
||||
logger.warn("Async map function failed", e);
|
||||
asyncMap_gotValue(aIndex, undefined);
|
||||
}
|
||||
});
|
||||
|
@ -227,7 +221,7 @@ function resultRows(aStatement) {
|
|||
* An error message
|
||||
*/
|
||||
function logSQLError(aError, aErrorString) {
|
||||
ERROR("SQL error " + aError + ": " + aErrorString);
|
||||
logger.error("SQL error " + aError + ": " + aErrorString);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -442,7 +436,7 @@ this.XPIDatabase = {
|
|||
count => {
|
||||
// Update the XPIDB schema version preference the first time we successfully
|
||||
// save the database.
|
||||
LOG("XPI Database saved, setting schema version preference to " + DB_SCHEMA);
|
||||
logger.debug("XPI Database saved, setting schema version preference to " + DB_SCHEMA);
|
||||
Services.prefs.setIntPref(PREF_DB_SCHEMA, DB_SCHEMA);
|
||||
// Reading the DB worked once, so we don't need the load error
|
||||
this._loadError = null;
|
||||
|
@ -450,7 +444,7 @@ this.XPIDatabase = {
|
|||
error => {
|
||||
// Need to try setting the schema version again later
|
||||
this._schemaVersionSet = false;
|
||||
WARN("Failed to save XPI database", error);
|
||||
logger.warn("Failed to save XPI database", error);
|
||||
// this._deferredSave.lastError has the most recent error so we don't
|
||||
// need this any more
|
||||
this._loadError = null;
|
||||
|
@ -502,10 +496,10 @@ this.XPIDatabase = {
|
|||
connection = Services.storage.openUnsharedDatabase(dbfile);
|
||||
}
|
||||
catch (e) {
|
||||
WARN("Failed to open sqlite database " + dbfile.path + " for upgrade", e);
|
||||
logger.warn("Failed to open sqlite database " + dbfile.path + " for upgrade", e);
|
||||
return null;
|
||||
}
|
||||
LOG("Migrating data from sqlite");
|
||||
logger.debug("Migrating data from sqlite");
|
||||
let migrateData = this.getMigrateDataFromDatabase(connection);
|
||||
connection.close();
|
||||
return migrateData;
|
||||
|
@ -535,7 +529,7 @@ this.XPIDatabase = {
|
|||
let data = "";
|
||||
try {
|
||||
let readTimer = AddonManagerPrivate.simpleTimer("XPIDB_syncRead_MS");
|
||||
LOG("Opening XPI database " + this.jsonFile.path);
|
||||
logger.debug("Opening XPI database " + this.jsonFile.path);
|
||||
fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].
|
||||
createInstance(Components.interfaces.nsIFileInputStream);
|
||||
fstream.init(this.jsonFile, -1, 0, 0);
|
||||
|
@ -555,7 +549,7 @@ this.XPIDatabase = {
|
|||
this.parseDB(data, aRebuildOnError);
|
||||
}
|
||||
catch(e) {
|
||||
ERROR("Failed to load XPI JSON data from profile", e);
|
||||
logger.error("Failed to load XPI JSON data from profile", e);
|
||||
let rebuildTimer = AddonManagerPrivate.simpleTimer("XPIDB_rebuildReadFailed_MS");
|
||||
this.rebuildDatabase(aRebuildOnError);
|
||||
rebuildTimer.done();
|
||||
|
@ -601,7 +595,7 @@ this.XPIDatabase = {
|
|||
if (!("schemaVersion" in inputAddons) || !("addons" in inputAddons)) {
|
||||
parseTimer.done();
|
||||
// Content of JSON file is bad, need to rebuild from scratch
|
||||
ERROR("bad JSON file contents");
|
||||
logger.error("bad JSON file contents");
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_startupError", "badJSON");
|
||||
let rebuildTimer = AddonManagerPrivate.simpleTimer("XPIDB_rebuildBadJSON_MS");
|
||||
this.rebuildDatabase(aRebuildOnError);
|
||||
|
@ -614,7 +608,7 @@ this.XPIDatabase = {
|
|||
// don't know about (bug 902956)
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_startupError",
|
||||
"schemaMismatch-" + inputAddons.schemaVersion);
|
||||
LOG("JSON schema mismatch: expected " + DB_SCHEMA +
|
||||
logger.debug("JSON schema mismatch: expected " + DB_SCHEMA +
|
||||
", actual " + inputAddons.schemaVersion);
|
||||
// When we rev the schema of the JSON database, we need to make sure we
|
||||
// force the DB to save so that the DB_SCHEMA value in the JSON file and
|
||||
|
@ -629,7 +623,7 @@ this.XPIDatabase = {
|
|||
};
|
||||
parseTimer.done();
|
||||
this.addonDB = addonDB;
|
||||
LOG("Successfully read XPI database");
|
||||
logger.debug("Successfully read XPI database");
|
||||
this.initialized = true;
|
||||
}
|
||||
catch(e) {
|
||||
|
@ -637,11 +631,11 @@ this.XPIDatabase = {
|
|||
// parser, the xpcshell test harness fails the test for us: bug 870828
|
||||
parseTimer.done();
|
||||
if (e.name == "SyntaxError") {
|
||||
ERROR("Syntax error parsing saved XPI JSON data");
|
||||
logger.error("Syntax error parsing saved XPI JSON data");
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_startupError", "syntax");
|
||||
}
|
||||
else {
|
||||
ERROR("Failed to load XPI JSON data from profile", e);
|
||||
logger.error("Failed to load XPI JSON data from profile", e);
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_startupError", "other");
|
||||
}
|
||||
let rebuildTimer = AddonManagerPrivate.simpleTimer("XPIDB_rebuildReadFailed_MS");
|
||||
|
@ -659,7 +653,7 @@ this.XPIDatabase = {
|
|||
let schemaVersion = Services.prefs.getIntPref(PREF_DB_SCHEMA);
|
||||
if (schemaVersion <= LAST_SQLITE_DB_SCHEMA) {
|
||||
// we should have an older SQLITE database
|
||||
LOG("Attempting to upgrade from SQLITE database");
|
||||
logger.debug("Attempting to upgrade from SQLITE database");
|
||||
this.migrateData = this.getMigrateDataFromSQLITE();
|
||||
}
|
||||
else {
|
||||
|
@ -684,7 +678,7 @@ this.XPIDatabase = {
|
|||
*/
|
||||
rebuildUnreadableDB: function(aError, aRebuildOnError) {
|
||||
let rebuildTimer = AddonManagerPrivate.simpleTimer("XPIDB_rebuildUnreadableDB_MS");
|
||||
WARN("Extensions database " + this.jsonFile.path +
|
||||
logger.warn("Extensions database " + this.jsonFile.path +
|
||||
" exists but is not readable; rebuilding", aError);
|
||||
// Remember the error message until we try and write at least once, so
|
||||
// we know at shutdown time that there was a problem
|
||||
|
@ -708,21 +702,21 @@ this.XPIDatabase = {
|
|||
return this._dbPromise;
|
||||
}
|
||||
|
||||
LOG("Starting async load of XPI database " + this.jsonFile.path);
|
||||
logger.debug("Starting async load of XPI database " + this.jsonFile.path);
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_async_load", XPIProvider.runPhase);
|
||||
let readOptions = {
|
||||
outExecutionDuration: 0
|
||||
};
|
||||
return this._dbPromise = OS.File.read(this.jsonFile.path, null, readOptions).then(
|
||||
byteArray => {
|
||||
LOG("Async JSON file read took " + readOptions.outExecutionDuration + " MS");
|
||||
logger.debug("Async JSON file read took " + readOptions.outExecutionDuration + " MS");
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_asyncRead_MS",
|
||||
readOptions.outExecutionDuration);
|
||||
if (this._addonDB) {
|
||||
LOG("Synchronous load completed while waiting for async load");
|
||||
logger.debug("Synchronous load completed while waiting for async load");
|
||||
return this.addonDB;
|
||||
}
|
||||
LOG("Finished async read of XPI database, parsing...");
|
||||
logger.debug("Finished async read of XPI database, parsing...");
|
||||
let decodeTimer = AddonManagerPrivate.simpleTimer("XPIDB_decode_MS");
|
||||
let decoder = new TextDecoder();
|
||||
let data = decoder.decode(byteArray);
|
||||
|
@ -733,7 +727,7 @@ this.XPIDatabase = {
|
|||
.then(null,
|
||||
error => {
|
||||
if (this._addonDB) {
|
||||
LOG("Synchronous load completed while waiting for async load");
|
||||
logger.debug("Synchronous load completed while waiting for async load");
|
||||
return this.addonDB;
|
||||
}
|
||||
if (error.becauseNoSuchFile) {
|
||||
|
@ -762,7 +756,7 @@ this.XPIDatabase = {
|
|||
|
||||
if (XPIProvider.installStates && XPIProvider.installStates.length == 0) {
|
||||
// No extensions installed, so we're done
|
||||
LOG("Rebuilding XPI database with no extensions");
|
||||
logger.debug("Rebuilding XPI database with no extensions");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -772,12 +766,12 @@ this.XPIDatabase = {
|
|||
this.activeBundles = this.getActiveBundles();
|
||||
|
||||
if (aRebuildOnError) {
|
||||
WARN("Rebuilding add-ons database from installed extensions.");
|
||||
logger.warn("Rebuilding add-ons database from installed extensions.");
|
||||
try {
|
||||
XPIProvider.processFileChanges(XPIProvider.installStates, {}, false);
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("Failed to rebuild XPI database from installed extensions", e);
|
||||
logger.error("Failed to rebuild XPI database from installed extensions", e);
|
||||
}
|
||||
// Make sure to update the active add-ons and add-ons list on shutdown
|
||||
Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, true);
|
||||
|
@ -814,7 +808,7 @@ this.XPIDatabase = {
|
|||
bundles.push(parser.getString("ExtensionDirs", keys.getNext()));
|
||||
}
|
||||
catch (e) {
|
||||
WARN("Failed to parse extensions.ini", e);
|
||||
logger.warn("Failed to parse extensions.ini", e);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -838,7 +832,7 @@ this.XPIDatabase = {
|
|||
if (!rdffile.exists())
|
||||
return null;
|
||||
|
||||
LOG("Migrating data from " + FILE_OLD_DATABASE);
|
||||
logger.debug("Migrating data from " + FILE_OLD_DATABASE);
|
||||
let migrateData = {};
|
||||
|
||||
try {
|
||||
|
@ -890,7 +884,7 @@ this.XPIDatabase = {
|
|||
}
|
||||
}
|
||||
catch (e) {
|
||||
WARN("Error reading " + FILE_OLD_DATABASE, e);
|
||||
logger.warn("Error reading " + FILE_OLD_DATABASE, e);
|
||||
migrateData = null;
|
||||
}
|
||||
|
||||
|
@ -930,7 +924,7 @@ this.XPIDatabase = {
|
|||
}
|
||||
|
||||
if (reqCount < REQUIRED.length) {
|
||||
ERROR("Unable to read anything useful from the database");
|
||||
logger.error("Unable to read anything useful from the database");
|
||||
return null;
|
||||
}
|
||||
stmt.finalize();
|
||||
|
@ -975,7 +969,7 @@ this.XPIDatabase = {
|
|||
}
|
||||
catch (e) {
|
||||
// An error here means the schema is too different to read
|
||||
ERROR("Error migrating data", e);
|
||||
logger.error("Error migrating data", e);
|
||||
return null;
|
||||
}
|
||||
finally {
|
||||
|
@ -995,7 +989,7 @@ this.XPIDatabase = {
|
|||
* all cleanup is done
|
||||
*/
|
||||
shutdown: function XPIDB_shutdown() {
|
||||
LOG("shutdown");
|
||||
logger.debug("shutdown");
|
||||
if (this.initialized) {
|
||||
// If our last database I/O had an error, try one last time to save.
|
||||
if (this.lastError)
|
||||
|
@ -1016,7 +1010,7 @@ this.XPIDatabase = {
|
|||
// are finished cleaning up
|
||||
let flushPromise = this.flush();
|
||||
flushPromise.then(null, error => {
|
||||
ERROR("Flush of XPI database failed", error);
|
||||
logger.error("Flush of XPI database failed", error);
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_shutdownFlush_failed", 1);
|
||||
// If our last attempt to read or write the DB failed, force a new
|
||||
// extensions.ini to be written to disk on the next startup
|
||||
|
@ -1073,7 +1067,7 @@ this.XPIDatabase = {
|
|||
})
|
||||
.then(null,
|
||||
error => {
|
||||
ERROR("getAddonList failed", e);
|
||||
logger.error("getAddonList failed", e);
|
||||
makeSafe(aCallback)([]);
|
||||
});
|
||||
},
|
||||
|
@ -1093,7 +1087,7 @@ this.XPIDatabase = {
|
|||
})
|
||||
.then(null,
|
||||
error => {
|
||||
ERROR("getAddon failed", e);
|
||||
logger.error("getAddon failed", e);
|
||||
makeSafe(aCallback)(null);
|
||||
});
|
||||
},
|
||||
|
@ -1167,7 +1161,7 @@ this.XPIDatabase = {
|
|||
// jank-tastic! Must synchronously load DB if the theme switches from
|
||||
// an XPI theme to a lightweight theme before the DB has loaded,
|
||||
// because we're called from sync XPIProvider.addonChanged
|
||||
WARN("Synchronous load of XPI database due to getAddonsByType(" + aType + ")");
|
||||
logger.warn("Synchronous load of XPI database due to getAddonsByType(" + aType + ")");
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_lateOpen_byType", XPIProvider.runPhase);
|
||||
this.syncLoadDB(true);
|
||||
}
|
||||
|
@ -1184,7 +1178,7 @@ this.XPIDatabase = {
|
|||
getVisibleAddonForInternalName: function XPIDB_getVisibleAddonForInternalName(aInternalName) {
|
||||
if (!this.addonDB) {
|
||||
// This may be called when the DB hasn't otherwise been loaded
|
||||
WARN("Synchronous load of XPI database due to getVisibleAddonForInternalName");
|
||||
logger.warn("Synchronous load of XPI database due to getVisibleAddonForInternalName");
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_lateOpen_forInternalName",
|
||||
XPIProvider.runPhase);
|
||||
this.syncLoadDB(true);
|
||||
|
@ -1321,10 +1315,10 @@ this.XPIDatabase = {
|
|||
* A callback to pass the DBAddonInternal to
|
||||
*/
|
||||
makeAddonVisible: function XPIDB_makeAddonVisible(aAddon) {
|
||||
LOG("Make addon " + aAddon._key + " visible");
|
||||
logger.debug("Make addon " + aAddon._key + " visible");
|
||||
for (let [, otherAddon] of this.addonDB) {
|
||||
if ((otherAddon.id == aAddon.id) && (otherAddon._key != aAddon._key)) {
|
||||
LOG("Hide addon " + otherAddon._key);
|
||||
logger.debug("Hide addon " + otherAddon._key);
|
||||
otherAddon.visible = false;
|
||||
}
|
||||
}
|
||||
|
@ -1378,7 +1372,7 @@ this.XPIDatabase = {
|
|||
* The DBAddonInternal to update
|
||||
*/
|
||||
updateAddonActive: function XPIDB_updateAddonActive(aAddon, aActive) {
|
||||
LOG("Updating active state for add-on " + aAddon.id + " to " + aActive);
|
||||
logger.debug("Updating active state for add-on " + aAddon.id + " to " + aActive);
|
||||
|
||||
aAddon.active = aActive;
|
||||
this.saveChanges();
|
||||
|
@ -1389,13 +1383,13 @@ this.XPIDatabase = {
|
|||
*/
|
||||
updateActiveAddons: function XPIDB_updateActiveAddons() {
|
||||
if (!this.addonDB) {
|
||||
WARN("updateActiveAddons called when DB isn't loaded");
|
||||
logger.warn("updateActiveAddons called when DB isn't loaded");
|
||||
// force the DB to load
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_lateOpen_updateActive",
|
||||
XPIProvider.runPhase);
|
||||
this.syncLoadDB(true);
|
||||
}
|
||||
LOG("Updating add-on states");
|
||||
logger.debug("Updating add-on states");
|
||||
for (let [, addon] of this.addonDB) {
|
||||
let newActive = (addon.visible && !addon.userDisabled &&
|
||||
!addon.softDisabled && !addon.appDisabled &&
|
||||
|
@ -1472,7 +1466,7 @@ this.XPIDatabase = {
|
|||
}
|
||||
|
||||
if (fullCount > 0) {
|
||||
LOG("Writing add-ons list");
|
||||
logger.debug("Writing add-ons list");
|
||||
|
||||
try {
|
||||
let addonsListTmp = FileUtils.getFile(KEY_PROFILEDIR, [FILE_XPI_ADDONS_LIST + ".tmp"],
|
||||
|
@ -1485,19 +1479,19 @@ this.XPIDatabase = {
|
|||
Services.prefs.setCharPref(PREF_EM_ENABLED_ADDONS, enabledAddons.join(","));
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("Failed to write add-ons list to " + addonsListTmp.parent + "/" +
|
||||
logger.error("Failed to write add-ons list to " + addonsListTmp.parent + "/" +
|
||||
FILE_XPI_ADDONS_LIST, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (addonsList.exists()) {
|
||||
LOG("Deleting add-ons list");
|
||||
logger.debug("Deleting add-ons list");
|
||||
try {
|
||||
addonsList.remove(false);
|
||||
}
|
||||
catch (e) {
|
||||
ERROR("Failed to remove " + addonsList.path, e);
|
||||
logger.error("Failed to remove " + addonsList.path, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче