зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 2cc97556735f (bug 1314177)
This commit is contained in:
Родитель
57a56e6831
Коммит
25f379b71a
|
@ -8500,6 +8500,43 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
this.locked = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the specified files or directories in the staging directory and
|
||||
* then if the staging directory is empty attempts to remove it.
|
||||
*
|
||||
* @param aLeafNames
|
||||
* An array of file or directory to remove from the directory, the
|
||||
* array may be empty
|
||||
*/
|
||||
cleanStagingDir(aLeafNames = []) {
|
||||
let dir = this.getStagingDir();
|
||||
|
||||
for (let name of aLeafNames) {
|
||||
let file = dir.clone();
|
||||
file.append(name);
|
||||
recursiveRemove(file);
|
||||
}
|
||||
|
||||
if (this._stagingDirLock > 0)
|
||||
return;
|
||||
|
||||
let dirEntries = dir.directoryEntries.QueryInterface(Ci.nsIDirectoryEnumerator);
|
||||
try {
|
||||
if (dirEntries.nextFile)
|
||||
return;
|
||||
} finally {
|
||||
dirEntries.close();
|
||||
}
|
||||
|
||||
try {
|
||||
setFilePermissions(dir, FileUtils.PERMS_DIRECTORY);
|
||||
dir.remove(false);
|
||||
} catch (e) {
|
||||
logger.warn("Failed to remove staging dir", e);
|
||||
// Failing to remove the staging directory is ignorable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the staging directory to put add-ons that are pending install and
|
||||
* uninstall into.
|
||||
|
@ -8522,12 +8559,35 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
}
|
||||
|
||||
requestStagingDir() {
|
||||
this._stagingDirLock++;
|
||||
if (this._stagingDirPromise)
|
||||
return this._stagingDirPromise;
|
||||
|
||||
this._addonSet = SystemAddonInstallLocation._loadAddonSet();
|
||||
if (this._addonSet.directory) {
|
||||
this._directory = this._baseDir.clone();
|
||||
this._directory.append(this._addonSet.directory);
|
||||
}
|
||||
return super.requestStagingDir();
|
||||
|
||||
OS.File.makeDir(this._directory.path);
|
||||
let stagepath = OS.Path.join(this._directory.path, DIR_STAGE);
|
||||
return this._stagingDirPromise = OS.File.makeDir(stagepath).then(null, (e) => {
|
||||
if (e instanceof OS.File.Error && e.becauseExists)
|
||||
return;
|
||||
logger.error("Failed to create staging directory", e);
|
||||
throw e;
|
||||
});
|
||||
}
|
||||
|
||||
releaseStagingDir() {
|
||||
this._stagingDirLock--;
|
||||
|
||||
if (this._stagingDirLock == 0) {
|
||||
this._stagingDirPromise = null;
|
||||
this.cleanStagingDir();
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -8555,7 +8615,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
* @param {Object} aAddonSet - object containing schema, directory and set
|
||||
* of system add-on IDs and versions.
|
||||
*/
|
||||
static _saveAddonSet(aAddonSet) {
|
||||
_saveAddonSet(aAddonSet) {
|
||||
Preferences.set(PREF_SYSTEM_ADDON_SET, JSON.stringify(aAddonSet));
|
||||
}
|
||||
|
||||
|
@ -8640,7 +8700,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
// remove everything from the pref first, if uninstall
|
||||
// fails then at least they will not be re-activated on
|
||||
// next restart.
|
||||
SystemAddonInstallLocation._saveAddonSet({ schema: 1, addons: {} });
|
||||
this._saveAddonSet({ schema: 1, addons: {} });
|
||||
|
||||
// If this is running at app startup, the pref being cleared
|
||||
// will cause later stages of startup to notice that the
|
||||
|
@ -8750,7 +8810,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
|
||||
// Record the new upgrade directory.
|
||||
let state = { schema: 1, directory: newDir.leafName, addons: {} };
|
||||
SystemAddonInstallLocation._saveAddonSet(state);
|
||||
this._saveAddonSet(state);
|
||||
|
||||
this._nextDir = newDir;
|
||||
let location = this;
|
||||
|
@ -8791,7 +8851,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
}
|
||||
|
||||
previousState = SystemAddonInstallLocation._loadAddonSet();
|
||||
SystemAddonInstallLocation._saveAddonSet(state);
|
||||
this._saveAddonSet(state);
|
||||
|
||||
let blockers = aAddons.filter(
|
||||
addon => AddonManagerPrivate.hasUpgradeListener(addon.id)
|
||||
|
@ -8805,7 +8865,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
} catch (e) {
|
||||
// Roll back to previous upgrade set (if present) on restart.
|
||||
if (previousState) {
|
||||
SystemAddonInstallLocation._saveAddonSet(previousState);
|
||||
this._saveAddonSet(previousState);
|
||||
}
|
||||
// Otherwise, roll back to built-in set on restart.
|
||||
// TODO try to do these restartlessly
|
||||
|
@ -8824,7 +8884,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
|||
* Resumes upgrade of a previously-delayed add-on set.
|
||||
*/
|
||||
async resumeAddonSet(installs) {
|
||||
async function resumeAddon(install) {
|
||||
function resumeAddon(install) {
|
||||
install.state = AddonManager.STATE_DOWNLOADED;
|
||||
install.installLocation.releaseStagingDir();
|
||||
install.install();
|
||||
|
@ -9016,6 +9076,24 @@ class WinRegInstallLocation extends DirectoryInstallLocation {
|
|||
return this._name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the scope of this install location.
|
||||
*/
|
||||
get scope() {
|
||||
return this._scope;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an array of nsIFiles for add-ons installed in this location.
|
||||
*/
|
||||
getAddonLocations() {
|
||||
let locations = new Map();
|
||||
for (let id in this._IDToFileMap) {
|
||||
locations.set(id, this._IDToFileMap[id].clone());
|
||||
}
|
||||
return locations;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DirectoryInstallLocation
|
||||
*/
|
||||
|
|
Загрузка…
Ссылка в новой задаче