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