Bug 972852 - Handle file errors and fix log messages that were causing addon manager failures. r=Mossop

This commit is contained in:
Irving Reid 2014-02-14 16:40:57 -05:00
parent c9f07e7ea3
commit 12166812fc
2 changed files with 56 additions and 29 deletions

View file

@ -2084,6 +2084,7 @@ var XPIProvider = {
try { try {
AddonManagerPrivate.recordTimestamp("XPI_bootstrap_addons_begin"); AddonManagerPrivate.recordTimestamp("XPI_bootstrap_addons_begin");
for (let id in this.bootstrappedAddons) { for (let id in this.bootstrappedAddons) {
try {
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
file.persistentDescriptor = this.bootstrappedAddons[id].descriptor; file.persistentDescriptor = this.bootstrappedAddons[id].descriptor;
let reason = BOOTSTRAP_REASONS.APP_STARTUP; let reason = BOOTSTRAP_REASONS.APP_STARTUP;
@ -2096,6 +2097,11 @@ var XPIProvider = {
this.bootstrappedAddons[id].type, file, this.bootstrappedAddons[id].type, file,
"startup", reason); "startup", reason);
} }
catch (e) {
ERROR("Failed to load bootstrap addon " + id + " from " +
this.bootstrappedAddons[id].descriptor, e);
}
}
AddonManagerPrivate.recordTimestamp("XPI_bootstrap_addons_end"); AddonManagerPrivate.recordTimestamp("XPI_bootstrap_addons_end");
} }
catch (e) { catch (e) {
@ -2161,8 +2167,8 @@ var XPIProvider = {
// add-ons // add-ons
if (Prefs.getBoolPref(PREF_PENDING_OPERATIONS, false)) { if (Prefs.getBoolPref(PREF_PENDING_OPERATIONS, false)) {
XPIDatabase.updateActiveAddons(); XPIDatabase.updateActiveAddons();
XPIDatabase.writeAddonsList(); Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS,
Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, false); !XPIDatabase.writeAddonsList());
} }
this.installs = null; this.installs = null;
@ -2244,8 +2250,8 @@ var XPIProvider = {
} }
// Ensure any changes to the add-ons list are flushed to disk // Ensure any changes to the add-ons list are flushed to disk
XPIDatabase.writeAddonsList(); Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS,
Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, false); !XPIDatabase.writeAddonsList());
}, },
/** /**
@ -2420,7 +2426,7 @@ var XPIProvider = {
targetDir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY); targetDir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
} }
catch (e) { catch (e) {
ERROR("Failed to create staging directory for add-on " + id, e); ERROR("Failed to create staging directory for add-on " + addon.id, e);
continue; continue;
} }
@ -2428,7 +2434,7 @@ var XPIProvider = {
extractFiles(stagedXPI, targetDir); extractFiles(stagedXPI, targetDir);
} }
catch (e) { catch (e) {
ERROR("Failed to extract staged XPI for add-on " + id + " in " + ERROR("Failed to extract staged XPI for add-on " + addon.id + " in " +
aLocation.name, e); aLocation.name, e);
} }
} }
@ -2437,7 +2443,7 @@ var XPIProvider = {
stagedXPI.moveTo(stagingDir, addon.id + ".xpi"); stagedXPI.moveTo(stagingDir, addon.id + ".xpi");
} }
catch (e) { catch (e) {
ERROR("Failed to move staged XPI for add-on " + id + " in " + ERROR("Failed to move staged XPI for add-on " + addon.id + " in " +
aLocation.name, e); aLocation.name, e);
} }
} }
@ -2455,8 +2461,14 @@ var XPIProvider = {
} }
} }
try {
if (!stagingDir || !stagingDir.exists() || !stagingDir.isDirectory()) if (!stagingDir || !stagingDir.exists() || !stagingDir.isDirectory())
return; return;
}
catch (e) {
WARN("Failed to find staging directory", e);
return;
}
let seenFiles = []; let seenFiles = [];
// Use a snapshot of the directory contents to avoid possible issues with // Use a snapshot of the directory contents to avoid possible issues with
@ -3587,8 +3599,8 @@ var XPIProvider = {
if (extensionListChanged || hasPendingChanges) { if (extensionListChanged || hasPendingChanges) {
LOG("Updating database with changes to installed add-ons"); LOG("Updating database with changes to installed add-ons");
XPIDatabase.updateActiveAddons(); XPIDatabase.updateActiveAddons();
XPIDatabase.writeAddonsList(); Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS,
Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, false); !XPIDatabase.writeAddonsList());
Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS, Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS,
JSON.stringify(this.bootstrappedAddons)); JSON.stringify(this.bootstrappedAddons));
return true; return true;

View file

@ -1409,6 +1409,7 @@ this.XPIDatabase = {
/** /**
* Writes out the XPI add-ons list for the platform to read. * Writes out the XPI add-ons list for the platform to read.
* @return true if the file was successfully updated, false otherwise
*/ */
writeAddonsList: function XPIDB_writeAddonsList() { writeAddonsList: function XPIDB_writeAddonsList() {
if (!this.addonDB) { if (!this.addonDB) {
@ -1473,6 +1474,7 @@ this.XPIDatabase = {
if (fullCount > 0) { if (fullCount > 0) {
LOG("Writing add-ons list"); LOG("Writing add-ons list");
try {
let addonsListTmp = FileUtils.getFile(KEY_PROFILEDIR, [FILE_XPI_ADDONS_LIST + ".tmp"], let addonsListTmp = FileUtils.getFile(KEY_PROFILEDIR, [FILE_XPI_ADDONS_LIST + ".tmp"],
true); true);
var fos = FileUtils.openFileOutputStream(addonsListTmp); var fos = FileUtils.openFileOutputStream(addonsListTmp);
@ -1482,13 +1484,26 @@ this.XPIDatabase = {
Services.prefs.setCharPref(PREF_EM_ENABLED_ADDONS, enabledAddons.join(",")); Services.prefs.setCharPref(PREF_EM_ENABLED_ADDONS, enabledAddons.join(","));
} }
catch (e) {
ERROR("Failed to write add-ons list to " + addonsListTmp.parent + "/" +
FILE_XPI_ADDONS_LIST, e);
return false;
}
}
else { else {
if (addonsList.exists()) { if (addonsList.exists()) {
LOG("Deleting add-ons list"); LOG("Deleting add-ons list");
try {
addonsList.remove(false); addonsList.remove(false);
} }
catch (e) {
ERROR("Failed to remove " + addonsList.path, e);
return false;
}
}
Services.prefs.clearUserPref(PREF_EM_ENABLED_ADDONS); Services.prefs.clearUserPref(PREF_EM_ENABLED_ADDONS);
} }
return true;
} }
}; };