diff options
author | Matt A. Tobin <email@mattatobin.com> | 2018-02-10 02:49:12 -0500 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2018-02-10 02:49:12 -0500 |
commit | 4fb11cd5966461bccc3ed1599b808237be6b0de9 (patch) | |
tree | d7f0ccd49cebb3544d52635ff1bd6ed4d763823f /toolkit/mozapps/webextensions/test/xpcshell/test_delay_update_webextension.js | |
parent | f164d9124708b50789dbb6959e1de96cc5697c48 (diff) | |
download | UXP-4fb11cd5966461bccc3ed1599b808237be6b0de9.tar UXP-4fb11cd5966461bccc3ed1599b808237be6b0de9.tar.gz UXP-4fb11cd5966461bccc3ed1599b808237be6b0de9.tar.lz UXP-4fb11cd5966461bccc3ed1599b808237be6b0de9.tar.xz UXP-4fb11cd5966461bccc3ed1599b808237be6b0de9.zip |
Move WebExtensions enabled Add-ons Manager
Diffstat (limited to 'toolkit/mozapps/webextensions/test/xpcshell/test_delay_update_webextension.js')
-rw-r--r-- | toolkit/mozapps/webextensions/test/xpcshell/test_delay_update_webextension.js | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/xpcshell/test_delay_update_webextension.js b/toolkit/mozapps/webextensions/test/xpcshell/test_delay_update_webextension.js new file mode 100644 index 000000000..cdfac8f8c --- /dev/null +++ b/toolkit/mozapps/webextensions/test/xpcshell/test_delay_update_webextension.js @@ -0,0 +1,344 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that delaying an update works for WebExtensions. + +// The test extension uses an insecure update url. +Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false); + +/* globals browser*/ + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); +const tempdir = gTmpD.clone(); +const stageDir = profileDir.clone(); +stageDir.append("staged"); + +const IGNORE_ID = "test_delay_update_ignore_webext@tests.mozilla.org"; +const COMPLETE_ID = "test_delay_update_complete_webext@tests.mozilla.org"; +const DEFER_ID = "test_delay_update_defer_webext@tests.mozilla.org"; +const NOUPDATE_ID = "test_no_update_webext@tests.mozilla.org"; + +// Create and configure the HTTP server. +let testserver = createHttpServer(); +gPort = testserver.identity.primaryPort; +mapFile("/data/test_delay_updates_complete.json", testserver); +mapFile("/data/test_delay_updates_ignore.json", testserver); +mapFile("/data/test_delay_updates_defer.json", testserver); +mapFile("/data/test_no_update.json", testserver); +testserver.registerDirectory("/addons/", do_get_file("addons")); + +createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42"); + +const { Management } = Components.utils.import("resource://gre/modules/Extension.jsm", {}); + +function promiseWebExtensionStartup() { + return new Promise(resolve => { + let listener = (event, extension) => { + Management.off("startup", listener); + resolve(extension); + }; + + Management.on("startup", listener); + }); +} + +// add-on registers upgrade listener, and ignores update. +add_task(function* delay_updates_ignore() { + startupManager(); + + let extension = ExtensionTestUtils.loadExtension({ + useAddonManager: "permanent", + manifest: { + "version": "1.0", + "applications": { + "gecko": { + "id": IGNORE_ID, + "update_url": `http://localhost:${gPort}/data/test_delay_updates_ignore.json`, + }, + }, + }, + background() { + browser.runtime.onUpdateAvailable.addListener(details => { + if (details) { + if (details.version) { + // This should be the version of the pending update. + browser.test.assertEq("2.0", details.version, "correct version"); + browser.test.notifyPass("delay"); + } + } else { + browser.test.fail("no details object passed"); + } + }); + browser.test.sendMessage("ready"); + }, + }, IGNORE_ID); + + yield Promise.all([extension.startup(), extension.awaitMessage("ready")]); + + let addon = yield promiseAddonByID(IGNORE_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Generated extension"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + let update = yield promiseFindAddonUpdates(addon); + let install = update.updateAvailable; + + yield promiseCompleteAllInstalls([install]); + + do_check_eq(install.state, AddonManager.STATE_POSTPONED); + + // addon upgrade has been delayed + let addon_postponed = yield promiseAddonByID(IGNORE_ID); + do_check_neq(addon_postponed, null); + do_check_eq(addon_postponed.version, "1.0"); + do_check_eq(addon_postponed.name, "Generated extension"); + do_check_true(addon_postponed.isCompatible); + do_check_false(addon_postponed.appDisabled); + do_check_true(addon_postponed.isActive); + do_check_eq(addon_postponed.type, "extension"); + + yield extension.awaitFinish("delay"); + + // restarting allows upgrade to proceed + yield extension.markUnloaded(); + yield promiseRestartManager(); + + let addon_upgraded = yield promiseAddonByID(IGNORE_ID); + yield promiseWebExtensionStartup(); + + do_check_neq(addon_upgraded, null); + do_check_eq(addon_upgraded.version, "2.0"); + do_check_eq(addon_upgraded.name, "Delay Upgrade"); + do_check_true(addon_upgraded.isCompatible); + do_check_false(addon_upgraded.appDisabled); + do_check_true(addon_upgraded.isActive); + do_check_eq(addon_upgraded.type, "extension"); + + yield addon_upgraded.uninstall(); + yield promiseShutdownManager(); +}); + +// add-on registers upgrade listener, and allows update. +add_task(function* delay_updates_complete() { + startupManager(); + + let extension = ExtensionTestUtils.loadExtension({ + useAddonManager: "permanent", + manifest: { + "version": "1.0", + "applications": { + "gecko": { + "id": COMPLETE_ID, + "update_url": `http://localhost:${gPort}/data/test_delay_updates_complete.json`, + }, + }, + }, + background() { + browser.runtime.onUpdateAvailable.addListener(details => { + browser.test.notifyPass("reload"); + browser.runtime.reload(); + }); + browser.test.sendMessage("ready"); + }, + }, COMPLETE_ID); + + yield Promise.all([extension.startup(), extension.awaitMessage("ready")]); + + let addon = yield promiseAddonByID(COMPLETE_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Generated extension"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + let update = yield promiseFindAddonUpdates(addon); + let install = update.updateAvailable; + + let promiseInstalled = promiseAddonEvent("onInstalled"); + yield promiseCompleteAllInstalls([install]); + + yield extension.awaitFinish("reload"); + + // addon upgrade has been allowed + let [addon_allowed] = yield promiseInstalled; + yield promiseWebExtensionStartup(); + + do_check_neq(addon_allowed, null); + do_check_eq(addon_allowed.version, "2.0"); + do_check_eq(addon_allowed.name, "Delay Upgrade"); + do_check_true(addon_allowed.isCompatible); + do_check_false(addon_allowed.appDisabled); + do_check_true(addon_allowed.isActive); + do_check_eq(addon_allowed.type, "extension"); + + if (stageDir.exists()) { + do_throw("Staging directory should not exist for formerly-postponed extension"); + } + + yield extension.markUnloaded(); + yield addon_allowed.uninstall(); + yield promiseShutdownManager(); +}); + +// add-on registers upgrade listener, initially defers update then allows upgrade +add_task(function* delay_updates_defer() { + startupManager(); + + let extension = ExtensionTestUtils.loadExtension({ + useAddonManager: "permanent", + manifest: { + "version": "1.0", + "applications": { + "gecko": { + "id": DEFER_ID, + "update_url": `http://localhost:${gPort}/data/test_delay_updates_defer.json`, + }, + }, + }, + background() { + browser.runtime.onUpdateAvailable.addListener(details => { + // Upgrade will only proceed when "allow" message received. + browser.test.onMessage.addListener(msg => { + if (msg == "allow") { + browser.test.notifyPass("allowed"); + browser.runtime.reload(); + } else { + browser.test.fail(`wrong message: ${msg}`); + } + }); + browser.test.sendMessage("truly ready"); + }); + browser.test.sendMessage("ready"); + }, + }, DEFER_ID); + + yield Promise.all([extension.startup(), extension.awaitMessage("ready")]); + + let addon = yield promiseAddonByID(DEFER_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Generated extension"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + let update = yield promiseFindAddonUpdates(addon); + let install = update.updateAvailable; + + let promiseInstalled = promiseAddonEvent("onInstalled"); + yield promiseCompleteAllInstalls([install]); + + do_check_eq(install.state, AddonManager.STATE_POSTPONED); + + // upgrade is initially postponed + let addon_postponed = yield promiseAddonByID(DEFER_ID); + do_check_neq(addon_postponed, null); + do_check_eq(addon_postponed.version, "1.0"); + do_check_eq(addon_postponed.name, "Generated extension"); + do_check_true(addon_postponed.isCompatible); + do_check_false(addon_postponed.appDisabled); + do_check_true(addon_postponed.isActive); + do_check_eq(addon_postponed.type, "extension"); + + // add-on will not allow upgrade until message is received + yield extension.awaitMessage("truly ready"); + extension.sendMessage("allow"); + yield extension.awaitFinish("allowed"); + + // addon upgrade has been allowed + let [addon_allowed] = yield promiseInstalled; + yield promiseWebExtensionStartup(); + + do_check_neq(addon_allowed, null); + do_check_eq(addon_allowed.version, "2.0"); + do_check_eq(addon_allowed.name, "Delay Upgrade"); + do_check_true(addon_allowed.isCompatible); + do_check_false(addon_allowed.appDisabled); + do_check_true(addon_allowed.isActive); + do_check_eq(addon_allowed.type, "extension"); + + yield extension.markUnloaded(); + yield promiseRestartManager(); + + // restart changes nothing + addon_allowed = yield promiseAddonByID(DEFER_ID); + yield promiseWebExtensionStartup(); + + do_check_neq(addon_allowed, null); + do_check_eq(addon_allowed.version, "2.0"); + do_check_eq(addon_allowed.name, "Delay Upgrade"); + do_check_true(addon_allowed.isCompatible); + do_check_false(addon_allowed.appDisabled); + do_check_true(addon_allowed.isActive); + do_check_eq(addon_allowed.type, "extension"); + + yield addon_allowed.uninstall(); + yield promiseShutdownManager(); +}); + +// browser.runtime.reload() without a pending upgrade should just reload. +add_task(function* runtime_reload() { + startupManager(); + + let extension = ExtensionTestUtils.loadExtension({ + useAddonManager: "permanent", + manifest: { + "version": "1.0", + "applications": { + "gecko": { + "id": NOUPDATE_ID, + "update_url": `http://localhost:${gPort}/data/test_no_update.json`, + }, + }, + }, + background() { + browser.test.onMessage.addListener(msg => { + if (msg == "reload") { + browser.runtime.reload(); + } else { + browser.test.fail(`wrong message: ${msg}`); + } + }); + browser.test.sendMessage("ready"); + }, + }, NOUPDATE_ID); + + yield Promise.all([extension.startup(), extension.awaitMessage("ready")]); + + let addon = yield promiseAddonByID(NOUPDATE_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Generated extension"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + yield promiseFindAddonUpdates(addon); + + extension.sendMessage("reload"); + // Wait for extension to restart, to make sure reload works. + yield promiseWebExtensionStartup(); + + addon = yield promiseAddonByID(NOUPDATE_ID); + do_check_neq(addon, null); + do_check_eq(addon.version, "1.0"); + do_check_eq(addon.name, "Generated extension"); + do_check_true(addon.isCompatible); + do_check_false(addon.appDisabled); + do_check_true(addon.isActive); + do_check_eq(addon.type, "extension"); + + yield extension.markUnloaded(); + yield addon.uninstall(); + yield promiseShutdownManager(); +}); |