Bug 1456051 - Make addon.uninstall race safe. r?maja_zf
addon.uninstall would return immediately, not waiting for the
onUninstalled listener event to fire. We can eliminate this race
condition by using a promise that resolves when it fires.
MozReview-Commit-ID: E4Mh797X9n8
--- a/testing/marionette/addon.js
+++ b/testing/marionette/addon.js
@@ -21,34 +21,34 @@ const ERRORS = {
[-3]: "ERROR_CORRUPT_FILE: The file appears to be corrupt.",
[-4]: "ERROR_FILE_ACCESS: There was an error accessing the filesystem.",
[-5]: "ERROR_SIGNEDSTATE_REQUIRED: The addon must be signed and isn't.",
};
async function installAddon(file) {
let install = await AddonManager.getInstallForFile(file);
- return new Promise((resolve, reject) => {
+ return new Promise(resolve => {
if (install.error) {
- reject(new UnknownError(ERRORS[install.error]));
+ throw new UnknownError(ERRORS[install.error]);
}
let addonId = install.addon.id;
let success = install => {
if (install.addon.id === addonId) {
install.removeListener(listener);
resolve(install.addon);
}
};
let fail = install => {
if (install.addon.id === addonId) {
install.removeListener(listener);
- reject(new UnknownError(ERRORS[install.error]));
+ throw new UnknownError(ERRORS[install.error]);
}
};
let listener = {
onDownloadCancelled: fail,
onDownloadFailed: fail,
onInstallCancelled: fail,
onInstallFailed: fail,
@@ -118,28 +118,31 @@ addon.install = async function(path, tem
* ID of the addon to uninstall.
*
* @return {Promise}
*
* @throws {UnknownError}
* If there is a problem uninstalling the addon.
*/
addon.uninstall = async function(id) {
- return AddonManager.getAddonByID(id).then(addon => {
+ let candidate = await AddonManager.getAddonByID(id);
+
+ return new Promise(resolve => {
let listener = {
onOperationCancelled: addon => {
- if (addon.id === id) {
+ if (addon.id === candidate.id) {
AddonManager.removeAddonListener(listener);
- throw new UnknownError(`Uninstall of ${id} has been canceled`);
+ throw new UnknownError(`Uninstall of ${candidate.id} has been canceled`);
}
},
+
onUninstalled: addon => {
- if (addon.id === id) {
+ if (addon.id === candidate.id) {
AddonManager.removeAddonListener(listener);
- Promise.resolve();
+ resolve();
}
},
};
AddonManager.addAddonListener(listener);
addon.uninstall();
});
};