Bug 853388: Keep trying to save JSON even if read or save fails; r=unfocused

This commit is contained in:
Irving Reid 2013-08-08 16:08:42 -04:00
parent a829a4d782
commit 979232b8d2
82 changed files with 994 additions and 907 deletions

View File

@ -73,10 +73,14 @@ function DeferredSave(aPath, aDataProvider, aDelay) {
// Some counters for telemetry
// The total number of times the file was written
this.totalSaves = 0;
// The number of times the data became dirty while
// another save was in progress
this.overlappedSaves = 0;
// Error returned by the most recent write (if any)
this._lastError = null;
if (aDelay && (aDelay > 0))
this._delay = aDelay;
else
@ -88,7 +92,7 @@ DeferredSave.prototype = {
return this._pending || this.writeInProgress;
},
get error() {
get lastError() {
return this._lastError;
},

View File

@ -1884,9 +1884,9 @@ var XPIProvider = {
delete this._uriMappings;
if (gLazyObjectsLoaded) {
XPIDatabase.shutdown(function shutdownCallback() {
XPIDatabase.shutdown(function shutdownCallback(saveError) {
LOG("Notifying XPI shutdown observers");
Services.obs.notifyObservers(null, "xpi-provider-shutdown", null);
Services.obs.notifyObservers(null, "xpi-provider-shutdown", saveError);
});
}
else {
@ -2594,9 +2594,8 @@ var XPIProvider = {
aOldAddon.descriptor = aAddonState.descriptor;
aOldAddon.visible = !(aOldAddon.id in visibleAddons);
XPIDatabase.saveChanges();
// Update the database
XPIDatabase.setAddonDescriptor(aOldAddon, aAddonState.descriptor);
if (aOldAddon.visible) {
visibleAddons[aOldAddon.id] = aOldAddon;
@ -3188,8 +3187,6 @@ var XPIProvider = {
// If the database doesn't exist and there are add-ons installed then we
// must update the database however if there are no add-ons then there is
// no need to update the database.
// Avoid using XPIDatabase.dbFileExists, as that code is lazy-loaded,
// and we want to avoid loading it until absolutely necessary.
let dbFile = FileUtils.getFile(KEY_PROFILEDIR, [FILE_DATABASE], true);
if (!dbFile.exists())
updateDatabase = state.length > 0;

View File

@ -349,7 +349,6 @@ function DBAddonInternal(aLoaded) {
// this change is being detected.
}
// XXX Can we redesign pendingUpgrade?
XPCOMUtils.defineLazyGetter(this, "pendingUpgrade",
function DBA_pendingUpgradeGetter() {
for (let install of XPIProvider.installs) {
@ -426,17 +425,17 @@ this.XPIDatabase = {
migrateData: null,
// Active add-on directories loaded from extensions.ini and prefs at startup.
activeBundles: null,
// Special handling for when the database is locked at first load
lockedDatabase: false,
// XXX may be able to refactor this away
get dbfileExists() {
delete this.dbfileExists;
return this.dbfileExists = this.jsonFile.exists();
},
set dbfileExists(aValue) {
delete this.dbfileExists;
return this.dbfileExists = aValue;
// Saved error object if we fail to read an existing database
_loadError: null,
// Error reported by our most recent attempt to read or write the database, if any
get lastError() {
if (this._loadError)
return this._loadError;
if (this._deferredSave)
return this._deferredSave.lastError;
return null;
},
/**
@ -447,11 +446,6 @@ this.XPIDatabase = {
throw new Error("Attempt to use XPI database when it is not initialized");
}
// handle the "in memory only" case
if (this.lockedDatabase) {
return;
}
if (!this._deferredSave) {
this._deferredSave = new DeferredSave(this.jsonFile.path,
() => JSON.stringify(this),
@ -467,11 +461,16 @@ this.XPIDatabase = {
// save the database.
LOG("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;
},
error => {
// Need to try setting the schema version again later
this._schemaVersionSet = false;
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;
});
}
},
@ -479,16 +478,15 @@ this.XPIDatabase = {
flush: function() {
// handle the "in memory only" and "saveChanges never called" cases
if (!this._deferredSave) {
let done = Promise.defer();
done.resolve(0);
return done.promise;
return Promise.resolve(0);
}
return this._deferredSave.flush();
},
/**
* Converts the current internal state of the XPI addon database to JSON
* Converts the current internal state of the XPI addon database to
* a JSON.stringify()-ready structure
*/
toJSON: function() {
if (!this.addonDB) {
@ -496,13 +494,9 @@ this.XPIDatabase = {
throw new Error("Attempt to save database without loading it first");
}
let addons = [];
for (let [, addon] of this.addonDB) {
addons.push(addon);
}
let toSave = {
schemaVersion: DB_SCHEMA,
addons: addons
addons: [...this.addonDB.values()]
};
return toSave;
},
@ -625,17 +619,16 @@ this.XPIDatabase = {
// Handle mismatched JSON schema version. For now, we assume
// compatibility for JSON data, though we throw away any fields we
// don't know about
// XXX preserve unknown fields during save/restore
LOG("JSON schema mismatch: expected " + DB_SCHEMA +
", actual " + inputAddons.schemaVersion);
}
// If we got here, we probably have good data
// Make AddonInternal instances from the loaded data and save them
let addonDB = new Map();
inputAddons.addons.forEach(function(loadedAddon) {
for (let loadedAddon of inputAddons.addons) {
let newAddon = new DBAddonInternal(loadedAddon);
addonDB.set(newAddon._key, newAddon);
});
};
this.addonDB = addonDB;
LOG("Successfully read XPI database");
this.initialized = true;
@ -677,15 +670,14 @@ this.XPIDatabase = {
/**
* Reconstruct when the DB file exists but is unreadable
* (for example because read permission is denied
* (for example because read permission is denied)
*/
rebuildUnreadableDB: function(aError, aRebuildOnError) {
WARN("Extensions database " + this.jsonFile.path +
" exists but is not readable; rebuilding in memory", aError);
// XXX open question - if we can overwrite at save time, should we, or should we
// leave the locked database in case we can recover from it next time we start up?
// The old code made one attempt to remove the locked file before it rebuilt in memory
this.lockedDatabase = true;
// Remember the error message until we try and write at least once, so
// we know at shutdown time that there was a problem
this._loadError = aError;
// XXX TELEMETRY report when this happens?
this.rebuildDatabase(aRebuildOnError);
},
@ -973,24 +965,26 @@ this.XPIDatabase = {
shutdown: function XPIDB_shutdown(aCallback) {
LOG("shutdown");
if (this.initialized) {
// If we are running with an in-memory database then force a new
// extensions.ini to be written to disk on the next startup
if (this.lockedDatabase)
Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, true);
// If our last database I/O had an error, try one last time to save.
if (this.lastError)
this.saveChanges();
this.initialized = false;
let result = null;
// Make sure any pending writes of the DB are complete, and we
// finish cleaning up, and then call back
this.flush()
.then(null, error => {
ERROR("Flush of XPI database failed", error);
Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, true);
result = error;
return 0;
})
.then(count => {
// 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
let lastSaveFailed = this.lastError;
if (lastSaveFailed)
Services.prefs.setBoolPref(PREF_PENDING_OPERATIONS, true);
// Clear out the cached addons data loaded from JSON
delete this.addonDB;
delete this._dbPromise;
@ -1000,7 +994,7 @@ this.XPIDatabase = {
delete this._schemaVersionSet;
if (aCallback)
aCallback(result);
aCallback(lastSaveFailed);
});
}
else {
@ -1341,20 +1335,6 @@ this.XPIDatabase = {
this.saveChanges();
},
/**
* Synchronously sets the file descriptor for an add-on.
* XXX IRVING could replace this with setAddonProperties
*
* @param aAddon
* The DBAddonInternal being updated
* @param aDescriptor
* File path of the installed addon
*/
setAddonDescriptor: function XPIDB_setAddonDescriptor(aAddon, aDescriptor) {
aAddon.descriptor = aDescriptor;
this.saveChanges();
},
/**
* Synchronously updates an add-on's active flag in the database.
*
@ -1372,8 +1352,6 @@ this.XPIDatabase = {
* Synchronously calculates and updates all the active flags in the database.
*/
updateActiveAddons: function XPIDB_updateActiveAddons() {
// XXX IRVING this may get called during XPI-utils shutdown
// XXX need to make sure PREF_PENDING_OPERATIONS handling is clean
LOG("Updating add-on states");
for (let [, addon] of this.addonDB) {
let newActive = (addon.visible && !addon.userDisabled &&

View File

@ -344,6 +344,10 @@ function do_check_icons(aActual, aExpected) {
}
}
// Record the error (if any) from trying to save the XPI
// database at shutdown time
let gXPISaveError = null;
/**
* Starts up the add-on manager as if it was started by the application.
*
@ -396,26 +400,24 @@ function shutdownManager() {
if (!gInternalManager)
return;
let obs = AM_Cc["@mozilla.org/observer-service;1"].
getService(AM_Ci.nsIObserverService);
let xpiShutdown = false;
obs.addObserver({
Services.obs.addObserver({
observe: function(aSubject, aTopic, aData) {
xpiShutdown = true;
obs.removeObserver(this, "xpi-provider-shutdown");
gXPISaveError = aData;
Services.obs.removeObserver(this, "xpi-provider-shutdown");
}
}, "xpi-provider-shutdown", false);
let repositoryShutdown = false;
obs.addObserver({
Services.obs.addObserver({
observe: function(aSubject, aTopic, aData) {
repositoryShutdown = true;
obs.removeObserver(this, "addon-repository-shutdown");
Services.obs.removeObserver(this, "addon-repository-shutdown");
}
}, "addon-repository-shutdown", false);
obs.notifyObservers(null, "quit-application-granted", null);
Services.obs.notifyObservers(null, "quit-application-granted", null);
let scope = Components.utils.import("resource://gre/modules/AddonManager.jsm");
scope.AddonManagerInternal.shutdown();
gInternalManager = null;
@ -428,14 +430,11 @@ function shutdownManager() {
// Clear any crash report annotations
gAppInfo.annotations = {};
let thr = AM_Cc["@mozilla.org/thread-manager;1"].
getService(AM_Ci.nsIThreadManager).
mainThread;
let thr = Services.tm.mainThread;
// Wait until we observe the shutdown notifications
while (!repositoryShutdown || !xpiShutdown) {
if (thr.hasPendingEvents())
thr.processNextEvent(false);
thr.processNextEvent(true);
}
// Force the XPIProvider provider to reload to better

View File

@ -103,6 +103,6 @@ function run_test_1() {
do_check_eq(JSON.stringify(manifest[i]), JSON.stringify(expected[i]));
}
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -37,8 +37,8 @@ function DeferredSaveTester(aDelay, aDataProvider) {
return tester.saver.flush();
},
get error() {
return tester.saver.error;
get lastError() {
return tester.saver.lastError;
}
};
@ -154,11 +154,11 @@ add_task(function test_error_immediate() {
count => do_throw("Did not get expected error"),
error => do_check_eq(testError.message, error.message)
);
do_check_eq(testError, tester.error);
do_check_eq(testError, tester.lastError);
// This write should succeed and clear the error
yield tester.save("test_error_immediate succeeds");
do_check_eq(null, tester.error);
do_check_eq(null, tester.lastError);
// The failed save attempt counts in our total
do_check_eq(2, tester.saver.totalSaves);
});

View File

@ -335,12 +335,12 @@ const ADDON_IDS = ["softblock1@tests.mozilla.org",
// Don't need the full interface, attempts to call other methods will just
// throw which is just fine
var WindowWatcher = {
openWindow: function(parent, url, name, features, arguments) {
openWindow: function(parent, url, name, features, openArgs) {
// Should be called to list the newly blocklisted items
do_check_eq(url, URI_EXTENSION_BLOCKLIST_DIALOG);
// Simulate auto-disabling any softblocks
var list = arguments.wrappedJSObject.list;
var list = openArgs.wrappedJSObject.list;
list.forEach(function(aItem) {
if (!aItem.blocked)
aItem.disable = true;
@ -1329,7 +1329,7 @@ add_test(function run_manual_update_2_test() {
startupManager(false);
AddonManager.getAddonsByIDs(ADDON_IDS, function([s1, s2, s3, s4, s5, h, r]) {
AddonManager.getAddonsByIDs(ADDON_IDS, callback_soon(function([s1, s2, s3, s4, s5, h, r]) {
check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED);
check_addon(s2, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED);
@ -1347,7 +1347,8 @@ add_test(function run_manual_update_2_test() {
manual_update("2", function manual_update_2_2() {
restartManager();
AddonManager.getAddonsByIDs(ADDON_IDS, function([s1, s2, s3, s4, s5, h, r]) {
AddonManager.getAddonsByIDs(ADDON_IDS,
callback_soon(function([s1, s2, s3, s4, s5, h, r]) {
check_addon(s1, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED);
check_addon(s2, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED);
@ -1375,9 +1376,9 @@ add_test(function run_manual_update_2_test() {
run_next_test();
});
});
});
}));
});
});
}));
});
// Uses the API to install blocked add-ons from the local filesystem

View File

@ -455,7 +455,7 @@ function check_test_7() {
do_check_eq(getShutdownNewVersion(), 0);
do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "2.0");
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
do_check_eq(b1, null);
restartManager();
@ -465,7 +465,7 @@ function check_test_7() {
do_check_bootstrappedPref(run_test_8);
});
});
}));
}
// Test that a bootstrapped extension dropped into the profile loads properly
@ -671,12 +671,15 @@ function run_test_12() {
do_check_in_crash_annotation("bootstrap1@tests.mozilla.org", "1.0");
b1.uninstall();
restartManager();
do_check_bootstrappedPref(run_test_13);
do_execute_soon(test_12_restart);
});
}
function test_12_restart() {
restartManager();
do_check_bootstrappedPref(run_test_13);
}
// Tests that installing a bootstrapped extension with an invalid application
// entry doesn't call it's startup method
@ -703,7 +706,7 @@ function run_test_13() {
}, [
"onInstallStarted",
"onInstallEnded",
], function() {do_execute_soon(check_test_13)});
], callback_soon(check_test_13));
install.install();
});
}
@ -724,23 +727,27 @@ function check_test_13() {
do_check_eq(getActiveVersion(), 0); // Should not have called startup though
do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0");
restartManager();
do_execute_soon(test_13_restart);
});
});
}
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "3.0");
do_check_true(b1.appDisabled);
do_check_false(b1.userDisabled);
do_check_false(b1.isActive);
do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons
do_check_eq(getActiveVersion(), 0); // Should not have called startup though
do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0");
function test_13_restart() {
restartManager();
do_check_bootstrappedPref(function() {
b1.uninstall();
do_execute_soon(run_test_14);
});
});
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "3.0");
do_check_true(b1.appDisabled);
do_check_false(b1.userDisabled);
do_check_false(b1.isActive);
do_check_eq(getInstalledVersion(), 3); // We call install even for disabled add-ons
do_check_eq(getActiveVersion(), 0); // Should not have called startup though
do_check_not_in_crash_annotation("bootstrap1@tests.mozilla.org", "3.0");
do_check_bootstrappedPref(function() {
b1.uninstall();
do_execute_soon(run_test_14);
});
});
}
@ -812,7 +819,7 @@ function run_test_15() {
}, [
"onInstallStarted",
"onInstallEnded",
], function() {do_execute_soon(check_test_15)});
], callback_soon(check_test_15));
install.install();
});
});
@ -854,7 +861,7 @@ function check_test_15() {
function run_test_16() {
resetPrefs();
waitForPref("bootstraptest.startup_reason", function test_16_after_startup() {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
// Should have installed and started
do_check_eq(getInstalledVersion(), 1);
do_check_eq(getActiveVersion(), 1);
@ -872,7 +879,7 @@ function run_test_16() {
gAppInfo.inSafeMode = true;
startupManager(false);
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
// Should still be stopped
do_check_eq(getInstalledVersion(), 1);
do_check_eq(getActiveVersion(), 0);
@ -892,10 +899,10 @@ function run_test_16() {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
b1.uninstall();
run_test_17();
do_execute_soon(run_test_17);
});
});
});
}));
}));
});
installAllFiles([do_get_addon("test_bootstrap1_1")], function() { });
}
@ -1022,7 +1029,7 @@ function run_test_20() {
do_check_eq(getInstallOldVersion(), 1);
do_check_eq(getStartupOldVersion(), 0);
run_test_21();
do_execute_soon(run_test_21);
});
}
@ -1079,7 +1086,7 @@ function run_test_22() {
startupManager();
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
// Should have installed and started
do_check_eq(getInstalledVersion(), 1);
do_check_eq(getActiveVersion(), 1);
@ -1123,7 +1130,7 @@ function run_test_22() {
run_test_23();
});
});
});
}));
}
@ -1197,17 +1204,17 @@ function check_test_23() {
let dir = do_get_addon_root_uri(profileDir, "bootstrap1@tests.mozilla.org");
do_check_eq(b1.getResourceURI("bootstrap.js").spec, dir + "bootstrap.js");
AddonManager.getAddonsWithOperationsByTypes(null, function(list) {
AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) {
do_check_eq(list.length, 0);
restartManager();
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
b1.uninstall();
restartManager();
testserver.stop(run_test_24);
});
});
}));
}));
});
});
});
@ -1274,7 +1281,7 @@ function run_test_25() {
do_check_eq(getInstalledVersion(), 1);
do_check_eq(getActiveVersion(), 1);
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "1.0");
do_check_true(b1.isActive);
@ -1295,7 +1302,7 @@ function run_test_25() {
do_check_bootstrappedPref(run_test_26);
});
});
}));
});
});
installAllFiles([do_get_addon("test_bootstrap1_1")], function test_25_installed() {
@ -1311,7 +1318,7 @@ function run_test_26() {
do_check_eq(getInstalledVersion(), 0);
do_check_eq(getActiveVersion(), 0);
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "4.0");
do_check_true(b1.isActive);
@ -1332,7 +1339,7 @@ function run_test_26() {
do_check_bootstrappedPref(run_test_27);
});
});
}));
});
}
@ -1355,7 +1362,7 @@ function run_test_27() {
do_check_eq(getUninstallNewVersion(), 4);
do_check_eq(getActiveVersion(), 0);
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "4.0");
do_check_false(b1.isActive);
@ -1374,7 +1381,7 @@ function run_test_27() {
do_check_bootstrappedPref(run_test_28);
});
});
}));
});
});
}
@ -1390,7 +1397,7 @@ function run_test_28() {
do_check_eq(getInstallOldVersion(), 4);
do_check_eq(getActiveVersion(), 0);
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "1.0");
do_check_false(b1.isActive);
@ -1414,7 +1421,7 @@ function run_test_28() {
do_check_bootstrappedPref(do_test_finished);
});
});
}));
});
});
}

View File

@ -138,7 +138,7 @@ function run_test() {
installAllFiles([do_get_addon(a.addon) for each (a in ADDONS)], function() {
restartManager();
AddonManager.getAddonByID(ADDONS[0].id, function(addon) {
AddonManager.getAddonByID(ADDONS[0].id, callback_soon(function(addon) {
do_check_true(!(!addon));
addon.userDisabled = true;
restartManager();
@ -168,7 +168,7 @@ function run_test() {
}
}
});
});
}));
});
}

View File

@ -165,7 +165,7 @@ function run_test() {
installAllFiles([do_get_addon(a.addon) for each (a in ADDONS)], function() {
restartManager();
AddonManager.getAddonByID(ADDONS[1].id, function(addon) {
AddonManager.getAddonByID(ADDONS[1].id, callback_soon(function(addon) {
do_check_true(!(!addon));
addon.userDisabled = true;
restartManager();
@ -176,6 +176,6 @@ function run_test() {
item.findUpdates(updateListener, AddonManager.UPDATE_WHEN_USER_REQUESTED);
});
});
});
}));
});
}

View File

@ -28,7 +28,7 @@ function run_test()
do_check_eq(addon.optionsURL, null);
do_check_eq(addon.aboutURL, null);
do_test_finished();
do_execute_soon(do_test_finished);
});
});
});

View File

@ -96,7 +96,7 @@ function run_test()
onUpdateFinished: function(addon, error) {
do_check_eq(error, AddonManager.UPDATE_STATUS_DOWNLOAD_ERROR);
do_check_true(gSeenExpectedURL);
shutdownTest();
do_execute_soon(shutdownTest);
}
}, AddonManager.UPDATE_WHEN_USER_REQUESTED);
});

View File

@ -27,7 +27,7 @@ function run_test()
}
function run_test_1() {
AddonManager.getAddonByID(ID, function(addon) {
AddonManager.getAddonByID(ID, callback_soon(function(addon) {
do_check_neq(addon, null);
do_check_eq(addon.name, "fr Name");
do_check_eq(addon.description, "fr Description");
@ -40,9 +40,9 @@ function run_test_1() {
do_check_neq(newAddon, null);
do_check_eq(newAddon.name, "fr Name");
run_test_2();
do_execute_soon(run_test_2);
});
});
}));
}
function run_test_2() {
@ -55,7 +55,7 @@ function run_test_2() {
do_check_eq(addon.name, "de-DE Name");
do_check_eq(addon.description, null);
run_test_3();
do_execute_soon(run_test_3);
});
}
@ -69,7 +69,7 @@ function run_test_3() {
do_check_eq(addon.name, "de-DE Name");
do_check_eq(addon.description, null);
run_test_4();
do_execute_soon(run_test_4);
});
}
@ -83,7 +83,7 @@ function run_test_4() {
do_check_eq(addon.name, "es-ES Name");
do_check_eq(addon.description, "es-ES Description");
run_test_5();
do_execute_soon(run_test_5);
});
}
@ -97,7 +97,7 @@ function run_test_5() {
if (addon.name != "zh-TW Name" && addon.name != "zh-CN Name")
do_throw("zh matched to " + addon.name);
run_test_6();
do_execute_soon(run_test_6);
});
}
@ -112,6 +112,6 @@ function run_test_6() {
do_check_eq(addon.name, "en Name");
do_check_eq(addon.description, "en Description");
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -21,7 +21,7 @@ function run_test()
do_check_eq(addon.name, "Deutsches W\u00f6rterbuch");
do_check_eq(addon.name.length, 20);
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}

View File

@ -285,7 +285,7 @@ function check_initial_state(callback) {
function check_test_pt1() {
dump("Checking pt 1\n");
AddonManager.getAddonsByIDs([a.id for each (a in ADDONS)], function(addons) {
AddonManager.getAddonsByIDs([a.id for each (a in ADDONS)], callback_soon(function(addons) {
for (var i = 0; i < ADDONS.length; i++) {
if (!addons[i])
do_throw("Addon " + (i + 1) + " did not get installed correctly");
@ -316,7 +316,7 @@ function check_test_pt1() {
gTestCheck = check_test_pt2;
load_blocklist("bug455906_warn.xml");
});
});
}));
}
function check_notification_pt2(args) {
@ -357,7 +357,7 @@ function check_test_pt2() {
restartManager();
dump("Checking results pt 2\n");
AddonManager.getAddonsByIDs([a.id for each (a in ADDONS)], function(addons) {
AddonManager.getAddonsByIDs([a.id for each (a in ADDONS)], callback_soon(function(addons) {
// Should have disabled this add-on as requested
do_check_eq(check_addon_state(addons[2]), "true,true,false");
do_check_eq(check_plugin_state(PLUGINS[2]), "true,false");
@ -386,7 +386,7 @@ function check_test_pt2() {
gNotificationCheck = null;
gTestCheck = run_test_pt3;
load_blocklist("bug455906_start.xml");
});
}));
}
function run_test_pt3() {
@ -485,7 +485,7 @@ function check_test_pt3() {
}
function run_test_pt4() {
AddonManager.getAddonByID(ADDONS[4].id, function(addon) {
AddonManager.getAddonByID(ADDONS[4].id, callback_soon(function(addon) {
addon.userDisabled = false;
PLUGINS[4].enabledState = Ci.nsIPluginTag.STATE_ENABLED;
restartManager();
@ -494,7 +494,7 @@ function run_test_pt4() {
gTestCheck = check_test_pt4;
load_blocklist("bug455906_empty.xml");
});
});
}));
}
function check_notification_pt4(args) {

View File

@ -90,6 +90,6 @@ function run_test_2() {
do_check_neq(a5, null);
do_check_true(a5.isActive);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -89,6 +89,6 @@ function run_test_2() {
do_check_neq(a5, null);
do_check_true(a5.isActive);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -87,6 +87,6 @@ function run_test_2() {
do_check_neq(a5, null);
do_check_true(a5.isActive);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -54,6 +54,6 @@ function run_test_2() {
do_check_neq(addon, null);
do_check_false(addon.isActive);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -16,7 +16,7 @@ function run_test() {
AddonManager.getAddonsByIDs(["bug526598_1@tests.mozilla.org",
"bug526598_2@tests.mozilla.org"],
function([a1, a2]) {
callback_soon(function([a1, a2]) {
do_check_neq(a1, null);
do_check_true(a1.hasResource("install.rdf"));
@ -47,8 +47,8 @@ function run_test() {
do_check_eq(newa1, null);
do_check_eq(newa2, null);
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}));
});
}

View File

@ -31,7 +31,7 @@ function run_test() {
if (!("nsIWindowsRegKey" in Components.interfaces))
do_check_true((file.permissions & 0100) == 0100);
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}

View File

@ -332,7 +332,7 @@ function run_test() {
AddonManager.getAddonsByIDs(["bug542391_2@tests.mozilla.org",
"bug542391_4@tests.mozilla.org"],
function disable_and_restart([a2, a4]) {
callback_soon(function disable_and_restart([a2, a4]) {
do_check_true(a2 != null && a4 != null);
a2.userDisabled = true;
a4.userDisabled = true;
@ -349,7 +349,7 @@ function run_test() {
"bug542391_4@tests.mozilla.org",
"bug542391_5@tests.mozilla.org",
"bug542391_6@tests.mozilla.org"],
function(addons) {
callback_soon(function(addons) {
check_state_v1(addons);
WindowWatcher.expected = true;
@ -372,8 +372,8 @@ function run_test() {
do_execute_soon(run_test_1);
});
});
});
}));
}));
});
}

View File

@ -41,7 +41,7 @@ function end_test() {
}
function run_test_1() {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -50,13 +50,13 @@ function run_test_1() {
gExtensionsJSON.remove(true);
do_execute_soon(check_test_1);
});
}));
}
function check_test_1() {
startupManager(false);
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -67,5 +67,5 @@ function check_test_1() {
do_check_true(gExtensionsJSON.fileSize > 0);
end_test();
});
}));
}

View File

@ -65,7 +65,7 @@ function run_test() {
}
function end_test() {
do_test_finished();
do_execute_soon(do_test_finished);
}
// Checks switching to a different theme and back again leaves everything the
@ -196,7 +196,7 @@ function run_test_2() {
function check_test_2() {
restartManager();
AddonManager.getAddonsByIDs(["default@tests.mozilla.org",
"alternate@tests.mozilla.org"], function([d, a]) {
"alternate@tests.mozilla.org"], callback_soon(function([d, a]) {
do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "alternate/1.0");
do_check_true(d.userDisabled);
@ -255,5 +255,5 @@ function check_test_2() {
end_test();
});
});
}));
}

View File

@ -28,7 +28,7 @@ function run_test() {
startupManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a) {
do_check_neq(a, null);
do_check_eq(a.version, "1.0");
do_check_false(a.userDisabled);
@ -57,7 +57,7 @@ function run_test() {
do_check_true(a.isActive);
do_check_true(isExtensionInAddonsList(profileDir, a.id));
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}));
}

View File

@ -106,7 +106,7 @@ function run_test_2() {
do_check_eq(a1, gAddon);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -47,7 +47,7 @@ function check_test_1() {
do_check_false(b1.userDisabled);
do_check_false(b1.isActive);
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}

View File

@ -141,7 +141,7 @@ function run_test() {
do_check_true(a6.appDisabled);
do_check_false(a6.isActive);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -38,7 +38,7 @@ function run_test() {
startupManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
a1.uninstall();
shutdownManager();
@ -60,7 +60,7 @@ function run_test() {
// Addon2 should have been detected
do_check_neq(a2, null);
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}));
}

View File

@ -96,12 +96,12 @@ function run_test_1() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
check_addon_upgrading(a1);
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
check_addon_upgrading(a1);
fstream.close();
@ -114,8 +114,8 @@ function run_test_1() {
a1.uninstall();
do_execute_soon(run_test_2);
});
});
});
}));
}));
});
});
});
@ -128,7 +128,7 @@ function run_test_2() {
installAllFiles([do_get_addon("test_bug587088_1")], function() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
check_addon(a1, "1.0");
// Lock either install.rdf for unpacked add-ons or the xpi for packed add-ons.
@ -146,12 +146,12 @@ function run_test_2() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
check_addon_uninstalling(a1, true);
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
check_addon_uninstalling(a1, true);
fstream.close();
@ -165,10 +165,10 @@ function run_test_2() {
do_check_false(dir.exists());
do_check_false(isExtensionInAddonsList(profileDir, "addon1@tests.mozilla.org"));
do_test_finished();
do_execute_soon(do_test_finished);
});
});
});
});
}));
}));
}));
});
}

View File

@ -35,6 +35,6 @@ function run_test_2() {
do_check_neq(a1, null);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -135,6 +135,6 @@ function run_test_3() {
do_check_eq(a3, null);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -21,6 +21,6 @@ function run_test() {
AddonManager.getAddonByID("foo", function(aAddon) {
test_string_compare();
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -84,7 +84,7 @@ function run_test_1() {
onUpdateFinished: function() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_false(a1.appDisabled);
do_check_true(a1.isActive);
@ -115,9 +115,9 @@ function run_test_1() {
do_check_false(isExtensionInAddonsList(userDir, a2.id));
do_check_eq(Services.prefs.getIntPref("bootstraptest.active_version"), 1);
run_test_2();
do_execute_soon(run_test_2);
});
});
}));
}
}, AddonManager.UPDATE_WHEN_USER_REQUESTED);
});
@ -125,7 +125,7 @@ function run_test_1() {
//Set up the profile
function run_test_2() {
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(a2) {
do_check_neq(a2, null);
do_check_false(a2.appDisabled);
do_check_true(a2.isActive);
@ -160,5 +160,5 @@ function run_test_2() {
end_test();
});
});
}));
}

View File

@ -290,7 +290,7 @@ function run_test_2() {
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org"],
function([a1, a2, a3, a4]) {
callback_soon(function([a1, a2, a3, a4]) {
do_check_neq(a1, null);
do_check_eq(a1.version, "2.0");
do_check_true(a1.appDisabled);
@ -334,7 +334,7 @@ function run_test_2() {
shutdownManager();
do_test_finished();
});
}));
};
});
}

View File

@ -24,9 +24,7 @@ function run_test() {
}, [
"onInstallStarted",
"onInstallEnded",
], function() {
do_execute_soon(check_test)
});
], callback_soon(check_test));
install.install();
});
}
@ -88,6 +86,6 @@ function check_test() {
do_check_false(target.active);
}
do_test_finished();
do_execute_soon(do_test_finished);
}));
}

View File

@ -35,6 +35,6 @@ function run_test() {
do_check_eq(getInstalledVersion(), "1.0");
do_check_eq(getActiveVersion(), "1.0");
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -81,6 +81,6 @@ function run_test() {
do_check_neq(a4, null);
do_check_in_crash_annotation(addon4.id, addon4.version);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -107,6 +107,6 @@ function run_test_2() {
AddonManager.removeInstallListener(listener2);
AddonManager.removeInstallListener(listener3);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -117,6 +117,6 @@ function run_test_4() {
do_check_true(gCacheFlushed);
gCacheFlushed = false;
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -191,6 +191,6 @@ function run_test_4() {
function([a1, a2, a3, a4, a5]) {
check_state(false, a1, a2, a3, a4, a5);
do_test_finished("checkcompatibility.js");
do_execute_soon(do_test_finished);
});
}

View File

@ -149,7 +149,7 @@ function run_test_1() {
HunspellEngine.listener = function(aEvent) {
HunspellEngine.listener = null;
do_check_eq(aEvent, "addDirectory");
check_test_1();
do_execute_soon(check_test_1);
};
});
install.install();
@ -317,7 +317,8 @@ function check_test_7() {
do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
callback_soon(function(b1) {
do_check_eq(b1, null);
restartManager();
@ -327,7 +328,7 @@ function check_test_7() {
do_execute_soon(run_test_8);
});
});
}));
}
// Test that a bootstrapped extension dropped into the profile loads properly
@ -427,7 +428,8 @@ function run_test_16() {
installAllFiles([do_get_addon("test_dictionary")], function() {
// spin the event loop to let the addon finish starting
do_execute_soon(function check_installed_dictionary() {
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
callback_soon(function(b1) {
// Should have installed and started
do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
@ -439,7 +441,8 @@ function run_test_16() {
gAppInfo.inSafeMode = true;
startupManager(false);
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
callback_soon(function(b1) {
// Should still be stopped
do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
do_check_false(b1.isActive);
@ -456,8 +459,8 @@ function run_test_16() {
do_execute_soon(run_test_17);
});
});
});
}));
}));
});
});
}
@ -483,7 +486,8 @@ function run_test_17() {
startupManager();
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
callback_soon(function(b1) {
// Should have installed and started
do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
do_check_neq(b1, null);
@ -498,7 +502,7 @@ function run_test_17() {
restartManager();
run_test_23();
});
}));
}
// Tests that installing from a URL doesn't require a restart
@ -565,7 +569,7 @@ function check_test_23() {
let dir = do_get_addon_root_uri(profileDir, "ab-CD@dictionaries.addons.mozilla.org");
AddonManager.getAddonsWithOperationsByTypes(null, function(list) {
AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) {
do_check_eq(list.length, 0);
restartManager();
@ -573,7 +577,7 @@ function check_test_23() {
b1.uninstall();
do_execute_soon(run_test_25);
});
});
}));
});
});
}
@ -592,7 +596,8 @@ function run_test_25() {
// Needs a restart to complete this so the old version stays running
do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "1.0");
do_check_true(b1.isActive);
@ -610,7 +615,7 @@ function run_test_25() {
do_execute_soon(run_test_26);
});
});
}));
});
};
@ -624,7 +629,8 @@ function run_test_26() {
// Needs a restart to complete this
do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "2.0");
do_check_true(b1.isActive);
@ -644,7 +650,7 @@ function run_test_26() {
b1.uninstall();
do_execute_soon(run_test_27);
});
});
}));
});
}
@ -674,7 +680,7 @@ function run_test_27() {
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded"
], check_test_27);
], callback_soon(check_test_27));
AddonManagerPrivate.backgroundUpdateCheck();
}
@ -720,7 +726,7 @@ function run_test_28() {
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded"
], check_test_28);
], callback_soon(check_test_28));
AddonManagerPrivate.backgroundUpdateCheck();
}
@ -784,7 +790,7 @@ function check_test_29(install) {
["onUninstalled", false],
]
}, [
], finish_test_29);
], callback_soon(finish_test_29));
b2.uninstall();
});

View File

@ -32,7 +32,7 @@ function run_test() {
startupManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_eq(a1, null);
do_check_not_in_crash_annotation(addon1.id, addon1.version);
@ -57,7 +57,7 @@ function run_test() {
run_test_1();
});
});
}));
}
// Disabling an add-on should work
@ -83,7 +83,7 @@ function run_test_1() {
ensure_test_completed();
AddonManager.getAddonsWithOperationsByTypes(null, function(list) {
AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) {
do_check_eq(list.length, 1);
do_check_eq(list[0].id, "addon1@tests.mozilla.org");
@ -104,7 +104,7 @@ function run_test_1() {
run_test_2();
});
});
}));
});
}
@ -127,7 +127,7 @@ function run_test_2() {
ensure_test_completed();
AddonManager.getAddonsWithOperationsByTypes(null, function(list) {
AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) {
do_check_eq(list.length, 1);
do_check_eq(list[0].id, "addon1@tests.mozilla.org");
@ -149,7 +149,7 @@ function run_test_2() {
run_test_3();
});
});
}));
});
}
@ -161,7 +161,7 @@ function run_test_3() {
]
});
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
a1.userDisabled = true;
ensure_test_completed();
prepare_test({
@ -188,7 +188,7 @@ function run_test_3() {
do_check_true(hasFlag(newa1.permissions, AddonManager.PERM_CAN_DISABLE));
do_check_false(hasFlag(newa1.permissions, AddonManager.PERM_CAN_ENABLE));
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}));
}

View File

@ -149,7 +149,7 @@ function run_test_4() {
// Tests that after uninstalling a restart doesn't re-install the extension
function run_test_5() {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
a1.uninstall();
restartManager();
@ -159,7 +159,7 @@ function run_test_5() {
do_execute_soon(run_test_6);
});
});
}));
}
// Tests that upgrading the application still doesn't re-install the uninstalled
@ -257,6 +257,6 @@ function run_test_9() {
a2.uninstall();
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -115,7 +115,7 @@ function run_test() {
}
function end_test() {
do_test_finished();
do_execute_soon(do_test_finished);
}
// Checks enabling one theme disables the others
@ -592,7 +592,7 @@ function run_test_9() {
// Uninstalling a custom theme in use should require a restart
function run_test_10() {
AddonManager.getAddonByID("theme2@tests.mozilla.org", function(oldt2) {
AddonManager.getAddonByID("theme2@tests.mozilla.org", callback_soon(function(oldt2) {
prepare_test({
"theme2@tests.mozilla.org": [
["onEnabling", false],
@ -611,7 +611,8 @@ function run_test_10() {
restartManager();
AddonManager.getAddonsByIDs(["default@tests.mozilla.org",
"theme2@tests.mozilla.org"], function([d, t2]) {
"theme2@tests.mozilla.org"],
callback_soon(function([d, t2]) {
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
@ -638,8 +639,8 @@ function run_test_10() {
restartManager();
do_execute_soon(run_test_11);
});
});
}));
}));
}
// Installing a custom theme not in use should not require a restart
@ -665,7 +666,7 @@ function run_test_11() {
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_11);
], callback_soon(check_test_11));
install.install();
});
}
@ -722,7 +723,7 @@ function check_test_12() {
// Updating a custom theme in use should require a restart
function run_test_13() {
AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) {
AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) {
prepare_test({
"theme1@tests.mozilla.org": [
["onEnabling", false],
@ -758,10 +759,10 @@ function run_test_13() {
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_13);
], callback_soon(check_test_13));
install.install();
});
});
}));
}
function check_test_13() {
@ -772,7 +773,6 @@ function check_test_13() {
do_check_true(t1.isActive);
do_check_false(gLWThemeChanged);
t1.uninstall();
restartManager();
do_execute_soon(run_test_14);
});
@ -781,6 +781,7 @@ function check_test_13() {
// Switching from a lightweight theme to the default theme should not require
// a restart
function run_test_14() {
restartManager();
LightweightThemeManager.currentTheme = {
id: "1",
version: "1",

View File

@ -164,7 +164,7 @@ function run_test_2() {
function run_test_3() {
restartManager();
AddonManager.getAddonByID(gPluginIDs[0], function(p) {
AddonManager.getAddonByID(gPluginIDs[0], callback_soon(function(p) {
do_check_neq(p, null);
do_check_eq(p.name, "Duplicate Plugin 1");
do_check_eq(p.description, "A duplicate plugin");
@ -178,7 +178,7 @@ function run_test_3() {
do_check_eq(p.name, "Duplicate Plugin 1");
do_check_eq(p.description, "A duplicate plugin");
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}));
}

View File

@ -85,6 +85,6 @@ function run_test_5() {
do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
do_check_eq(install.error, AddonManager.ERROR_CORRUPT_FILE);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -150,7 +150,7 @@ function run_test_2() {
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded"
], check_test_2);
], callback_soon(check_test_2));
install.install();
}, "application/x-xpinstall");
@ -190,7 +190,7 @@ function run_test_3() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -203,7 +203,7 @@ function run_test_3() {
do_check_true(source.exists());
do_execute_soon(run_test_4);
});
}));
}
// Tests that misnaming a pointer doesn't clobber the sources
@ -238,7 +238,7 @@ function run_test_5() {
restartManager();
AddonManager.getAddonByID(addon1.id, function(a1) {
AddonManager.getAddonByID(addon1.id, callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -261,7 +261,7 @@ function run_test_5() {
do_execute_soon(run_test_6);
});
});
}));
}
// Removing the pointer file should uninstall the add-on
@ -273,7 +273,7 @@ function run_test_6() {
restartManager();
AddonManager.getAddonByID(addon1.id, function(a1) {
AddonManager.getAddonByID(addon1.id, callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -288,7 +288,7 @@ function run_test_6() {
do_execute_soon(run_test_7);
});
});
}));
}
// Removing the pointer file and replacing it with a directory should work
@ -297,7 +297,7 @@ function run_test_7() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -315,20 +315,20 @@ function run_test_7() {
a1.uninstall();
restartManager();
do_execute_soon(run_test_8);
});
});
}));
}
// Changes to the source files should be detected
function run_test_8() {
restartManager();
writePointer(addon1.id);
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -342,21 +342,21 @@ function run_test_8() {
a1.uninstall();
restartManager();
do_execute_soon(run_test_9);
});
});
}));
}
// Removing the add-on the pointer file points at should uninstall the add-on
function run_test_9() {
restartManager();
var dest = writeInstallRDFForExtension(addon1, sourceDir);
writePointer(addon1.id);
restartManager();
AddonManager.getAddonByID(addon1.id, function(a1) {
AddonManager.getAddonByID(addon1.id, callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_eq(a1.version, "1.0");
@ -373,7 +373,7 @@ function run_test_9() {
do_execute_soon(run_test_10);
});
});
}));
}
// Tests that installing a new add-on by pointer with a relative path works

View File

@ -160,5 +160,5 @@ function onPrefChange(evt) {
function onPrefChange2(evt) {
do_check_eq(evt.data, testdata.dummy);
do_test_finished();
do_execute_soon(do_test_finished);
}

View File

@ -18,7 +18,7 @@ function run_test() {
AddonManager.getAddonsByTypes(null, function(list) {
gCount = list.length;
run_test_1();
do_execute_soon(run_test_1);
});
}
@ -51,9 +51,8 @@ function run_test_2() {
function run_test_3() {
restartManager();
AddonManager.getAddonsByTypes(null, function(addons) {
AddonManager.getAddonsByTypes(null, callback_soon(function(addons) {
do_check_eq(gCount, addons.length);
shutdownManager();
do_test_finished();
});
}));
}

View File

@ -75,7 +75,8 @@ function run_test() {
do_check_true(false);
}
AddonManager.getInstallForFile(do_get_addon("test_getresource"), function(aInstall) {
AddonManager.getInstallForFile(do_get_addon("test_getresource"),
callback_soon(function(aInstall) {
do_check_false(a1.hasResource("icon.png"));
do_check_true(aInstall.addon.hasResource("icon.png"));
@ -84,9 +85,9 @@ function run_test() {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(newa1) {
do_check_eq(newa1, null);
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}));
});
});
});

View File

@ -76,7 +76,7 @@ function run_test() {
do_check_true(a5.isActive);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_test_finished();
do_execute_soon(do_test_finished);
});
});
}

View File

@ -50,7 +50,7 @@ function run_test_1() {
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded",
], check_test_1);
], callback_soon(check_test_1));
// Fake a timer event
gInternalManager.notify(null);
@ -105,7 +105,7 @@ function run_test_3() {
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded",
], check_test_3);
], callback_soon(check_test_3));
// Fake a timer event
gInternalManager.notify(null);
@ -189,7 +189,7 @@ function run_test_6() {
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded",
], check_test_6);
], callback_soon(check_test_6));
// Fake a timer event
gInternalManager.notify(null);
@ -261,7 +261,7 @@ function check_test_7(aInstall) {
"onDownloadEnded",
"onInstallStarted",
"onInstallEnded",
], finish_test_7);
], callback_soon(finish_test_7));
// Fake a timer event
gInternalManager.notify(null);
@ -326,13 +326,13 @@ function check_test_8() {
}
function finish_test_8() {
AddonManager.getAllInstalls(function(aInstalls) {
AddonManager.getAllInstalls(callback_soon(function(aInstalls) {
do_check_eq(aInstalls.length, 1);
do_check_eq(aInstalls[0].version, "2.0");
restartManager();
AddonManager.getAddonByID("hotfix@tests.mozilla.org", function(aAddon) {
AddonManager.getAddonByID("hotfix@tests.mozilla.org", callback_soon(function(aAddon) {
do_check_neq(aAddon, null);
do_check_eq(aAddon.version, "2.0");
@ -340,6 +340,6 @@ function finish_test_8() {
restartManager();
end_test();
});
});
}));
}));
}

View File

@ -124,7 +124,7 @@ function check_test_1(installSyncGUID) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {
do_check_eq(olda1, null);
AddonManager.getAddonsWithOperationsByTypes(null, function(pendingAddons) {
AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(pendingAddons) {
do_check_eq(pendingAddons.length, 1);
do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org");
let uri = NetUtil.newURI(pendingAddons[0].iconURL);
@ -162,7 +162,7 @@ function check_test_1(installSyncGUID) {
AddonManager.getAllInstalls(function(activeInstalls) {
do_check_eq(activeInstalls, 0);
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_neq(a1, null);
do_check_neq(a1.syncGUID, null);
do_check_true(a1.syncGUID.length >= 9);
@ -198,10 +198,10 @@ function check_test_1(installSyncGUID) {
restartManager();
do_check_not_in_crash_annotation(a1.id, a1.version);
run_test_2();
});
do_execute_soon(run_test_2);
}));
});
});
}));
});
}
@ -275,7 +275,7 @@ function check_test_3(aInstall) {
setExtensionModifiedTime(ext, updateDate);
ensure_test_completed();
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {
do_check_eq(olda2, null);
restartManager();
@ -307,7 +307,7 @@ function check_test_3(aInstall) {
run_test_4();
});
});
});
}));
}
// Tests that installing a new version of an existing add-on works
@ -376,7 +376,7 @@ function check_test_5(install) {
do_check_neq(olda2, null);
do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
AddonManager.getInstallsByTypes(null, function(installs) {
AddonManager.getInstallsByTypes(null, callback_soon(function(installs) {
do_check_eq(installs.length, 1);
do_check_eq(installs[0].addon, olda2.pendingUpgrade);
restartManager();
@ -402,17 +402,17 @@ function check_test_5(install) {
do_check_true(a2.installDate <= a2.updateDate);
a2.uninstall();
restartManager();
run_test_6();
do_execute_soon(run_test_6);
});
});
});
}));
});
}
// Tests that an install that requires a compatibility update works
function run_test_6() {
restartManager();
prepare_test({ }, [
"onNewInstall"
]);
@ -464,7 +464,7 @@ function run_test_7() {
function check_test_7() {
ensure_test_completed();
AddonManager.getAddonByID("addon3@tests.mozilla.org", function(olda3) {
AddonManager.getAddonByID("addon3@tests.mozilla.org", callback_soon(function(olda3) {
do_check_eq(olda3, null);
restartManager();
@ -482,15 +482,15 @@ function check_test_7() {
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
do_check_true(do_get_addon("test_install3").exists());
a3.uninstall();
restartManager();
run_test_8();
do_execute_soon(run_test_8);
});
});
});
}));
}
function run_test_8() {
restartManager();
AddonManager.addInstallListener(InstallListener);
AddonManager.addAddonListener(AddonListener);
@ -508,7 +508,7 @@ function run_test_8() {
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_8);
], callback_soon(check_test_8));
install.install();
});
}
@ -527,14 +527,14 @@ function check_test_8() {
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
do_check_true(do_get_addon("test_install3").exists());
a3.uninstall();
restartManager();
run_test_9();
do_execute_soon(run_test_9);
});
}
// Test that after cancelling a download it is removed from the active installs
function run_test_9() {
restartManager();
prepare_test({ }, [
"onNewInstall"
]);
@ -625,7 +625,7 @@ function check_test_10(install) {
ensure_test_completed();
AddonManager.getAllInstalls(function(activeInstalls) {
AddonManager.getAllInstalls(callback_soon(function(activeInstalls) {
do_check_eq(activeInstalls.length, 0);
restartManager();
@ -634,9 +634,9 @@ function check_test_10(install) {
AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) {
do_check_eq(a3, null);
run_test_11();
do_execute_soon(run_test_11);
});
});
}));
}
// Tests that a multi-package install shows up as multiple installs with the
@ -738,7 +738,7 @@ function run_test_11() {
"onInstallStarted",
"onInstallEnded"
]
}, check_test_11);
}, callback_soon(check_test_11));
installs[0].install();
installs[1].install();
@ -771,14 +771,14 @@ function check_test_11() {
a6.uninstall();
a7.uninstall();
restartManager();
run_test_12();
do_execute_soon(run_test_12);
});
}
// Same as test 11 but for a remote XPI
function run_test_12() {
restartManager();
prepare_test({ }, [
"onNewInstall",
]);
@ -829,7 +829,7 @@ function run_test_12() {
"onInstallStarted",
"onInstallEnded"
]
}, check_test_12);
}, callback_soon(check_test_12));
install.install();
}, "application/x-xpinstall", null, "Multi Test 4");
}
@ -896,9 +896,7 @@ function check_test_12() {
a6.uninstall();
a7.uninstall();
restartManager();
run_test_13();
do_execute_soon(run_test_13);
});
}
@ -906,6 +904,8 @@ function check_test_12() {
// Tests that cancelling an upgrade leaves the original add-on's pendingOperations
// correct
function run_test_13() {
restartManager();
installAllFiles([do_get_addon("test_install2_1")], function() {
restartManager();
@ -953,7 +953,7 @@ function check_test_13(install) {
do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");
do_check_eq(install.addon.install, install);
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {
do_check_neq(olda2, null);
do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
do_check_eq(olda2.pendingUpgrade, install.addon);
@ -984,15 +984,15 @@ function check_test_13(install) {
a2.uninstall();
restartManager();
run_test_14();
do_execute_soon(run_test_14);
});
});
}));
}
// Check that cancelling the install from onDownloadStarted actually cancels it
function run_test_14() {
restartManager();
prepare_test({ }, [
"onNewInstall"
]);
@ -1347,7 +1347,7 @@ function run_test_21() {
}
function check_test_21(aInstall) {
AddonManager.getAllInstalls(function(aInstalls) {
AddonManager.getAllInstalls(callback_soon(function(aInstalls) {
do_check_eq(aInstalls.length, 1);
do_check_eq(aInstalls[0], aInstall);
@ -1370,7 +1370,7 @@ function check_test_21(aInstall) {
run_test_22();
});
});
}));
}
// Tests that an install can be restarted after being cancelled

View File

@ -56,6 +56,6 @@ function test_4() {
do_check_neq(aInstall.icons, null);
do_check_eq(aInstall.icons[32], icon32_url);
do_check_eq(aInstall.icons[64], icon64_url);
do_test_finished();
do_execute_soon(do_test_finished);
}, "application/x-xpinstall", null, null, { "32": icon32_url, "64": icon64_url }, null, null);
}

View File

@ -121,7 +121,7 @@ function check_test_1() {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {
do_check_eq(olda1, null);
AddonManager.getAddonsWithOperationsByTypes(null, function(pendingAddons) {
AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(pendingAddons) {
do_check_eq(pendingAddons.length, 1);
do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org");
let uri = NetUtil.newURI(pendingAddons[0].iconURL);
@ -191,7 +191,7 @@ function check_test_1() {
do_execute_soon(function(){run_test_2(a1)});
});
});
});
}));
});
}
@ -268,7 +268,7 @@ function check_test_3(aInstall) {
setExtensionModifiedTime(ext, updateDate);
ensure_test_completed();
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {
do_check_eq(olda2, null);
restartManager();
@ -299,7 +299,7 @@ function check_test_3(aInstall) {
run_test_4();
});
});
});
}));
}
// Tests that installing a new version of an existing add-on works
@ -368,7 +368,7 @@ function check_test_5(install) {
do_check_neq(olda2, null);
do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
AddonManager.getInstallsByTypes(null, function(installs) {
AddonManager.getInstallsByTypes(null, callback_soon(function(installs) {
do_check_eq(installs.length, 1);
do_check_eq(installs[0].addon, olda2.pendingUpgrade);
restartManager();
@ -396,7 +396,7 @@ function check_test_5(install) {
do_execute_soon(run_test_6);
});
});
});
}));
});
}
@ -455,7 +455,7 @@ function run_test_7() {
function check_test_7() {
ensure_test_completed();
AddonManager.getAddonByID("addon3@tests.mozilla.org", function(olda3) {
AddonManager.getAddonByID("addon3@tests.mozilla.org", callback_soon(function(olda3) {
do_check_eq(olda3, null);
restartManager();
@ -475,7 +475,7 @@ function check_test_7() {
do_execute_soon(run_test_8);
});
});
});
}));
}
function run_test_8() {
@ -498,7 +498,7 @@ function run_test_8() {
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_8);
], callback_soon(check_test_8));
install.install();
});
}
@ -614,7 +614,7 @@ function check_test_10(install) {
ensure_test_completed();
AddonManager.getAllInstalls(function(activeInstalls) {
AddonManager.getAllInstalls(callback_soon(function(activeInstalls) {
do_check_eq(activeInstalls.length, 0);
restartManager();
@ -625,7 +625,7 @@ function check_test_10(install) {
run_test_11();
});
});
}));
}
// Tests that a multi-package install shows up as multiple installs with the
@ -728,7 +728,7 @@ function run_test_11() {
"onInstallStarted",
"onInstallEnded"
]
}, check_test_11);
}, callback_soon(check_test_11));
installs[0].install();
installs[1].install();
@ -820,7 +820,7 @@ function run_test_12() {
"onInstallStarted",
"onInstallEnded"
]
}, check_test_12);
}, callback_soon(check_test_12));
install.install();
}, "application/x-xpinstall", null, "Multi Test 4");
}
@ -944,7 +944,7 @@ function check_test_13(install) {
do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org");
do_check_eq(install.addon.install, install);
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(olda2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(olda2) {
do_check_neq(olda2, null);
do_check_true(hasFlag(olda2.pendingOperations, AddonManager.PENDING_UPGRADE));
do_check_eq(olda2.pendingUpgrade, install.addon);
@ -977,7 +977,7 @@ function check_test_13(install) {
do_execute_soon(run_test_14);
});
});
}));
}
// Check that cancelling the install from onDownloadStarted actually cancels it
@ -1338,7 +1338,7 @@ function run_test_21() {
}
function check_test_21(aInstall) {
AddonManager.getAllInstalls(function(aInstalls) {
AddonManager.getAllInstalls(callback_soon(function(aInstalls) {
do_check_eq(aInstalls.length, 1);
do_check_eq(aInstalls[0], aInstall);
@ -1361,7 +1361,7 @@ function check_test_21(aInstall) {
run_test_22();
});
});
}));
}
// Tests that an install can be restarted after being cancelled
@ -1640,5 +1640,5 @@ function finish_test_27(aInstall) {
ensure_test_completed();
do_test_finished();
end_test();
}

View File

@ -142,7 +142,7 @@ function run_test_2() {
do_check_true(newb1.userDisabled);
do_check_false(newb1.isActive);
run_test_3();
do_execute_soon(run_test_3);
});
});
}
@ -195,7 +195,7 @@ function run_test_4() {
do_check_false(newb1.userDisabled);
do_check_true(newb1.isActive);
run_test_5();
do_execute_soon(run_test_5);
});
});
}
@ -244,7 +244,8 @@ function check_test_7() {
// check chrome reg that language pack is not registered
do_check_locale_not_registered("test-langpack");
AddonManager.getAddonByID("langpack-x-testing@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("langpack-x-testing@tests.mozilla.org",
callback_soon(function(b1) {
do_check_eq(b1, null);
restartManager();
@ -252,9 +253,9 @@ function check_test_7() {
AddonManager.getAddonByID("langpack-x-testing@tests.mozilla.org", function(newb1) {
do_check_eq(newb1, null);
run_test_8();
do_execute_soon(run_test_8);
});
});
}));
}
// Tests that a locale detected in the profile starts working immediately
@ -265,7 +266,8 @@ function run_test_8() {
startupManager(false);
AddonManager.getAddonByID("langpack-x-testing@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("langpack-x-testing@tests.mozilla.org",
callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "1.0");
do_check_false(b1.appDisabled);
@ -293,9 +295,9 @@ function run_test_8() {
b2.uninstall();
ensure_test_completed();
run_test_9();
do_execute_soon(run_test_9);
});
});
}));
}
// Tests that a locale from distribution/extensions gets installed and starts
@ -306,7 +308,7 @@ function run_test_9() {
gAppInfo.version = "2.0";
startupManager(true);
AddonManager.getAddonByID("langpack-x-testing@tests.mozilla.org", function(b1) {
AddonManager.getAddonByID("langpack-x-testing@tests.mozilla.org", callback_soon(function(b1) {
do_check_neq(b1, null);
do_check_eq(b1.version, "1.0");
do_check_false(b1.appDisabled);
@ -325,5 +327,5 @@ function run_test_9() {
do_check_eq(chrome.getSelectedLocale("test-langpack"), "x-testing");
do_test_finished();
});
}));
}

View File

@ -34,7 +34,7 @@ function run_test_1() {
}, [
"onInstallStarted",
"onInstallEnded",
], run_test_2);
], callback_soon(run_test_2));
install.install();
});
}
@ -50,19 +50,19 @@ function run_test_2() {
do_check_eq(addon.description, "fr-FR Description");
addon.userDisabled = true;
restartManager();
run_test_3();
do_execute_soon(run_test_3);
});
}
// Test that the localized properties are still there when disabled.
function run_test_3() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(addon) {
do_check_neq(addon, null);
do_check_eq(addon.name, "fr-FR Name");
run_test_4();
do_execute_soon(run_test_4);
});
}
@ -82,7 +82,7 @@ function run_test_4() {
do_check_eq(contributors[1], "Fr Contributor 2");
do_check_eq(contributors[2], "Fr Contributor 3");
run_test_5();
do_execute_soon(run_test_5);
});
}
@ -97,7 +97,7 @@ function run_test_5() {
do_check_eq(addon.name, "de-DE Name");
do_check_eq(addon.description, null);
run_test_6();
do_execute_soon(run_test_6);
});
}
@ -106,26 +106,27 @@ function run_test_6() {
Services.prefs.setCharPref(PREF_SELECTED_LOCALE, "nl-NL");
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(addon) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(addon) {
do_check_neq(addon, null);
do_check_eq(addon.name, "Fallback Name");
do_check_eq(addon.description, "Fallback Description");
addon.userDisabled = false;
restartManager();
run_test_7();
});
do_execute_soon(run_test_7);
}));
}
// Test that the prefs will override the fallbacks
function run_test_7() {
restartManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(addon) {
do_check_neq(addon, null);
do_check_eq(addon.name, "Name from prefs");
run_test_8();
do_execute_soon(run_test_8);
});
}
@ -143,6 +144,6 @@ function run_test_8() {
do_check_eq(contributors[0], "Contributor 1");
do_check_eq(contributors[1], "Contributor 2");
do_test_finished();
do_execute_soon(do_test_finished);
});
}

378
toolkit/mozapps/extensions/test/xpcshell/test_locked.js Normal file → Executable file
View File

@ -4,8 +4,9 @@
// Checks that we rebuild something sensible from a corrupt database
Components.utils.import("resource://testing-common/httpd.js");
Components.utils.import("resource://gre/modules/osfile.jsm");
var testserver = new HttpServer();
testserver.start(-1);
gPort = testserver.identity.primaryPort;
@ -254,188 +255,28 @@ function run_test_1() {
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// After shutting down the database won't be open so we can
// mess with permissions
// Open another handle on the JSON DB with as much Unix and Windows locking
// as we can to simulate some other process interfering with it
shutdownManager();
var savedPermissions = gExtensionsJSON.permissions;
gExtensionsJSON.permissions = 0;
startupManager(false);
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
// Accessing the add-ons should open and recover the database
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function get_after_lock([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
// Should be correctly recovered
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
// Should be correctly recovered
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
// The compatibility update won't be recovered but it should still be
// active for this session
do_check_neq(a3, null);
do_check_true(a3.isActive);
do_check_false(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
// The compatibility update won't be recovered and with strict
// compatibility it would not have been able to tell that it was
// previously userDisabled. However, without strict compat, it wasn't
// appDisabled, so it knows it must have been userDisabled.
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_true(a4.userDisabled);
do_check_false(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_neq(a5, null);
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
// Should be correctly recovered
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
// Should be correctly recovered
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// Restarting will actually apply changes to extensions.ini which will
// then be put into the in-memory database when we next fail to load the
// real thing
restartManager();
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_true(a3.isActive);
do_check_false(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_true(a4.userDisabled);
do_check_false(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_neq(a5, null);
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// After allowing access to the original DB things should go back to as
// they were previously
shutdownManager();
gExtensionsJSON.permissions = savedPermissions;
startupManager();
do_print("Locking " + gExtensionsJSON.path);
let options = {
winShare: 0
};
if (OS.Constants.libc.O_EXLOCK)
options.unixFlags = OS.Constants.libc.O_EXLOCK;
OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options).then(
file => {
filePermissions = gExtensionsJSON.permissions;
if (!OS.Constants.Win) {
gExtensionsJSON.permissions = 0;
}
startupManager(false);
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
// Accessing the add-ons should open and recover the database
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
@ -445,7 +286,8 @@ function run_test_1() {
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
callback_soon(function get_after_lock([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
// Should be correctly recovered
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
@ -453,6 +295,7 @@ function run_test_1() {
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
// Should be correctly recovered
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
@ -460,6 +303,8 @@ function run_test_1() {
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
// The compatibility update won't be recovered but it should still be
// active for this session
do_check_neq(a3, null);
do_check_true(a3.isActive);
do_check_false(a3.userDisabled);
@ -467,6 +312,10 @@ function run_test_1() {
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
// The compatibility update won't be recovered and with strict
// compatibility it would not have been able to tell that it was
// previously userDisabled. However, without strict compat, it wasn't
// appDisabled, so it knows it must have been userDisabled.
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_true(a4.userDisabled);
@ -493,6 +342,7 @@ function run_test_1() {
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
// Should be correctly recovered
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
@ -500,6 +350,7 @@ function run_test_1() {
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
// Should be correctly recovered
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
@ -507,9 +358,174 @@ function run_test_1() {
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
end_test();
// Restarting will actually apply changes to extensions.ini which will
// then be put into the in-memory database when we next fail to load the
// real thing
restartManager();
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_true(a3.isActive);
do_check_false(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_true(a4.userDisabled);
do_check_false(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_neq(a5, null);
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// After allowing access to the original DB things should go back to as
// they were previously
shutdownManager();
do_print("Unlocking " + gExtensionsJSON.path);
file.close();
gExtensionsJSON.permissions = filePermissions;
startupManager();
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_true(a3.isActive);
do_check_false(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_true(a4.userDisabled);
do_check_false(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_neq(a5, null);
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
end_test();
}));
}));
}));
}));
}));
},
do_report_unexpected_exception
);
}));
}

View File

@ -5,6 +5,8 @@
// Checks that we handle a locked database when there are extension changes
// in progress
Components.utils.import("resource://gre/modules/osfile.jsm");
// Will be left alone
var addon1 = {
id: "addon1@tests.mozilla.org",
@ -89,7 +91,7 @@ function run_test() {
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(a2) {
a2.userDisabled = true;
restartManager();
@ -142,125 +144,152 @@ function run_test() {
do_check_eq(a5.pendingOperations, AddonManager.PENDING_UPGRADE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
// After shutting down the database won't be open so we can lock it
// Open another handle on the JSON DB with as much Unix and Windows locking
// as we can to simulate some other process interfering with it
shutdownManager();
var savedPermissions = gExtensionsJSON.permissions;
gExtensionsJSON.permissions = 0;
do_print("Locking " + gExtensionsJSON.path);
let options = {
winShare: 0
};
if (OS.Constants.libc.O_EXLOCK)
options.unixFlags = OS.Constants.libc.O_EXLOCK;
startupManager(false);
OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options).then(
file => {
filePermissions = gExtensionsJSON.permissions;
if (!OS.Constants.Win) {
gExtensionsJSON.permissions = 0;
}
startupManager(false);
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org"],
function([a1, a2, a3, a4, a5, a6]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_true(a2.isActive);
do_check_false(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a2, null);
do_check_true(a2.isActive);
do_check_false(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_false(a3.isActive);
do_check_true(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a3.id));
do_check_neq(a3, null);
do_check_false(a3.isActive);
do_check_true(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a3.id));
do_check_eq(a4, null);
do_check_eq(a4, null);
do_check_neq(a5, null);
do_check_eq(a5.version, "2.0");
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a5, null);
do_check_eq(a5.version, "2.0");
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a6.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a6.id));
// After allowing access to the original DB things should still be
// applied correctly
shutdownManager();
gExtensionsJSON.permissions = savedPermissions;
startupManager();
// After allowing access to the original DB things should still be
// back how they were before the lock
shutdownManager();
file.close();
gExtensionsJSON.permissions = filePermissions;
startupManager();
// These things happened when we had no access to the database so
// they are seen as external changes when we get the database back :(
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, ["addon6@tests.mozilla.org"]);
check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, ["addon4@tests.mozilla.org"]);
// On Unix, we can save the DB even when the original file wasn't
// readable, so our changes were saved. On Windows,
// these things happened when we had no access to the database so
// they are seen as external changes when we get the database back
if (gXPISaveError) {
do_print("Previous XPI save failed");
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED,
["addon6@tests.mozilla.org"]);
check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED,
["addon4@tests.mozilla.org"]);
}
else {
do_print("Previous XPI save succeeded");
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
check_startup_changes(AddonManager.STARTUP_CHANGE_UNINSTALLED, []);
}
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org"],
function([a1, a2, a3, a4, a5, a6]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org"],
function([a1, a2, a3, a4, a5, a6]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_true(a2.isActive);
do_check_false(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a2, null);
do_check_true(a2.isActive);
do_check_false(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_false(a3.isActive);
do_check_true(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a3.id));
do_check_neq(a3, null);
do_check_false(a3.isActive);
do_check_true(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a3.id));
do_check_eq(a4, null);
do_check_eq(a4, null);
do_check_neq(a5, null);
do_check_eq(a5.version, "2.0");
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a5, null);
do_check_eq(a5.version, "2.0");
do_check_true(a5.isActive);
do_check_false(a5.userDisabled);
do_check_false(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a6.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a6.id));
end_test();
});
});
end_test();
});
}));
},
do_report_unexpected_exception
);
});
});
});
}));
}
function end_test() {
do_test_finished();
do_execute_soon(do_test_finished);
}

View File

@ -4,8 +4,9 @@
// Checks that we rebuild something sensible from a corrupt database
Components.utils.import("resource://testing-common/httpd.js");
Components.utils.import("resource://gre/modules/osfile.jsm");
var testserver = new HttpServer();
testserver.start(-1);
gPort = testserver.identity.primaryPort;
@ -254,184 +255,28 @@ function run_test_1() {
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// After shutting down the database won't be open so we can lock it
// Open another handle on the JSON DB with as much Unix and Windows locking
// as we can to simulate some other process interfering with it
shutdownManager();
var savedPermissions = gExtensionsJSON.permissions;
gExtensionsJSON.permissions = 0;
do_print("Locking " + gExtensionsJSON.path);
let options = {
winShare: 0
};
if (OS.Constants.libc.O_EXLOCK)
options.unixFlags = OS.Constants.libc.O_EXLOCK;
startupManager(false);
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
// Accessing the add-ons should open and recover the database
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
// Should be correctly recovered
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
// Should be correctly recovered
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
// The compatibility update won't be recovered but it should still be
// active for this session
do_check_neq(a3, null);
do_check_true(a3.isActive);
do_check_false(a3.userDisabled);
do_check_true(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_DISABLE);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
// The compatibility update won't be recovered and it will not have been
// able to tell that it was previously userDisabled
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_false(a4.userDisabled);
do_check_true(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_neq(a5, null);
do_check_false(a5.isActive);
do_check_false(a5.userDisabled);
do_check_true(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
// Should be correctly recovered
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
// Should be correctly recovered
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// Restarting will actually apply changes to extensions.ini which will
// then be put into the in-memory database when we next fail to load the
// real thing
restartManager();
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_false(a3.isActive);
do_check_false(a3.userDisabled);
do_check_true(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a3.id));
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_false(a4.userDisabled);
do_check_true(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_neq(a5, null);
do_check_false(a5.isActive);
do_check_false(a5.userDisabled);
do_check_true(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// After allowing access to the original DB things should go back to as
// they were previously
shutdownManager();
gExtensionsJSON.permissions = savedPermissions;
OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options).then(
file => {
filePermissions = gExtensionsJSON.permissions;
if (!OS.Constants.Win) {
gExtensionsJSON.permissions = 0;
}
startupManager(false);
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
// Accessing the add-ons should open and recover the database
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
@ -442,6 +287,7 @@ function run_test_1() {
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
// Should be correctly recovered
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
@ -449,6 +295,7 @@ function run_test_1() {
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
// Should be correctly recovered
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
@ -456,17 +303,21 @@ function run_test_1() {
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
// The compatibility update won't be recovered but it should still be
// active for this session
do_check_neq(a3, null);
do_check_true(a3.isActive);
do_check_false(a3.userDisabled);
do_check_false(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_DISABLE);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
// The compatibility update won't be recovered and it will not have been
// able to tell that it was previously userDisabled
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_true(a4.userDisabled);
do_check_false(a4.appDisabled);
do_check_false(a4.userDisabled);
do_check_true(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
@ -489,6 +340,7 @@ function run_test_1() {
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
// Should be correctly recovered
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
@ -496,6 +348,7 @@ function run_test_1() {
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
// Should be correctly recovered
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
@ -503,9 +356,195 @@ function run_test_1() {
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
end_test();
// Restarting will actually apply changes to extensions.ini which will
// then be put into the in-memory database when we next fail to load the
// real thing
restartManager();
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_false(a3.isActive);
do_check_false(a3.userDisabled);
do_check_true(a3.appDisabled);
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a3.id));
do_check_neq(a4, null);
do_check_false(a4.isActive);
do_check_false(a4.userDisabled);
do_check_true(a4.appDisabled);
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_neq(a5, null);
do_check_false(a5.isActive);
do_check_false(a5.userDisabled);
do_check_true(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
// After allowing access to the original DB things should go back to as
// back how they were before the lock
shutdownManager();
do_print("Unlocking " + gExtensionsJSON.path);
file.close();
gExtensionsJSON.permissions = filePermissions;
startupManager(false);
// Shouldn't have seen any startup changes
check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org",
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org",
"addon6@tests.mozilla.org",
"addon7@tests.mozilla.org",
"theme1@tests.mozilla.org",
"theme2@tests.mozilla.org"],
callback_soon(function([a1, a2, a3, a4, a5, a6, a7, t1, t2]) {
do_check_neq(a1, null);
do_check_true(a1.isActive);
do_check_false(a1.userDisabled);
do_check_false(a1.appDisabled);
do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isExtensionInAddonsList(profileDir, a1.id));
do_check_neq(a2, null);
do_check_false(a2.isActive);
do_check_true(a2.userDisabled);
do_check_false(a2.appDisabled);
do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a2.id));
do_check_neq(a3, null);
do_check_false(a3.userDisabled);
// On Unix, we may be able to save our changes over the locked DB so we
// remember that this extension was changed to disabled. On Windows we
// couldn't replace the old DB so we read the older version of the DB
// where the extension is enabled
if (gXPISaveError) {
do_print("XPI save failed");
do_check_true(a3.isActive);
do_check_false(a3.appDisabled);
do_check_true(isExtensionInAddonsList(profileDir, a3.id));
}
else {
do_print("XPI save succeeded");
do_check_false(a3.isActive);
do_check_true(a3.appDisabled);
do_check_false(isExtensionInAddonsList(profileDir, a3.id));
}
do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a4, null);
do_check_false(a4.isActive);
// The reverse of the platform difference for a3 - Unix should
// stay the same as the last iteration because the save succeeded,
// Windows should still say userDisabled
if (OS.Constants.Win) {
do_check_true(a4.userDisabled);
do_check_false(a4.appDisabled);
}
else {
do_check_false(a4.userDisabled);
do_check_true(a4.appDisabled);
}
do_check_false(isExtensionInAddonsList(profileDir, a4.id));
do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a5, null);
do_check_false(a5.isActive);
do_check_false(a5.userDisabled);
do_check_true(a5.appDisabled);
do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isExtensionInAddonsList(profileDir, a5.id));
do_check_neq(a6, null);
do_check_true(a6.isActive);
do_check_false(a6.userDisabled);
do_check_false(a6.appDisabled);
do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(a7, null);
do_check_false(a7.isActive);
do_check_true(a7.userDisabled);
do_check_false(a7.appDisabled);
do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
do_check_neq(t1, null);
do_check_false(t1.isActive);
do_check_true(t1.userDisabled);
do_check_false(t1.appDisabled);
do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
do_check_false(isThemeInAddonsList(profileDir, t1.id));
do_check_neq(t2, null);
do_check_true(t2.isActive);
do_check_false(t2.userDisabled);
do_check_false(t2.appDisabled);
do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
do_check_true(isThemeInAddonsList(profileDir, t2.id));
end_test();
}));
}));
}));
}));
}));
},
do_report_unexpected_exception
);
}));
}

View File

@ -557,6 +557,6 @@ function run_test() {
do_check_eq(a26.optionsType, AddonManager.OPTIONS_TYPE_INLINE_INFO);
do_check_neq(a26.optionsURL, null);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -140,7 +140,7 @@ function run_test_2(uri) {
do_check_true(newb1.userDisabled);
check_mapping(uri, newb1.id);
run_test_3(uri);
do_execute_soon(() => run_test_3(uri));
});
});
}
@ -174,7 +174,7 @@ function run_test_4() {
let uri = newb1.getResourceURI(".");
check_mapping(uri, newb1.id);
run_test_5();
do_execute_soon(run_test_5);
});
});
}
@ -187,7 +187,7 @@ function run_test_5() {
let uri = b1.getResourceURI(".");
check_mapping(uri, b1.id);
run_test_invalidarg();
do_execute_soon(run_test_invalidarg);
});
}

View File

@ -246,6 +246,6 @@ function run_test() {
do_check_false(stagedXPIs.exists());
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -254,6 +254,6 @@ function run_test() {
do_check_false(a8.strictCompatibility);
do_check_true(a8.foreignInstall);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -234,6 +234,6 @@ function run_test() {
do_check_false(stagedXPIs.exists());
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -134,6 +134,6 @@ function run_test() {
do_check_false(d.appDisabled);
do_check_false(d.isActive);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -59,7 +59,7 @@ function run_test_2() {
"addon1@tests.mozilla.org": [
["onPropertyChanged", ["appDisabled"]]
]
}, [], do_test_finished);
}, [], callback_soon(do_test_finished));
AddonManager.strictCompatibility = false;
});

View File

@ -75,7 +75,7 @@ function run_test() {
}
function end_test() {
do_test_finished();
do_execute_soon(do_test_finished);
}
function sortAddons(addons) {

View File

@ -173,6 +173,6 @@ function run_test_4() {
Services.prefs.clearUserPref("plugins.click_to_play");
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -146,6 +146,6 @@ function run_test_4() {
do_check_eq(a1, null);
do_check_neq(a2, null);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -33,7 +33,7 @@ function run_test() {
startupManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
do_check_eq(a1, null);
do_check_not_in_crash_annotation(addon1.id, addon1.version);
@ -57,7 +57,7 @@ function run_test() {
run_test_1();
});
});
}));
}
// Disabling an add-on should work
@ -110,6 +110,6 @@ function run_test_2() {
ensure_test_completed();
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -828,7 +828,7 @@ function run_test_12() {
"addon3@tests.mozilla.org",
"addon4@tests.mozilla.org",
"addon5@tests.mozilla.org"],
function([a1, a2, a3, a4, a5]) {
callback_soon(function([a1, a2, a3, a4, a5]) {
do_check_neq(a1, null);
do_check_false(a1.userDisabled);
do_check_true(a1.isActive);
@ -917,8 +917,8 @@ function run_test_12() {
do_check_true(a3.userDisabled);
do_check_false(a3.isActive);
end_test();
do_execute_soon(end_test);
});
});
});
}));
}

View File

@ -86,7 +86,7 @@ add_test(function test_error_on_duplicate_syncguid_insert() {
do_execute_soon(function duplicate_syncguid_install_ended() {
restartManager();
AddonManager.getAddonsByIDs(installIDs, function(addons) {
AddonManager.getAddonsByIDs(installIDs, callback_soon(function(addons) {
let initialGUID = addons[1].syncGUID;
try {
@ -102,7 +102,7 @@ add_test(function test_error_on_duplicate_syncguid_insert() {
run_next_test();
});
}
});
}));
});
}
}

View File

@ -141,6 +141,6 @@ function run_test() {
do_check_false(isExtensionInAddonsList(profileDir, a5.id));
do_check_not_in_crash_annotation(addon5.id, addon5.version);
do_test_finished();
do_execute_soon(do_test_finished);
});
}

View File

@ -126,7 +126,7 @@ function run_test() {
}
function end_test() {
do_test_finished();
do_execute_soon(do_test_finished);
}
// Checks enabling one theme disables the others
@ -613,7 +613,7 @@ function run_test_9() {
// Uninstalling a custom theme in use should require a restart
function run_test_10() {
AddonManager.getAddonByID("theme2@tests.mozilla.org", function(oldt2) {
AddonManager.getAddonByID("theme2@tests.mozilla.org", callback_soon(function(oldt2) {
prepare_test({
"theme2@tests.mozilla.org": [
"onEnabling",
@ -654,7 +654,7 @@ function run_test_10() {
do_execute_soon(run_test_11);
});
});
}));
}
// Installing a custom theme not in use should not require a restart
@ -742,7 +742,7 @@ function check_test_12() {
// Updating a custom theme in use should require a restart
function run_test_13() {
AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) {
AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) {
prepare_test({
"theme1@tests.mozilla.org": [
"onEnabling",
@ -777,16 +777,16 @@ function run_test_13() {
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_13);
], callback_soon(check_test_13));
install.install();
});
});
}));
}
function check_test_13() {
restartManager();
AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) {
AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) {
do_check_neq(t1, null);
do_check_true(t1.isActive);
do_check_false(gLWThemeChanged);
@ -794,7 +794,7 @@ function check_test_13() {
restartManager();
do_execute_soon(run_test_14);
});
}));
}
// Switching from a lightweight theme to the default theme should not require
@ -846,14 +846,15 @@ function run_test_15() {
restartManager();
installAllFiles([do_get_addon("test_theme")], function() {
AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) {
AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) {
t1.userDisabled = false;
restartManager();
do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme1/1.0");
AddonManager.getAddonsByIDs(["default@tests.mozilla.org",
"theme1@tests.mozilla.org"], function([d, t1]) {
"theme1@tests.mozilla.org"],
callback_soon(function([d, t1]) {
do_check_true(d.userDisabled);
do_check_false(d.appDisabled);
do_check_false(d.isActive);
@ -877,8 +878,8 @@ function run_test_15() {
do_execute_soon(run_test_16);
});
});
});
}));
}));
});
}
@ -932,13 +933,14 @@ function run_test_17() {
function run_test_18() {
restartManager(2);
AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) {
AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) {
t1.userDisabled = false;
restartManager();
AddonManager.getAddonsByIDs(["default@tests.mozilla.org",
"theme1@tests.mozilla.org"], function([d, t1]) {
"theme1@tests.mozilla.org"],
callback_soon(function([d, t1]) {
do_check_true(d.userDisabled);
do_check_false(d.appDisabled);
do_check_false(d.isActive);
@ -980,8 +982,8 @@ function run_test_18() {
do_execute_soon(run_test_19);
});
});
});
}));
}));
}
// Disabling the active persona should switch back to the default theme
@ -1044,7 +1046,7 @@ function run_test_20() {
// Tests that cached copies of a lightweight theme have the right permissions
// and pendingOperations during the onEnabling event
function run_test_21() {
AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) {
AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) {
// Switch to a custom theme so we can test pendingOperations properly.
prepare_test({
@ -1086,5 +1088,5 @@ function run_test_21() {
end_test();
});
});
}));
}

View File

@ -25,7 +25,7 @@ function run_test() {
do_test_pending();
startupManager();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(olda1) {
do_check_eq(olda1, null);
writeInstallRDFForExtension(addon1, profileDir);
@ -40,13 +40,13 @@ function run_test() {
do_check_eq(a1.pendingOperations, 0);
do_check_in_crash_annotation(addon1.id, addon1.version);
run_test_1();
do_execute_soon(run_test_1);
});
});
}));
}
function end_test() {
do_test_finished();
do_execute_soon(do_test_finished);
}
// Uninstalling an add-on should work.

View File

@ -210,7 +210,7 @@ function run_test_2(install) {
function check_test_2() {
ensure_test_completed();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(olda1) {
do_check_neq(olda1, null);
do_check_eq(olda1.version, "1.0");
do_check_true(isExtensionInAddonsList(profileDir, olda1.id));
@ -234,7 +234,7 @@ function check_test_2() {
a1.uninstall();
do_execute_soon(run_test_3);
});
});
}));
}
@ -401,7 +401,7 @@ function continue_test_6(install) {
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_6);
], callback_soon(check_test_6));
}
function check_test_6(install) {
@ -413,14 +413,14 @@ function check_test_6(install) {
do_check_eq(a1.version, "2.0");
do_check_eq(a1.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml");
a1.uninstall();
restartManager();
run_test_7();
do_execute_soon(run_test_7);
});
}
// Test that background update checks work for lightweight themes
function run_test_7() {
restartManager();
LightweightThemeManager.currentTheme = {
id: "1",
version: "1",
@ -578,7 +578,7 @@ function check_test_7_cache() {
do_check_eq(p1.installDate.getTime(), gInstallDate);
do_check_true(p1.installDate.getTime() < p1.updateDate.getTime());
run_test_8();
do_execute_soon(run_test_8);
});
}
@ -662,7 +662,7 @@ function run_test_8() {
restartManager();
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(a2) {
a2.userDisabled = true;
restartManager();
@ -756,7 +756,7 @@ function run_test_8() {
let compatListener = {
onUpdateFinished: function(addon, error) {
if (--count == 0)
run_next_test();
do_execute_soon(run_next_test);
}
};
@ -778,7 +778,7 @@ function run_test_8() {
a5.findUpdates(compatListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
a6.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
});
});
}));
}
// Tests that if an install.rdf claims compatibility then the add-on will be
@ -828,7 +828,7 @@ function run_test_11() {
onUpdateFinished: function(addon) {
do_check_true(addon.isCompatible);
run_test_12();
do_execute_soon(run_test_12);
}
}, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
});
@ -1296,7 +1296,7 @@ function continue_test_20(install) {
}, [
"onInstallStarted",
"onInstallEnded",
], check_test_20);
], callback_soon(check_test_20));
}
function check_test_20(install) {
@ -1308,8 +1308,10 @@ function check_test_20(install) {
do_check_eq(a12.version, "2.0");
do_check_eq(a12.type, "extension");
a12.uninstall();
restartManager();
end_test();
do_execute_soon(() => {
restartManager();
end_test();
});
});
}

View File

@ -207,7 +207,7 @@ function run_test_2(install) {
function check_test_2() {
ensure_test_completed();
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(olda1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(olda1) {
do_check_neq(olda1, null);
do_check_eq(olda1.version, "1.0");
do_check_true(isExtensionInAddonsList(profileDir, olda1.id));
@ -228,7 +228,7 @@ function check_test_2() {
a1.uninstall();
do_execute_soon(run_test_3);
});
});
}));
}
@ -496,7 +496,7 @@ function check_test_7() {
gInstallDate = p1.installDate.getTime();
run_test_8();
do_execute_soon(run_test_8);
});
}
@ -580,7 +580,7 @@ function run_test_8() {
restartManager();
AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) {
AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(a2) {
a2.userDisabled = true;
restartManager();
@ -696,7 +696,7 @@ function run_test_8() {
a5.findUpdates(compatListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
a6.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
});
});
}));
}
// Tests that if an install.rdf claims compatibility then the add-on will be
@ -746,7 +746,7 @@ function run_test_11() {
onUpdateFinished: function(addon) {
do_check_false(addon.isCompatible);
run_test_12();
do_execute_soon(run_test_12);
}
}, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED);
});
@ -1085,7 +1085,7 @@ function run_test_17() {
},
onUpdateFinished: function() {
end_test();
do_execute_soon(end_test);
}
}, AddonManager.UPDATE_WHEN_USER_REQUESTED);
});

View File

@ -93,7 +93,7 @@ function run_test_1() {
}
function check_test_1(install) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
// Existing add-on should have a pending upgrade
do_check_neq(a1.pendingUpgrade, null);
do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org");
@ -118,7 +118,7 @@ function check_test_1(install) {
do_execute_soon(run_test_2);
});
});
}));
}
// Test that when the new add-on already exists we just upgrade that
@ -164,7 +164,8 @@ function run_test_2() {
function check_test_2(install) {
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org"], function([a1, a2]) {
"addon2@tests.mozilla.org"],
callback_soon(function([a1, a2]) {
do_check_eq(a1.pendingUpgrade, null);
// Existing add-on should have a pending upgrade
do_check_neq(a2.pendingUpgrade, null);
@ -184,7 +185,7 @@ function check_test_2(install) {
do_execute_soon(run_test_3);
});
});
}));
}
// Test that we rollback correctly when removing the old add-on fails
@ -225,7 +226,7 @@ function run_test_3() {
}
function check_test_3(install) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) {
AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(a1) {
// Existing add-on should have a pending upgrade
do_check_neq(a1.pendingUpgrade, null);
do_check_eq(a1.pendingUpgrade.id, "addon2@tests.mozilla.org");
@ -248,7 +249,8 @@ function check_test_3(install) {
fstream.close();
AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org",
"addon2@tests.mozilla.org"], function([a1, a2]) {
"addon2@tests.mozilla.org"],
callback_soon(function([a1, a2]) {
// Should not have installed the new add-on but it should still be
// pending install
do_check_neq(a1, null);
@ -266,8 +268,8 @@ function check_test_3(install) {
do_execute_soon(run_test_4);
});
});
});
}));
}));
}
// Tests that upgrading to a bootstrapped add-on works but requires a restart
@ -306,7 +308,8 @@ function run_test_4() {
function check_test_4() {
AddonManager.getAddonsByIDs(["addon2@tests.mozilla.org",
"addon3@tests.mozilla.org"], function([a2, a3]) {
"addon3@tests.mozilla.org"],
callback_soon(function([a2, a3]) {
// Should still be pending install even though the new add-on is restartless
do_check_neq(a2, null);
do_check_eq(a3, null);
@ -330,7 +333,7 @@ function check_test_4() {
do_execute_soon(run_test_5);
});
});
}));
}
// Tests that upgrading to another bootstrapped add-on works without a restart
@ -349,7 +352,8 @@ function run_test_5() {
function check_test_5() {
AddonManager.getAddonsByIDs(["addon3@tests.mozilla.org",
"addon4@tests.mozilla.org"], function([a3, a4]) {
"addon4@tests.mozilla.org"],
callback_soon(function([a3, a4]) {
// Should have updated
do_check_eq(a3, null);
do_check_neq(a4, null);
@ -370,7 +374,7 @@ function check_test_5() {
run_test_6();
});
});
}));
}
// Tests that upgrading to a non-bootstrapped add-on works but requires a restart
@ -389,7 +393,8 @@ function run_test_6() {
function check_test_6() {
AddonManager.getAddonsByIDs(["addon4@tests.mozilla.org",
"addon2@tests.mozilla.org"], function([a4, a2]) {
"addon2@tests.mozilla.org"],
callback_soon(function([a4, a2]) {
// Should still be pending install even though the old add-on is restartless
do_check_neq(a4, null);
do_check_eq(a2, null);
@ -413,5 +418,5 @@ function check_test_6() {
end_test();
});
});
}));
}

View File

@ -93,7 +93,7 @@ function end_test() {
globalDir.append(do_get_expected_addon_name("addon4@tests.mozilla.org"));
globalDir.remove(true);
}
do_test_finished();
do_execute_soon(do_test_finished);
}
// Test that the test extensions are all installed

View File

@ -96,7 +96,7 @@ function end_test() {
Services.prefs.clearUserPref(PREF_EM_STRICT_COMPATIBILITY);
do_test_finished();
do_execute_soon(do_test_finished);
}
// Test that the test extensions are all installed