summaryrefslogtreecommitdiff
path: root/toolkit/mozapps/webextensions/test/xpcshell/test_dictionary.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/webextensions/test/xpcshell/test_dictionary.js')
-rw-r--r--toolkit/mozapps/webextensions/test/xpcshell/test_dictionary.js811
1 files changed, 811 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/xpcshell/test_dictionary.js b/toolkit/mozapps/webextensions/test/xpcshell/test_dictionary.js
new file mode 100644
index 0000000000..f4b6a05351
--- /dev/null
+++ b/toolkit/mozapps/webextensions/test/xpcshell/test_dictionary.js
@@ -0,0 +1,811 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// This verifies that bootstrappable add-ons can be used without restarts.
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+// Enable loading extensions from the user scopes
+Services.prefs.setIntPref("extensions.enabledScopes",
+ AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER);
+
+// The test extension uses an insecure update url.
+Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
+
+createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
+
+const profileDir = gProfD.clone();
+profileDir.append("extensions");
+const userExtDir = gProfD.clone();
+userExtDir.append("extensions2");
+userExtDir.append(gAppInfo.ID);
+registerDirectory("XREUSysExt", userExtDir.parent);
+
+Components.utils.import("resource://testing-common/httpd.js");
+// Create and configure the HTTP server.
+var testserver = new HttpServer();
+testserver.start(-1);
+gPort = testserver.identity.primaryPort;
+
+// register files with server
+testserver.registerDirectory("/addons/", do_get_file("addons"));
+mapFile("/data/test_dictionary.rdf", testserver);
+
+/**
+ * This object is both a factory and an mozISpellCheckingEngine implementation (so, it
+ * is de-facto a service). It's also an interface requestor that gives out
+ * itself when asked for mozISpellCheckingEngine.
+ */
+var HunspellEngine = {
+ dictionaryDirs: [],
+ listener: null,
+
+ QueryInterface: function hunspell_qi(iid) {
+ if (iid.equals(Components.interfaces.nsISupports) ||
+ iid.equals(Components.interfaces.nsIFactory) ||
+ iid.equals(Components.interfaces.mozISpellCheckingEngine))
+ return this;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ },
+ createInstance: function hunspell_ci(outer, iid) {
+ if (outer)
+ throw Components.results.NS_ERROR_NO_AGGREGATION;
+ return this.QueryInterface(iid);
+ },
+ lockFactory: function hunspell_lockf(lock) {
+ throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+ },
+
+ addDirectory: function hunspell_addDirectory(dir) {
+ this.dictionaryDirs.push(dir);
+ if (this.listener)
+ this.listener("addDirectory");
+ },
+
+ removeDirectory: function hunspell_addDirectory(dir) {
+ this.dictionaryDirs.splice(this.dictionaryDirs.indexOf(dir), 1);
+ if (this.listener)
+ this.listener("removeDirectory");
+ },
+
+ getInterface: function hunspell_gi(iid) {
+ if (iid.equals(Components.interfaces.mozISpellCheckingEngine))
+ return this;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ },
+
+ contractID: "@mozilla.org/spellchecker/engine;1",
+ classID: Components.ID("{6f3c63bc-a4fd-449b-9a58-a2d9bd972cce}"),
+
+ activate: function hunspell_activate() {
+ this.origClassID = Components.manager.nsIComponentRegistrar
+ .contractIDToCID(this.contractID);
+ this.origFactory = Components.manager
+ .getClassObject(Components.classes[this.contractID],
+ Components.interfaces.nsIFactory);
+
+ Components.manager.nsIComponentRegistrar
+ .unregisterFactory(this.origClassID, this.origFactory);
+ Components.manager.nsIComponentRegistrar.registerFactory(this.classID,
+ "Test hunspell", this.contractID, this);
+ },
+
+ deactivate: function hunspell_deactivate() {
+ Components.manager.nsIComponentRegistrar.unregisterFactory(this.classID, this);
+ Components.manager.nsIComponentRegistrar.registerFactory(this.origClassID,
+ "Hunspell", this.contractID, this.origFactory);
+ },
+
+ isDictionaryEnabled: function hunspell_isDictionaryEnabled(name) {
+ return this.dictionaryDirs.some(function(dir) {
+ var dic = dir.clone();
+ dic.append(name);
+ return dic.exists();
+ });
+ }
+};
+
+function run_test() {
+ do_test_pending();
+
+ startupManager();
+
+ run_test_1();
+}
+
+// Tests that installing doesn't require a restart
+function run_test_1() {
+ prepare_test({ }, [
+ "onNewInstall"
+ ]);
+
+ HunspellEngine.activate();
+
+ AddonManager.getInstallForFile(do_get_addon("test_dictionary"), function(install) {
+ ensure_test_completed();
+
+ do_check_neq(install, null);
+ do_check_eq(install.type, "dictionary");
+ do_check_eq(install.version, "1.0");
+ do_check_eq(install.name, "Test Dictionary");
+ do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
+ do_check_true(install.addon.hasResource("install.rdf"));
+ do_check_false(install.addon.hasResource("bootstrap.js"));
+ do_check_eq(install.addon.operationsRequiringRestart &
+ AddonManager.OP_NEEDS_RESTART_INSTALL, 0);
+ do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ let addon = install.addon;
+ prepare_test({
+ "ab-CD@dictionaries.addons.mozilla.org": [
+ ["onInstalling", false],
+ "onInstalled"
+ ]
+ }, [
+ "onInstallStarted",
+ "onInstallEnded",
+ ], function() {
+ do_check_true(addon.hasResource("install.rdf"));
+ HunspellEngine.listener = function(aEvent) {
+ HunspellEngine.listener = null;
+ do_check_eq(aEvent, "addDirectory");
+ do_execute_soon(check_test_1);
+ };
+ });
+ install.install();
+ });
+}
+
+function check_test_1() {
+ AddonManager.getAllInstalls(function(installs) {
+ // There should be no active installs now since the install completed and
+ // doesn't require a restart.
+ do_check_eq(installs.length, 0);
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_false(b1.userDisabled);
+ do_check_true(b1.isActive);
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_true(b1.hasResource("install.rdf"));
+ do_check_false(b1.hasResource("bootstrap.js"));
+ do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ let dir = do_get_addon_root_uri(profileDir, "ab-CD@dictionaries.addons.mozilla.org");
+
+ let chromeReg = AM_Cc["@mozilla.org/chrome/chrome-registry;1"].
+ getService(AM_Ci.nsIChromeRegistry);
+ try {
+ chromeReg.convertChromeURL(NetUtil.newURI("chrome://dict/content/dict.xul"));
+ do_throw("Chrome manifest should not have been registered");
+ }
+ catch (e) {
+ // Expected the chrome url to not be registered
+ }
+
+ AddonManager.getAddonsWithOperationsByTypes(null, function(list) {
+ do_check_eq(list.length, 0);
+
+ run_test_2();
+ });
+ });
+ });
+}
+
+// Tests that disabling doesn't require a restart
+function run_test_2() {
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ prepare_test({
+ "ab-CD@dictionaries.addons.mozilla.org": [
+ ["onDisabling", false],
+ "onDisabled"
+ ]
+ });
+
+ do_check_eq(b1.operationsRequiringRestart &
+ AddonManager.OP_NEEDS_RESTART_DISABLE, 0);
+ b1.userDisabled = true;
+ ensure_test_completed();
+
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_true(b1.userDisabled);
+ do_check_false(b1.isActive);
+ 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(newb1) {
+ do_check_neq(newb1, null);
+ do_check_eq(newb1.version, "1.0");
+ do_check_false(newb1.appDisabled);
+ do_check_true(newb1.userDisabled);
+ do_check_false(newb1.isActive);
+
+ do_execute_soon(run_test_3);
+ });
+ });
+}
+
+// Test that restarting doesn't accidentally re-enable
+function run_test_3() {
+ shutdownManager();
+ do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ startupManager(false);
+ 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) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_true(b1.userDisabled);
+ do_check_false(b1.isActive);
+
+ run_test_4();
+ });
+}
+
+// Tests that enabling doesn't require a restart
+function run_test_4() {
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ prepare_test({
+ "ab-CD@dictionaries.addons.mozilla.org": [
+ ["onEnabling", false],
+ "onEnabled"
+ ]
+ });
+
+ do_check_eq(b1.operationsRequiringRestart &
+ AddonManager.OP_NEEDS_RESTART_ENABLE, 0);
+ b1.userDisabled = false;
+ ensure_test_completed();
+
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_false(b1.userDisabled);
+ do_check_true(b1.isActive);
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(newb1) {
+ do_check_neq(newb1, null);
+ do_check_eq(newb1.version, "1.0");
+ do_check_false(newb1.appDisabled);
+ do_check_false(newb1.userDisabled);
+ do_check_true(newb1.isActive);
+
+ do_execute_soon(run_test_5);
+ });
+ });
+}
+
+// Tests that a restart shuts down and restarts the add-on
+function run_test_5() {
+ shutdownManager();
+ do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+ startupManager(false);
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_false(b1.userDisabled);
+ do_check_true(b1.isActive);
+ do_check_false(isExtensionInAddonsList(profileDir, b1.id));
+
+ run_test_7();
+ });
+}
+
+// Tests that uninstalling doesn't require a restart
+function run_test_7() {
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ prepare_test({
+ "ab-CD@dictionaries.addons.mozilla.org": [
+ ["onUninstalling", false],
+ "onUninstalled"
+ ]
+ });
+
+ do_check_eq(b1.operationsRequiringRestart &
+ AddonManager.OP_NEEDS_RESTART_UNINSTALL, 0);
+ b1.uninstall();
+
+ check_test_7();
+ });
+}
+
+function check_test_7() {
+ ensure_test_completed();
+ 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",
+ callback_soon(function(b1) {
+ do_check_eq(b1, null);
+
+ restartManager();
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(newb1) {
+ do_check_eq(newb1, null);
+
+ do_execute_soon(run_test_8);
+ });
+ }));
+}
+
+// Test that a bootstrapped extension dropped into the profile loads properly
+// on startup and doesn't cause an EM restart
+function run_test_8() {
+ shutdownManager();
+
+ let dir = profileDir.clone();
+ dir.append("ab-CD@dictionaries.addons.mozilla.org");
+ dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+ let zip = AM_Cc["@mozilla.org/libjar/zip-reader;1"].
+ createInstance(AM_Ci.nsIZipReader);
+ zip.open(do_get_addon("test_dictionary"));
+ dir.append("install.rdf");
+ zip.extract("install.rdf", dir);
+ dir = dir.parent;
+ dir.append("dictionaries");
+ dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+ dir.append("ab-CD.dic");
+ zip.extract("dictionaries/ab-CD.dic", dir);
+ zip.close();
+
+ startupManager(false);
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_false(b1.userDisabled);
+ do_check_true(b1.isActive);
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ do_execute_soon(run_test_9);
+ });
+}
+
+// Test that items detected as removed during startup get removed properly
+function run_test_9() {
+ shutdownManager();
+
+ let dir = profileDir.clone();
+ dir.append("ab-CD@dictionaries.addons.mozilla.org");
+ dir.remove(true);
+ startupManager(false);
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ do_check_eq(b1, null);
+ do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ do_execute_soon(run_test_12);
+ });
+}
+
+
+// Tests that bootstrapped extensions are correctly loaded even if the app is
+// upgraded at the same time
+function run_test_12() {
+ shutdownManager();
+
+ let dir = profileDir.clone();
+ dir.append("ab-CD@dictionaries.addons.mozilla.org");
+ dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+ let zip = AM_Cc["@mozilla.org/libjar/zip-reader;1"].
+ createInstance(AM_Ci.nsIZipReader);
+ zip.open(do_get_addon("test_dictionary"));
+ dir.append("install.rdf");
+ zip.extract("install.rdf", dir);
+ dir = dir.parent;
+ dir.append("dictionaries");
+ dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+ dir.append("ab-CD.dic");
+ zip.extract("dictionaries/ab-CD.dic", dir);
+ zip.close();
+
+ startupManager(true);
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_false(b1.userDisabled);
+ do_check_true(b1.isActive);
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ b1.uninstall();
+ do_execute_soon(run_test_16);
+ });
+}
+
+
+// Tests that bootstrapped extensions don't get loaded when in safe mode
+function run_test_16() {
+ restartManager();
+
+ 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",
+ callback_soon(function(b1) {
+ // Should have installed and started
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+
+ shutdownManager();
+
+ // Should have stopped
+ do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+
+ gAppInfo.inSafeMode = true;
+ startupManager(false);
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org",
+ callback_soon(function(b1_2) {
+ // Should still be stopped
+ do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_false(b1_2.isActive);
+
+ shutdownManager();
+ gAppInfo.inSafeMode = false;
+ startupManager(false);
+
+ // Should have started
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1_3) {
+ b1_3.uninstall();
+
+ do_execute_soon(run_test_17);
+ });
+ }));
+ }));
+ });
+ });
+}
+
+// Check that a bootstrapped extension in a non-profile location is loaded
+function run_test_17() {
+ shutdownManager();
+
+ let dir = userExtDir.clone();
+ dir.append("ab-CD@dictionaries.addons.mozilla.org");
+ dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+ let zip = AM_Cc["@mozilla.org/libjar/zip-reader;1"].
+ createInstance(AM_Ci.nsIZipReader);
+ zip.open(do_get_addon("test_dictionary"));
+ dir.append("install.rdf");
+ zip.extract("install.rdf", dir);
+ dir = dir.parent;
+ dir.append("dictionaries");
+ dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0o755);
+ dir.append("ab-CD.dic");
+ zip.extract("dictionaries/ab-CD.dic", dir);
+ zip.close();
+
+ startupManager();
+
+ 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);
+ do_check_eq(b1.version, "1.0");
+ do_check_true(b1.isActive);
+
+ // From run_test_21
+ dir = userExtDir.clone();
+ dir.append("ab-CD@dictionaries.addons.mozilla.org");
+ dir.remove(true);
+
+ restartManager();
+
+ run_test_23();
+ }));
+}
+
+// Tests that installing from a URL doesn't require a restart
+function run_test_23() {
+ prepare_test({ }, [
+ "onNewInstall"
+ ]);
+
+ let url = "http://localhost:" + gPort + "/addons/test_dictionary.xpi";
+ AddonManager.getInstallForURL(url, function(install) {
+ ensure_test_completed();
+
+ do_check_neq(install, null);
+
+ prepare_test({ }, [
+ "onDownloadStarted",
+ "onDownloadEnded"
+ ], function() {
+ do_check_eq(install.type, "dictionary");
+ do_check_eq(install.version, "1.0");
+ do_check_eq(install.name, "Test Dictionary");
+ do_check_eq(install.state, AddonManager.STATE_DOWNLOADED);
+ do_check_true(install.addon.hasResource("install.rdf"));
+ do_check_false(install.addon.hasResource("bootstrap.js"));
+ do_check_eq(install.addon.operationsRequiringRestart &
+ AddonManager.OP_NEEDS_RESTART_INSTALL, 0);
+ do_check_not_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ let addon = install.addon;
+ prepare_test({
+ "ab-CD@dictionaries.addons.mozilla.org": [
+ ["onInstalling", false],
+ "onInstalled"
+ ]
+ }, [
+ "onInstallStarted",
+ "onInstallEnded",
+ ], function() {
+ do_check_true(addon.hasResource("install.rdf"));
+ // spin to let the addon startup finish
+ do_execute_soon(check_test_23);
+ });
+ });
+ install.install();
+ }, "application/x-xpinstall");
+}
+
+function check_test_23() {
+ AddonManager.getAllInstalls(function(installs) {
+ // There should be no active installs now since the install completed and
+ // doesn't require a restart.
+ do_check_eq(installs.length, 0);
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_false(b1.appDisabled);
+ do_check_false(b1.userDisabled);
+ do_check_true(b1.isActive);
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+ do_check_true(b1.hasResource("install.rdf"));
+ do_check_false(b1.hasResource("bootstrap.js"));
+ do_check_in_crash_annotation("ab-CD@dictionaries.addons.mozilla.org", "1.0");
+
+ let dir = do_get_addon_root_uri(profileDir, "ab-CD@dictionaries.addons.mozilla.org");
+
+ AddonManager.getAddonsWithOperationsByTypes(null, callback_soon(function(list) {
+ do_check_eq(list.length, 0);
+
+ restartManager();
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1_2) {
+ b1_2.uninstall();
+ do_execute_soon(run_test_25);
+ });
+ }));
+ });
+ });
+}
+
+// Tests that updating from a bootstrappable add-on to a normal add-on calls
+// the uninstall method
+function run_test_25() {
+ restartManager();
+
+ HunspellEngine.listener = function(aEvent) {
+ HunspellEngine.listener = null;
+ do_check_eq(aEvent, "addDirectory");
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+
+ installAllFiles([do_get_addon("test_dictionary_2")], function test_25_installed2() {
+ // 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",
+ callback_soon(function(b1) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "1.0");
+ do_check_true(b1.isActive);
+ do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE));
+
+ restartManager();
+
+ do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1_2) {
+ do_check_neq(b1_2, null);
+ do_check_eq(b1_2.version, "2.0");
+ do_check_true(b1_2.isActive);
+ do_check_eq(b1_2.pendingOperations, AddonManager.PENDING_NONE);
+
+ do_execute_soon(run_test_26);
+ });
+ }));
+ });
+ };
+
+ installAllFiles([do_get_addon("test_dictionary")], function test_25_installed() { });
+}
+
+// Tests that updating from a normal add-on to a bootstrappable add-on calls
+// the install method
+function run_test_26() {
+ installAllFiles([do_get_addon("test_dictionary")], function test_26_install() {
+ // Needs a restart to complete this
+ do_check_false(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+
+ 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);
+ do_check_true(hasFlag(b1.pendingOperations, AddonManager.PENDING_UPGRADE));
+
+ restartManager();
+
+ do_check_true(HunspellEngine.isDictionaryEnabled("ab-CD.dic"));
+
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1_2) {
+ do_check_neq(b1_2, null);
+ do_check_eq(b1_2.version, "1.0");
+ do_check_true(b1_2.isActive);
+ do_check_eq(b1_2.pendingOperations, AddonManager.PENDING_NONE);
+
+ HunspellEngine.deactivate();
+ b1_2.uninstall();
+ do_execute_soon(run_test_27);
+ });
+ }));
+ });
+}
+
+// Tests that an update check from a normal add-on to a bootstrappable add-on works
+function run_test_27() {
+ restartManager();
+ writeInstallRDFForExtension({
+ id: "ab-CD@dictionaries.addons.mozilla.org",
+ version: "1.0",
+ updateURL: "http://localhost:" + gPort + "/data/test_dictionary.rdf",
+ targetApplications: [{
+ id: "xpcshell@tests.mozilla.org",
+ minVersion: "1",
+ maxVersion: "1"
+ }],
+ name: "Test Dictionary",
+ }, profileDir);
+ restartManager();
+
+ prepare_test({
+ "ab-CD@dictionaries.addons.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded"
+ ], callback_soon(check_test_27));
+
+ AddonManagerPrivate.backgroundUpdateCheck();
+}
+
+function check_test_27(install) {
+ do_check_eq(install.existingAddon.pendingUpgrade.install, install);
+
+ restartManager();
+ AddonManager.getAddonByID("ab-CD@dictionaries.addons.mozilla.org", function(b1) {
+ do_check_neq(b1, null);
+ do_check_eq(b1.version, "2.0");
+ do_check_eq(b1.type, "dictionary");
+ b1.uninstall();
+ do_execute_soon(run_test_28);
+ });
+}
+
+// Tests that an update check from a bootstrappable add-on to a normal add-on works
+function run_test_28() {
+ restartManager();
+
+ writeInstallRDFForExtension({
+ id: "ef@dictionaries.addons.mozilla.org",
+ version: "1.0",
+ type: "64",
+ updateURL: "http://localhost:" + gPort + "/data/test_dictionary.rdf",
+ targetApplications: [{
+ id: "xpcshell@tests.mozilla.org",
+ minVersion: "1",
+ maxVersion: "1"
+ }],
+ name: "Test Dictionary ef",
+ }, profileDir);
+ restartManager();
+
+ prepare_test({
+ "ef@dictionaries.addons.mozilla.org": [
+ "onInstalling"
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded"
+ ], callback_soon(check_test_28));
+
+ AddonManagerPrivate.backgroundUpdateCheck();
+}
+
+function check_test_28(install) {
+ do_check_eq(install.existingAddon.pendingUpgrade.install, install);
+
+ restartManager();
+ AddonManager.getAddonByID("ef@dictionaries.addons.mozilla.org", function(b2) {
+ do_check_neq(b2, null);
+ do_check_eq(b2.version, "2.0");
+ do_check_eq(b2.type, "extension");
+ b2.uninstall();
+ do_execute_soon(run_test_29);
+ });
+}
+
+// Tests that an update check from a bootstrappable add-on to a bootstrappable add-on works
+function run_test_29() {
+ restartManager();
+
+ writeInstallRDFForExtension({
+ id: "gh@dictionaries.addons.mozilla.org",
+ version: "1.0",
+ type: "64",
+ updateURL: "http://localhost:" + gPort + "/data/test_dictionary.rdf",
+ targetApplications: [{
+ id: "xpcshell@tests.mozilla.org",
+ minVersion: "1",
+ maxVersion: "1"
+ }],
+ name: "Test Dictionary gh",
+ }, profileDir);
+ restartManager();
+
+ prepare_test({
+ "gh@dictionaries.addons.mozilla.org": [
+ ["onInstalling", false /* = no restart */],
+ ["onInstalled", false]
+ ]
+ }, [
+ "onNewInstall",
+ "onDownloadStarted",
+ "onDownloadEnded",
+ "onInstallStarted",
+ "onInstallEnded"
+ ], check_test_29);
+
+ AddonManagerPrivate.backgroundUpdateCheck();
+}
+
+function check_test_29(install) {
+ AddonManager.getAddonByID("gh@dictionaries.addons.mozilla.org", function(b2) {
+ do_check_neq(b2, null);
+ do_check_eq(b2.version, "2.0");
+ do_check_eq(b2.type, "dictionary");
+
+ prepare_test({
+ "gh@dictionaries.addons.mozilla.org": [
+ ["onUninstalling", false],
+ ["onUninstalled", false],
+ ]
+ }, [
+ ], callback_soon(finish_test_29));
+
+ b2.uninstall();
+ });
+}
+
+function finish_test_29() {
+ testserver.stop(do_test_finished);
+}