From deea787c2efbb9c89caec8d9efc023ffafe75613 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Sat, 10 Feb 2018 04:00:58 -0500 Subject: Import Tycho's Add-on Manager --- .../test/xpcshell/test_blocklistchange.js | 1321 ++++++++++++++++++++ 1 file changed, 1321 insertions(+) create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_blocklistchange.js (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_blocklistchange.js') diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_blocklistchange.js b/toolkit/mozapps/extensions/test/xpcshell/test_blocklistchange.js new file mode 100644 index 000000000..46f939943 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_blocklistchange.js @@ -0,0 +1,1321 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Checks that changes that cause an add-on to become unblocked or blocked have +// the right effect + +// The tests follow a mostly common pattern. First they start with the add-ons +// unblocked, then they make a change that causes the add-ons to become blocked +// then they make a similar change that keeps the add-ons blocked then they make +// a change that unblocks the add-ons. Some tests skip the initial part and +// start with add-ons detected as blocked. + +// softblock1 is enabled/disabled by the blocklist changes so its softDisabled +// property should always match its userDisabled property + +// softblock2 gets manually enabled then disabled after it becomes blocked so +// its softDisabled property should never become true after that + +// softblock3 does the same as softblock2 however it remains disabled + +// softblock4 is disabled while unblocked and so should never have softDisabled +// set to true and stay userDisabled. This add-on is not used in tests that +// start with add-ons blocked as it would be identical to softblock3 + +// softblock5 is a theme. Currently themes just get disabled when they become +// softblocked and have to be manually re-enabled if they become completely +// unblocked (bug 657520) + +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cu = Components.utils; +const Cr = Components.results; + +const URI_EXTENSION_BLOCKLIST_DIALOG = "chrome://mozapps/content/extensions/blocklist.xul"; + +Cu.import("resource://gre/modules/NetUtil.jsm"); + +// Allow insecure updates +Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false) + +Cu.import("resource://testing-common/httpd.js"); +var testserver = new HttpServer(); +testserver.start(-1); +gPort = testserver.identity.primaryPort; + +// register static files with server and interpolate port numbers in them +mapFile("/data/blocklistchange/addon_update1.rdf", testserver); +mapFile("/data/blocklistchange/addon_update2.rdf", testserver); +mapFile("/data/blocklistchange/addon_update3.rdf", testserver); +mapFile("/data/blocklistchange/addon_change.xml", testserver); +mapFile("/data/blocklistchange/app_update.xml", testserver); +mapFile("/data/blocklistchange/blocklist_update1.xml", testserver); +mapFile("/data/blocklistchange/blocklist_update2.xml", testserver); +mapFile("/data/blocklistchange/manual_update.xml", testserver); + +testserver.registerDirectory("/addons/", do_get_file("addons")); + + +var default_theme = { + id: "default@tests.mozilla.org", + version: "1.0", + name: "Softblocked add-on", + internalName: "classic/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock1_1 = { + id: "softblock1@tests.mozilla.org", + version: "1.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update1.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock1_2 = { + id: "softblock1@tests.mozilla.org", + version: "2.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update2.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock1_3 = { + id: "softblock1@tests.mozilla.org", + version: "3.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update3.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock2_1 = { + id: "softblock2@tests.mozilla.org", + version: "1.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update1.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock2_2 = { + id: "softblock2@tests.mozilla.org", + version: "2.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update2.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock2_3 = { + id: "softblock2@tests.mozilla.org", + version: "3.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update3.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock3_1 = { + id: "softblock3@tests.mozilla.org", + version: "1.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update1.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock3_2 = { + id: "softblock3@tests.mozilla.org", + version: "2.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update2.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock3_3 = { + id: "softblock3@tests.mozilla.org", + version: "3.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update3.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock4_1 = { + id: "softblock4@tests.mozilla.org", + version: "1.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update1.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock4_2 = { + id: "softblock4@tests.mozilla.org", + version: "2.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update2.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock4_3 = { + id: "softblock4@tests.mozilla.org", + version: "3.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update3.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock5_1 = { + id: "softblock5@tests.mozilla.org", + version: "1.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update1.rdf", + internalName: "test/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock5_2 = { + id: "softblock5@tests.mozilla.org", + version: "2.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update2.rdf", + internalName: "test/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var softblock5_3 = { + id: "softblock5@tests.mozilla.org", + version: "3.0", + name: "Softblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update3.rdf", + internalName: "test/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var hardblock_1 = { + id: "hardblock@tests.mozilla.org", + version: "1.0", + name: "Hardblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update1.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var hardblock_2 = { + id: "hardblock@tests.mozilla.org", + version: "2.0", + name: "Hardblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update2.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var hardblock_3 = { + id: "hardblock@tests.mozilla.org", + version: "3.0", + name: "Hardblocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update3.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var regexpblock_1 = { + id: "regexpblock@tests.mozilla.org", + version: "1.0", + name: "RegExp-blocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update1.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var regexpblock_2 = { + id: "regexpblock@tests.mozilla.org", + version: "2.0", + name: "RegExp-blocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update2.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +var regexpblock_3 = { + id: "regexpblock@tests.mozilla.org", + version: "3.0", + name: "RegExp-blocked add-on", + updateURL: "http://localhost:" + gPort + "/data/blocklistchange/addon_update3.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}; + +const ADDON_IDS = ["softblock1@tests.mozilla.org", + "softblock2@tests.mozilla.org", + "softblock3@tests.mozilla.org", + "softblock4@tests.mozilla.org", + "softblock5@tests.mozilla.org", + "hardblock@tests.mozilla.org", + "regexpblock@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, 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 = openArgs.wrappedJSObject.list; + list.forEach(function(aItem) { + if (!aItem.blocked) + aItem.disable = true; + }); + + //run the code after the blocklist is closed + Services.obs.notifyObservers(null, "addon-blocklist-closed", null); + + }, + + QueryInterface: function(iid) { + if (iid.equals(Ci.nsIWindowWatcher) + || iid.equals(Ci.nsISupports)) + return this; + + throw Cr.NS_ERROR_NO_INTERFACE; + } +}; + +var WindowWatcherFactory = { + createInstance: function createInstance(outer, iid) { + if (outer != null) + throw Components.results.NS_ERROR_NO_AGGREGATION; + return WindowWatcher.QueryInterface(iid); + } +}; + +var InstallConfirm = { + confirm: function(aWindow, aUrl, aInstalls, aInstallCount) { + aInstalls.forEach(function(aInstall) { + aInstall.install(); + }); + }, + + QueryInterface: function(iid) { + if (iid.equals(Ci.amIWebInstallPrompt) + || iid.equals(Ci.nsISupports)) + return this; + + throw Cr.NS_ERROR_NO_INTERFACE; + } +}; + +var InstallConfirmFactory = { + createInstance: function createInstance(outer, iid) { + if (outer != null) + throw Components.results.NS_ERROR_NO_AGGREGATION; + return InstallConfirm.QueryInterface(iid); + } +}; + +var registrar = Components.manager.QueryInterface(Components.interfaces.nsIComponentRegistrar); +registrar.registerFactory(Components.ID("{1dfeb90a-2193-45d5-9cb8-864928b2af55}"), + "Fake Window Watcher", + "@mozilla.org/embedcomp/window-watcher;1", WindowWatcherFactory); +registrar.registerFactory(Components.ID("{f0863905-4dde-42e2-991c-2dc8209bc9ca}"), + "Fake Install Prompt", + "@mozilla.org/addons/web-install-prompt;1", InstallConfirmFactory); + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function Pload_blocklist(aFile) { + let blocklist_updated = new Promise((resolve, reject) => { + Services.obs.addObserver(function() { + Services.obs.removeObserver(arguments.callee, "blocklist-updated"); + + resolve(); + }, "blocklist-updated", false); + }); + + Services.prefs.setCharPref("extensions.blocklist.url", "http://localhost:" + gPort + "/data/blocklistchange/" + aFile); + var blocklist = Cc["@mozilla.org/extensions/blocklist;1"]. + getService(Ci.nsITimerCallback); + blocklist.notify(null); + return blocklist_updated; +} + +// Does a background update check for add-ons and returns a promise that +// resolves when any started installs complete +function Pbackground_update() { + var installCount = 0; + var backgroundCheckCompleted = false; + + let updated = new Promise((resolve, reject) => { + AddonManager.addInstallListener({ + onNewInstall: function(aInstall) { + installCount++; + }, + + onInstallEnded: function(aInstall) { + installCount--; + // Wait until all started installs have completed + if (installCount) + return; + + AddonManager.removeInstallListener(this); + + // If the background check hasn't yet completed then let that call the + // callback when it is done + if (!backgroundCheckCompleted) + return; + + resolve(); + } + }) + + Services.obs.addObserver(function() { + Services.obs.removeObserver(arguments.callee, "addons-background-update-complete"); + backgroundCheckCompleted = true; + + // If any new installs have started then we'll call the callback once they + // are completed + if (installCount) + return; + + resolve(); + }, "addons-background-update-complete", false); + }); + + AddonManagerPrivate.backgroundUpdateCheck(); + return updated; +} + +// Manually updates the test add-ons to the given version +function Pmanual_update(aVersion) { + let Pinstalls = []; + for (let name of ["soft1", "soft2", "soft3", "soft4", "soft5", "hard1", "regexp1"]) { + Pinstalls.push(new Promise((resolve, reject) => { + AddonManager.getInstallForURL("http://localhost:" + gPort + "/addons/blocklist_" + + name + "_" + aVersion + ".xpi", + resolve, "application/x-xpinstall"); + })); + } + + return Promise.all(Pinstalls).then(installs => { + let completePromises = []; + for (let install of installs) { + completePromises.push(new Promise(resolve => { + install.addListener({ + onDownloadCancelled: resolve, + onInstallEnded: resolve + }) + })); + } + + // Use the default web installer to cancel/allow installs based on whether + // the add-on is valid or not. + let webInstaller = Cc["@mozilla.org/addons/web-install-listener;1"] + .getService(Ci.amIWebInstallListener); + webInstaller.onWebInstallRequested(null, null, installs, installs.length); + + return Promise.all(completePromises); + }); +} + +// Checks that an add-ons properties match expected values +function check_addon(aAddon, aExpectedVersion, aExpectedUserDisabled, + aExpectedSoftDisabled, aExpectedState) { + do_check_neq(aAddon, null); + do_print("Testing " + aAddon.id + " version " + aAddon.version + " user " + + aAddon.userDisabled + " soft " + aAddon.softDisabled + + " perms " + aAddon.permissions); + + do_check_eq(aAddon.version, aExpectedVersion); + do_check_eq(aAddon.blocklistState, aExpectedState); + do_check_eq(aAddon.userDisabled, aExpectedUserDisabled); + do_check_eq(aAddon.softDisabled, aExpectedSoftDisabled); + if (aAddon.softDisabled) + do_check_true(aAddon.userDisabled); + + if (aExpectedState == Ci.nsIBlocklistService.STATE_BLOCKED) { + do_print("blocked, PERM_CAN_ENABLE " + aAddon.id); + do_check_false(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_ENABLE)); + do_print("blocked, PERM_CAN_DISABLE " + aAddon.id); + do_check_false(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_DISABLE)); + } + else if (aAddon.userDisabled) { + do_print("userDisabled, PERM_CAN_ENABLE " + aAddon.id); + do_check_true(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_ENABLE)); + do_print("userDisabled, PERM_CAN_DISABLE " + aAddon.id); + do_check_false(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_DISABLE)); + } + else { + do_print("other, PERM_CAN_ENABLE " + aAddon.id); + do_check_false(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_ENABLE)); + if (aAddon.type != "theme") { + do_print("other, PERM_CAN_DISABLE " + aAddon.id); + do_check_true(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_DISABLE)); + } + } + do_check_eq(aAddon.appDisabled, aExpectedState == Ci.nsIBlocklistService.STATE_BLOCKED); + + let willBeActive = aAddon.isActive; + if (hasFlag(aAddon.pendingOperations, AddonManager.PENDING_DISABLE)) + willBeActive = false; + else if (hasFlag(aAddon.pendingOperations, AddonManager.PENDING_ENABLE)) + willBeActive = true; + + if (aExpectedUserDisabled || aExpectedState == Ci.nsIBlocklistService.STATE_BLOCKED) { + do_check_false(willBeActive); + } + else { + do_check_true(willBeActive); + } +} + +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1"); + run_next_test(); +} + +add_task(function* init() { + writeInstallRDFForExtension(default_theme, profileDir); + writeInstallRDFForExtension(softblock1_1, profileDir); + writeInstallRDFForExtension(softblock2_1, profileDir); + writeInstallRDFForExtension(softblock3_1, profileDir); + writeInstallRDFForExtension(softblock4_1, profileDir); + writeInstallRDFForExtension(softblock5_1, profileDir); + writeInstallRDFForExtension(hardblock_1, profileDir); + writeInstallRDFForExtension(regexpblock_1, profileDir); + startupManager(); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + s4.userDisabled = true; + s5.userDisabled = false; +}); + +// Starts with add-ons unblocked and then switches application versions to +// change add-ons to blocked and back +add_task(function* run_app_update_test() { + do_print("Test: " + arguments.callee.name); + yield promiseRestartManager(); + yield Pload_blocklist("app_update.xml"); + yield promiseRestartManager(); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "test/1.0"); +}); + +add_task(function* app_update_step_2() { + yield promiseRestartManager("2"); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); +}); + +add_task(function* app_update_step_3() { + yield promiseRestartManager(); + + yield promiseRestartManager("2.5"); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); +}); + +add_task(function* app_update_step_4() { + yield promiseRestartManager("1"); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s1.userDisabled = false; + s2.userDisabled = false; + s5.userDisabled = false; +}); + +// Starts with add-ons unblocked and then switches application versions to +// change add-ons to blocked and back. A DB schema change is faked to force a +// rebuild when the application version changes +add_task(function* run_app_update_schema_test() { + do_print("Test: " + arguments.callee.name); + yield promiseRestartManager(); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "test/1.0"); +}); + +add_task(function* update_schema_2() { + yield promiseShutdownManager(); + + changeXPIDBVersion(100); + gAppInfo.version = "2"; + startupManager(true); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); +}); + +add_task(function* update_schema_3() { + yield promiseRestartManager(); + + yield promiseShutdownManager(); + changeXPIDBVersion(100); + gAppInfo.version = "2.5"; + startupManager(true); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); +}); + +add_task(function* update_schema_4() { + yield promiseShutdownManager(); + + changeXPIDBVersion(100); + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); +}); + +add_task(function* update_schema_5() { + yield promiseShutdownManager(); + + changeXPIDBVersion(100); + gAppInfo.version = "1"; + startupManager(true); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s1.userDisabled = false; + s2.userDisabled = false; + s5.userDisabled = false; +}); + +// Starts with add-ons unblocked and then loads new blocklists to change add-ons +// to blocked and back again. +add_task(function* run_blocklist_update_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield Pload_blocklist("blocklist_update1.xml"); + yield promiseRestartManager(); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "test/1.0"); + + yield Pload_blocklist("blocklist_update2.xml"); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + + yield promiseRestartManager(); + + yield Pload_blocklist("blocklist_update2.xml"); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + yield Pload_blocklist("blocklist_update1.xml"); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s1.userDisabled = false; + s2.userDisabled = false; + s5.userDisabled = false; +}); + +// Starts with add-ons unblocked and then new versions are installed outside of +// the app to change them to blocked and back again. +add_task(function* run_addon_change_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield Pload_blocklist("addon_change.xml"); + yield promiseRestartManager(); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "test/1.0"); +}); + +add_task(function* run_addon_change_2() { + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_2, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock1_2.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock2_2, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock2_2.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock3_2, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock3_2.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock4_2, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock4_2.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock5_2, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock5_2.id), Date.now() + 10000); + writeInstallRDFForExtension(hardblock_2, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, hardblock_2.id), Date.now() + 10000); + writeInstallRDFForExtension(regexpblock_2, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, regexpblock_2.id), Date.now() + 10000); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "2.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "2.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "2.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); +}); + +add_task(function* run_addon_change_3() { + yield promiseRestartManager(); + + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock1_3.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock2_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock2_3.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock3_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock3_3.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock4_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock4_3.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock5_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock5_3.id), Date.now() + 20000); + writeInstallRDFForExtension(hardblock_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, hardblock_3.id), Date.now() + 20000); + writeInstallRDFForExtension(regexpblock_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, regexpblock_3.id), Date.now() + 20000); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "3.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "3.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "3.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "3.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "3.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "3.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "3.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); +}); + +add_task(function* run_addon_change_4() { + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock1_1.id), Date.now() + 30000); + writeInstallRDFForExtension(softblock2_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock2_1.id), Date.now() + 30000); + writeInstallRDFForExtension(softblock3_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock3_1.id), Date.now() + 30000); + writeInstallRDFForExtension(softblock4_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock4_1.id), Date.now() + 30000); + writeInstallRDFForExtension(softblock5_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock5_1.id), Date.now() + 30000); + writeInstallRDFForExtension(hardblock_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, hardblock_1.id), Date.now() + 30000); + writeInstallRDFForExtension(regexpblock_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, regexpblock_1.id), Date.now() + 30000); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + do_check_eq(Services.prefs.getCharPref("general.skins.selectedSkin"), "classic/1.0"); + + s1.userDisabled = false; + s2.userDisabled = false; + s5.userDisabled = false; +}); + +// Starts with add-ons blocked and then new versions are installed outside of +// the app to change them to unblocked. +add_task(function* run_addon_change_2_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield promiseShutdownManager(); + + getFileForAddon(profileDir, softblock1_1.id).remove(true); + getFileForAddon(profileDir, softblock2_1.id).remove(true); + getFileForAddon(profileDir, softblock3_1.id).remove(true); + getFileForAddon(profileDir, softblock4_1.id).remove(true); + getFileForAddon(profileDir, softblock5_1.id).remove(true); + getFileForAddon(profileDir, hardblock_1.id).remove(true); + getFileForAddon(profileDir, regexpblock_1.id).remove(true); + + startupManager(false); + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_2, profileDir); + writeInstallRDFForExtension(softblock2_2, profileDir); + writeInstallRDFForExtension(softblock3_2, profileDir); + writeInstallRDFForExtension(softblock4_2, profileDir); + writeInstallRDFForExtension(softblock5_2, profileDir); + writeInstallRDFForExtension(hardblock_2, profileDir); + writeInstallRDFForExtension(regexpblock_2, profileDir); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "2.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "2.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "2.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); +}); + +add_task(function* addon_change_2_test_2() { + yield promiseRestartManager(); + + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock1_3.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock2_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock2_3.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock3_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock3_3.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock4_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock4_3.id), Date.now() + 10000); + writeInstallRDFForExtension(softblock5_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock5_3.id), Date.now() + 10000); + writeInstallRDFForExtension(hardblock_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, hardblock_3.id), Date.now() + 10000); + writeInstallRDFForExtension(regexpblock_3, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, regexpblock_3.id), Date.now() + 10000); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "3.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "3.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "3.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "3.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "3.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); +}); + +add_task(function* addon_change_2_test_3() { + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock1_1.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock2_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock2_1.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock3_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock3_1.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock4_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock4_1.id), Date.now() + 20000); + writeInstallRDFForExtension(softblock5_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, softblock5_1.id), Date.now() + 20000); + writeInstallRDFForExtension(hardblock_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, hardblock_1.id), Date.now() + 20000); + writeInstallRDFForExtension(regexpblock_1, profileDir); + setExtensionModifiedTime(getFileForAddon(profileDir, regexpblock_1.id), Date.now() + 20000); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + + s1.userDisabled = false; + s2.userDisabled = false; + s4.userDisabled = true; + s5.userDisabled = false; +}); + +// Add-ons are initially unblocked then attempts to upgrade to blocked versions +// in the background which should fail +add_task(function* run_background_update_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield promiseRestartManager(); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + + yield Pbackground_update(); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); +}); + +// Starts with add-ons blocked and then new versions are detected and installed +// automatically for unblocked versions. +add_task(function* run_background_update_2_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield promiseShutdownManager(); + + getFileForAddon(profileDir, softblock1_1.id).remove(true); + getFileForAddon(profileDir, softblock2_1.id).remove(true); + getFileForAddon(profileDir, softblock3_1.id).remove(true); + getFileForAddon(profileDir, softblock4_1.id).remove(true); + getFileForAddon(profileDir, softblock5_1.id).remove(true); + getFileForAddon(profileDir, hardblock_1.id).remove(true); + getFileForAddon(profileDir, regexpblock_1.id).remove(true); + + startupManager(false); + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_3, profileDir); + writeInstallRDFForExtension(softblock2_3, profileDir); + writeInstallRDFForExtension(softblock3_3, profileDir); + writeInstallRDFForExtension(softblock4_3, profileDir); + writeInstallRDFForExtension(softblock5_3, profileDir); + writeInstallRDFForExtension(hardblock_3, profileDir); + writeInstallRDFForExtension(regexpblock_3, profileDir); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "3.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "3.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "3.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "3.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "3.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "3.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "3.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + + yield promiseRestartManager(); + + yield Pbackground_update(); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + + s1.userDisabled = false; + s2.userDisabled = false; + s4.userDisabled = true; + s5.userDisabled = true; +}); + +// Starts with add-ons blocked and then simulates the user upgrading them to +// unblocked versions. +add_task(function* run_manual_update_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield promiseRestartManager(); + yield Pload_blocklist("manual_update.xml"); + yield promiseRestartManager(); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + + yield promiseRestartManager(); + + yield Pmanual_update("2"); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "2.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s4, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s5, "2.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + // Can't manually update to a hardblocked add-on + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + + yield Pmanual_update("3"); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "3.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s4, "3.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s5, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); +}); + +// Starts with add-ons blocked and then new versions are installed outside of +// the app to change them to unblocked. +add_task(function* run_manual_update_2_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield promiseShutdownManager(); + + getFileForAddon(profileDir, softblock1_1.id).remove(true); + getFileForAddon(profileDir, softblock2_1.id).remove(true); + getFileForAddon(profileDir, softblock3_1.id).remove(true); + getFileForAddon(profileDir, softblock4_1.id).remove(true); + getFileForAddon(profileDir, softblock5_1.id).remove(true); + getFileForAddon(profileDir, hardblock_1.id).remove(true); + getFileForAddon(profileDir, regexpblock_1.id).remove(true); + + startupManager(false); + yield promiseShutdownManager(); + + writeInstallRDFForExtension(softblock1_1, profileDir); + writeInstallRDFForExtension(softblock2_1, profileDir); + writeInstallRDFForExtension(softblock3_1, profileDir); + writeInstallRDFForExtension(softblock4_1, profileDir); + writeInstallRDFForExtension(softblock5_1, profileDir); + writeInstallRDFForExtension(hardblock_1, profileDir); + writeInstallRDFForExtension(regexpblock_1, profileDir); + + startupManager(false); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + + s2.userDisabled = false; + s2.userDisabled = true; + check_addon(s2, "1.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + s3.userDisabled = false; + check_addon(s3, "1.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + yield promiseRestartManager(); + + yield Pmanual_update("2"); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "2.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "2.0", true, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "2.0", false, false, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + // Can't manually update to a hardblocked add-on + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + + yield promiseRestartManager(); + + yield Pmanual_update("3"); + yield promiseRestartManager(); + + [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s2, "3.0", true, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(s3, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(h, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + check_addon(r, "3.0", false, false, Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + + s1.userDisabled = false; + s2.userDisabled = false; + s4.userDisabled = true; +}); + +// Uses the API to install blocked add-ons from the local filesystem +add_task(function* run_local_install_test() { + do_print("Test: " + arguments.callee.name + "\n"); + yield promiseShutdownManager(); + + getFileForAddon(profileDir, softblock1_1.id).remove(true); + getFileForAddon(profileDir, softblock2_1.id).remove(true); + getFileForAddon(profileDir, softblock3_1.id).remove(true); + getFileForAddon(profileDir, softblock4_1.id).remove(true); + getFileForAddon(profileDir, softblock5_1.id).remove(true); + getFileForAddon(profileDir, hardblock_1.id).remove(true); + getFileForAddon(profileDir, regexpblock_1.id).remove(true); + + startupManager(false); + + yield promiseInstallAllFiles([ + do_get_file("addons/blocklist_soft1_1.xpi"), + do_get_file("addons/blocklist_soft2_1.xpi"), + do_get_file("addons/blocklist_soft3_1.xpi"), + do_get_file("addons/blocklist_soft4_1.xpi"), + do_get_file("addons/blocklist_soft5_1.xpi"), + do_get_file("addons/blocklist_hard1_1.xpi"), + do_get_file("addons/blocklist_regexp1_1.xpi") + ]); + + let aInstalls = yield new Promise((resolve, reject) => { + AddonManager.getAllInstalls(resolve) + }); + // Should have finished all installs without needing to restart + do_check_eq(aInstalls.length, 0); + + let [s1, s2, s3, s4, s5, h, r] = yield promiseAddonsByIDs(ADDON_IDS); + + check_addon(s1, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s2, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(s3, "1.0", true, true, Ci.nsIBlocklistService.STATE_SOFTBLOCKED); + check_addon(h, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); + check_addon(r, "1.0", false, false, Ci.nsIBlocklistService.STATE_BLOCKED); +}); + +add_task(function* shutdown_httpserver() { + yield new Promise((resolve, reject) => { + testserver.stop(resolve); + }); +}); -- cgit v1.2.3