зеркало из 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;
|
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
|
* Gets the staging directory to put add-ons that are pending install and
|
||||||
* uninstall into.
|
* uninstall into.
|
||||||
|
@ -8522,12 +8559,35 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
||||||
}
|
}
|
||||||
|
|
||||||
requestStagingDir() {
|
requestStagingDir() {
|
||||||
|
this._stagingDirLock++;
|
||||||
|
if (this._stagingDirPromise)
|
||||||
|
return this._stagingDirPromise;
|
||||||
|
|
||||||
this._addonSet = SystemAddonInstallLocation._loadAddonSet();
|
this._addonSet = SystemAddonInstallLocation._loadAddonSet();
|
||||||
if (this._addonSet.directory) {
|
if (this._addonSet.directory) {
|
||||||
this._directory = this._baseDir.clone();
|
this._directory = this._baseDir.clone();
|
||||||
this._directory.append(this._addonSet.directory);
|
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
|
* @param {Object} aAddonSet - object containing schema, directory and set
|
||||||
* of system add-on IDs and versions.
|
* of system add-on IDs and versions.
|
||||||
*/
|
*/
|
||||||
static _saveAddonSet(aAddonSet) {
|
_saveAddonSet(aAddonSet) {
|
||||||
Preferences.set(PREF_SYSTEM_ADDON_SET, JSON.stringify(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
|
// remove everything from the pref first, if uninstall
|
||||||
// fails then at least they will not be re-activated on
|
// fails then at least they will not be re-activated on
|
||||||
// next restart.
|
// next restart.
|
||||||
SystemAddonInstallLocation._saveAddonSet({ schema: 1, addons: {} });
|
this._saveAddonSet({ schema: 1, addons: {} });
|
||||||
|
|
||||||
// If this is running at app startup, the pref being cleared
|
// If this is running at app startup, the pref being cleared
|
||||||
// will cause later stages of startup to notice that the
|
// will cause later stages of startup to notice that the
|
||||||
|
@ -8750,7 +8810,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
||||||
|
|
||||||
// Record the new upgrade directory.
|
// Record the new upgrade directory.
|
||||||
let state = { schema: 1, directory: newDir.leafName, addons: {} };
|
let state = { schema: 1, directory: newDir.leafName, addons: {} };
|
||||||
SystemAddonInstallLocation._saveAddonSet(state);
|
this._saveAddonSet(state);
|
||||||
|
|
||||||
this._nextDir = newDir;
|
this._nextDir = newDir;
|
||||||
let location = this;
|
let location = this;
|
||||||
|
@ -8791,7 +8851,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
||||||
}
|
}
|
||||||
|
|
||||||
previousState = SystemAddonInstallLocation._loadAddonSet();
|
previousState = SystemAddonInstallLocation._loadAddonSet();
|
||||||
SystemAddonInstallLocation._saveAddonSet(state);
|
this._saveAddonSet(state);
|
||||||
|
|
||||||
let blockers = aAddons.filter(
|
let blockers = aAddons.filter(
|
||||||
addon => AddonManagerPrivate.hasUpgradeListener(addon.id)
|
addon => AddonManagerPrivate.hasUpgradeListener(addon.id)
|
||||||
|
@ -8805,7 +8865,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Roll back to previous upgrade set (if present) on restart.
|
// Roll back to previous upgrade set (if present) on restart.
|
||||||
if (previousState) {
|
if (previousState) {
|
||||||
SystemAddonInstallLocation._saveAddonSet(previousState);
|
this._saveAddonSet(previousState);
|
||||||
}
|
}
|
||||||
// Otherwise, roll back to built-in set on restart.
|
// Otherwise, roll back to built-in set on restart.
|
||||||
// TODO try to do these restartlessly
|
// TODO try to do these restartlessly
|
||||||
|
@ -8824,7 +8884,7 @@ class SystemAddonInstallLocation extends MutableDirectoryInstallLocation {
|
||||||
* Resumes upgrade of a previously-delayed add-on set.
|
* Resumes upgrade of a previously-delayed add-on set.
|
||||||
*/
|
*/
|
||||||
async resumeAddonSet(installs) {
|
async resumeAddonSet(installs) {
|
||||||
async function resumeAddon(install) {
|
function resumeAddon(install) {
|
||||||
install.state = AddonManager.STATE_DOWNLOADED;
|
install.state = AddonManager.STATE_DOWNLOADED;
|
||||||
install.installLocation.releaseStagingDir();
|
install.installLocation.releaseStagingDir();
|
||||||
install.install();
|
install.install();
|
||||||
|
@ -9016,6 +9076,24 @@ class WinRegInstallLocation extends DirectoryInstallLocation {
|
||||||
return this._name;
|
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
|
* @see DirectoryInstallLocation
|
||||||
*/
|
*/
|
||||||
|
|
Загрузка…
Ссылка в новой задаче