From ac0cce8224f8f6372e71fa2afbe24dbe1313a251 Mon Sep 17 00:00:00 2001 From: Dave Townsend Date: Thu, 29 Apr 2010 13:11:23 -0700 Subject: [PATCH] Bug 553169: XPCShell tests for the new extension manager API. r=robstrong --- toolkit/mozapps/extensions/test/Makefile.in | 4 +- .../addons/test_bootstrap1_1/bootstrap.js | 9 + .../test/addons/test_bootstrap1_1/install.rdf | 24 + .../addons/test_bootstrap1_2/bootstrap.js | 9 + .../test/addons/test_bootstrap1_2/install.rdf | 24 + .../test/addons/test_install1/install.rdf | 24 + .../test/addons/test_install2_1/install.rdf | 24 + .../test/addons/test_install2_2/install.rdf | 24 + .../test/addons/test_install3/install.rdf | 27 + .../test/addons/test_theme/install.rdf | 24 + .../test/addons/test_update/install.rdf | 23 + .../test/xpcshell/data/test_install.rdf | 25 + .../test/xpcshell/data/test_migrate.rdf | 56 ++ .../test/xpcshell/data/test_update.rdf | 56 ++ .../test/xpcshell/data/test_updatecheck.rdf | 292 ++++++++ .../extensions/test/xpcshell/head_addons.js | 452 ++++++++++++ .../test/xpcshell/test_bootstrap.js | 304 ++++++++ .../test/xpcshell/test_checkcompatibility.js | 187 +++++ .../extensions/test/xpcshell/test_disable.js | 158 ++++ .../extensions/test/xpcshell/test_general.js | 59 ++ .../extensions/test/xpcshell/test_install.js | 379 ++++++++++ .../extensions/test/xpcshell/test_manifest.js | 397 ++++++++++ .../extensions/test/xpcshell/test_migrate1.js | 93 +++ .../extensions/test/xpcshell/test_migrate2.js | 118 +++ .../extensions/test/xpcshell/test_startup.js | 501 +++++++++++++ .../extensions/test/xpcshell/test_theme.js | 680 ++++++++++++++++++ .../test/xpcshell/test_uninstall.js | 212 ++++++ .../extensions/test/xpcshell/test_update.js | 233 ++++++ .../test/xpcshell/test_updatecheck.js | 202 ++++++ .../extensions/test/xpcshell/test_upgrade.js | 125 ++++ 30 files changed, 4743 insertions(+), 2 deletions(-) create mode 100644 toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/bootstrap.js create mode 100644 toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/bootstrap.js create mode 100644 toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_install1/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_install2_1/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_install2_2/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_install3/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_theme/install.rdf create mode 100644 toolkit/mozapps/extensions/test/addons/test_update/install.rdf create mode 100644 toolkit/mozapps/extensions/test/xpcshell/data/test_install.rdf create mode 100644 toolkit/mozapps/extensions/test/xpcshell/data/test_migrate.rdf create mode 100644 toolkit/mozapps/extensions/test/xpcshell/data/test_update.rdf create mode 100644 toolkit/mozapps/extensions/test/xpcshell/data/test_updatecheck.rdf create mode 100644 toolkit/mozapps/extensions/test/xpcshell/head_addons.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_checkcompatibility.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_disable.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_general.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_install.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_manifest.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_migrate1.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_migrate2.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_startup.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_theme.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_uninstall.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_update.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_updatecheck.js create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_upgrade.js diff --git a/toolkit/mozapps/extensions/test/Makefile.in b/toolkit/mozapps/extensions/test/Makefile.in index 5487fa5c71b5..896ffb19d0dc 100644 --- a/toolkit/mozapps/extensions/test/Makefile.in +++ b/toolkit/mozapps/extensions/test/Makefile.in @@ -41,7 +41,7 @@ srcdir = @srcdir@ VPATH = @srcdir@ ADDONSRC = $(srcdir)/addons TESTROOT = $(CURDIR)/$(DEPTH)/_tests/xpcshell/$(MODULE) -TESTXPI = $(TESTROOT)/unit/addons +TESTXPI = $(TESTROOT)/xpcshell/addons relativesrcdir = toolkit/mozapps/extensions/test include $(DEPTH)/config/autoconf.mk @@ -53,7 +53,7 @@ DIRS = \ $(NULL) XPCSHELL_TESTS = \ - unit \ + xpcshell \ $(NULL) include $(topsrcdir)/config/rules.mk diff --git a/toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/bootstrap.js new file mode 100644 index 000000000000..747a1ef6f433 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/bootstrap.js @@ -0,0 +1,9 @@ +Components.utils.import("resource://gre/modules/Services.jsm"); + +function enable() { + Services.prefs.setIntPref("bootstraptest.version", 1); +} + +function disable() { + Services.prefs.setIntPref("bootstraptest.version", 0); +} diff --git a/toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/install.rdf new file mode 100644 index 000000000000..ce331f90b8a2 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_1/install.rdf @@ -0,0 +1,24 @@ + + + + + + bootstrap1@tests.mozilla.org + 1.0 + 64 + + + Test Bootstrap 1 + Test Description + + + + xpcshell@tests.mozilla.org + 1 + 1 + + + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/bootstrap.js b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/bootstrap.js new file mode 100644 index 000000000000..656f25dbf173 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/bootstrap.js @@ -0,0 +1,9 @@ +Components.utils.import("resource://gre/modules/Services.jsm"); + +function enable() { + Services.prefs.setIntPref("bootstraptest.version", 2); +} + +function disable() { + Services.prefs.setIntPref("bootstraptest.version", 0); +} diff --git a/toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/install.rdf new file mode 100644 index 000000000000..9764a44bd201 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_bootstrap1_2/install.rdf @@ -0,0 +1,24 @@ + + + + + + bootstrap1@tests.mozilla.org + 2.0 + 64 + + + Test Bootstrap 1 + Test Description + + + + xpcshell@tests.mozilla.org + 1 + 1 + + + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_install1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_install1/install.rdf new file mode 100644 index 000000000000..efe3f18ae1a4 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_install1/install.rdf @@ -0,0 +1,24 @@ + + + + + + + addon1@tests.mozilla.org + 1.0 + + + Test 1 + Test Description + + + + xpcshell@tests.mozilla.org + 1 + 1 + + + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_install2_1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_install2_1/install.rdf new file mode 100644 index 000000000000..116eb706972c --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_install2_1/install.rdf @@ -0,0 +1,24 @@ + + + + + + + addon2@tests.mozilla.org + 2.0 + + + Real Test 2 + Test Description + + + + xpcshell@tests.mozilla.org + 1 + 1 + + + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_install2_2/install.rdf b/toolkit/mozapps/extensions/test/addons/test_install2_2/install.rdf new file mode 100644 index 000000000000..7197ea1fbe7e --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_install2_2/install.rdf @@ -0,0 +1,24 @@ + + + + + + + addon2@tests.mozilla.org + 3.0 + + + Real Test 3 + Test Description + + + + xpcshell@tests.mozilla.org + 1 + 1 + + + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_install3/install.rdf b/toolkit/mozapps/extensions/test/addons/test_install3/install.rdf new file mode 100644 index 000000000000..8e72017ade32 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_install3/install.rdf @@ -0,0 +1,27 @@ + + + + + + + addon3@tests.mozilla.org + 1.0 + + + Real Test 4 + Test Description + + http://localhost:4444/data/test_install.rdf + + + + xpcshell@tests.mozilla.org + 0 + 0 + + + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_theme/install.rdf b/toolkit/mozapps/extensions/test/addons/test_theme/install.rdf new file mode 100644 index 000000000000..e2199bfac1d0 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_theme/install.rdf @@ -0,0 +1,24 @@ + + + + + + theme1@tests.mozilla.org + 1.0 + theme1/1.0 + + + Test Theme 1 + Test Description + + + + xpcshell@tests.mozilla.org + 1 + 1 + + + + + diff --git a/toolkit/mozapps/extensions/test/addons/test_update/install.rdf b/toolkit/mozapps/extensions/test/addons/test_update/install.rdf new file mode 100644 index 000000000000..801a35a8f7c8 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_update/install.rdf @@ -0,0 +1,23 @@ + + + + + + addon1@tests.mozilla.org + 2.0 + + + Test 1 + Test Description + + + + xpcshell@tests.mozilla.org + 1 + 1 + + + + + diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_install.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_install.rdf new file mode 100644 index 000000000000..4d0c28d7276f --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_install.rdf @@ -0,0 +1,25 @@ + + + + + + + +
  • + + 1.0 + + + xpcshell@tests.mozilla.org + 0 + 1 + + + +
  • +
    +
    +
    + +
    diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_migrate.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_migrate.rdf new file mode 100644 index 000000000000..c5646e964314 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_migrate.rdf @@ -0,0 +1,56 @@ + + + + + + + + + 2 + + + + 2 + + + + 2 + + + + 2 + + + + + + + + + diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_update.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_update.rdf new file mode 100644 index 000000000000..79d924f8967d --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_update.rdf @@ -0,0 +1,56 @@ + + + + + + + +
  • + + 1.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + + + +
  • +
  • + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + http://localhost:4444/addons/test_update.xpi + + + +
  • +
    +
    +
    + + + + +
  • + + 1.0 + + + xpcshell@tests.mozilla.org + 0 + 1 + + + +
  • +
    +
    +
    +
    diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_updatecheck.rdf b/toolkit/mozapps/extensions/test/xpcshell/data/test_updatecheck.rdf new file mode 100644 index 000000000000..1ec2fb3fc0a1 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_updatecheck.rdf @@ -0,0 +1,292 @@ + + + + + + + +
  • + + 1.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + https://localhost:4444/addons/test1.xpi + + + +
  • + +
  • + + 2.0 + + + xpcshell@tests.mozilla.org + 2 + 2 + https://localhost:4444/addons/test2.xpi + + + +
  • +
  • + + 3.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + https://localhost:4444/addons/test3.xpi + + + +
  • +
  • + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 2 + https://localhost:4444/addons/test2.xpi + + + +
  • + +
  • + + 4.0 + + + xpcshell@tests.mozilla.org + 2 + 2 + https://localhost:4444/addons/test4.xpi + + + +
  • +
    +
    +
    + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + http://localhost:4444/broken.xpi + + + + + + + + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 2 + http://localhost:4444/broken.xpi + + + + + + + MIGTMA0GCSqGSIb3DQEBBQUAA4GBAMO1O2gwSCCth1GwYMgscfaNakpN40PJfOWt + ub2HVdg8+OXMciF8d/9eVWm8eH/IxuxyZlmRZTs3O5tv9eWAY5uBCtqDf1WgTsGk + jrgZow1fITkZI7w0//C8eKdMLAtGueGfNs2IlTd5P/0KH/hf1rPc1wUqEqKCd4+L + BcVq13ad + + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + http://localhost:4444/broken.xpi + + + + + + + MIGTMA0GCSqGSIb3DQEBBQUAA4GBAMH/33P/bn148mVkAB8i5X8c4LhY52E+MPUT + yKHGpowZnRLgL2O0dfpm+rljOBfKi51322PFrsc6VIFml6x4Lrb5foxSyB0Vs9pb + SEDFWUKquOQvceQ9iEx5Pe0VzrmUZgcQxd8ksSunWL4wJaBZ/evE5amFC6sw3pv/ + fjt8p3GN + + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + http://localhost:4444/broken.xpi + sha1:78fc1d2887eda35b4ad2e3a0b60120ca271ce6e6 + + + + + + + MIGTMA0GCSqGSIb3DQEBBQUAA4GBAJ5Dv3Zd7/j5dLchCw9iO/cxPq8oOhOYD2M+ + jUKvmHCyTBRIEaJrE4N7yVbRYk++ERIfyVepLivsVi4pBmF7JTdw0NaKUA0LiOoT + mRL8I7s5NPjCiiNcdqbncWyiZwIj1w1nkbWGTlH/gEjRW/LbvT4JAuec8yNFDa4S + X8mOMf7k + + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + https://localhost:4444/broken.xpi + + + + + + + MIGTMA0GCSqGSIb3DQEBBQUAA4GBAGvf7XqqoTl5WofrNq55E7W+UttOEDXLB3Oi + XDiXe0i6njlozilseaUo1hgfQhhzN9gkyetP5tGBVcLRrVyliKpJmD6ABCVGW1lS + qS+SEw7gDHyHkvwKMyWKedpRGChqLYnnf+Y+CX3MWLZLkwPXMKdTYgN3Rx0lEnJk + 37LSEMKE + + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + https://localhost:4444/broken.xpi + sha1:78fc1d2887eda35b4ad2e3a0b60120ca271ce6e6 + + + + + + + MIGTMA0GCSqGSIb3DQEBBQUAA4GBACMX/KReOGSJ8CMGRroH1v3Gjv/Qs/pqH+Ow + o+hCKWLUKx7hpJgVJkXXdAHW0U88NXlp1S2H0WqA7I/CdmNXJSPzzV/J4z1dZgXh + JbW6mqNb0pj6nIe7g8OLzSxDgBmO4DUP5DAmnmqciJLWQzN7OdbcwrWz6xPN5kZF + A90eF5zy + + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + http://localhost:4444/broken.xpi + md2:78fc1d2887eda35b4ad2e3a0b60120ca271ce6e6 + + + + + + + MIGTMA0GCSqGSIb3DQEBBQUAA4GBAJRfcFvHIWxVyycCw8IjNmEhabc2uqA1zQwp + 5oKh3Y23hwIsQ6xy68Wtjte1NEYFRt5fWkbMXj9YQj6LpVbzBKiGATcrq6MycZKK + o5N22cWbrKKRweJezTyN4eLfQg21pG7r8mdfS0bIA28ZVFtQOmORejoUesEouCGy + eKYk9nS2 + + + + + + + + + 2.0 + + + xpcshell@tests.mozilla.org + 1 + 1 + https://localhost:4444/broken.xpi + md2:78fc1d2887eda35b4ad2e3a0b60120ca271ce6e6 + + + + + + + MIGTMA0GCSqGSIb3DQEBBQUAA4GBALQKwzLFr/VOw3gJvv/LCh3/PWDd9FqmFnX+ + hJjBmCaUDtG7CXn1i0h8ed8IeRHpLLT7FCzVwU3bH9BUjdm8wc3ObtlNbd8go01a + CoXz50r3rYPcYz4WS+7/+lvrUqsuWd9Wj+q0NeCPiNaaro6/AolE2Qf5JFRL3lxY + lsKWAnVO + +
    diff --git a/toolkit/mozapps/extensions/test/xpcshell/head_addons.js b/toolkit/mozapps/extensions/test/xpcshell/head_addons.js new file mode 100644 index 000000000000..79037c9caab1 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/head_addons.js @@ -0,0 +1,452 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const AM_Cc = Components.classes; +const AM_Ci = Components.interfaces; + +const XULAPPINFO_CONTRACTID = "@mozilla.org/xre/app-info;1"; +const XULAPPINFO_CID = Components.ID("{c763b610-9d49-455a-bbd2-ede71682a1ac}"); + +Components.utils.import("resource://gre/modules/AddonManager.jsm"); +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); +Components.utils.import("resource://gre/modules/FileUtils.jsm"); +Components.utils.import("resource://gre/modules/Services.jsm"); + +var gInternalManager = null; +var gAppInfo = null; +var gAddonsList; + +function createAppInfo(id, name, version, platformVersion) { + gAppInfo = { + // nsIXULAppInfo + vendor: "Mozilla", + name: name, + ID: id, + version: version, + appBuildID: "2007010101", + platformVersion: platformVersion, + platformBuildID: "2007010101", + + // nsIXULRuntime + inSafeMode: false, + logConsoleErrors: true, + OS: "XPCShell", + XPCOMABI: "noarch-spidermonkey", + invalidateCachesOnRestart: function invalidateCachesOnRestart() { + // Do nothing + }, + + QueryInterface: XPCOMUtils.generateQI([AM_Ci.nsIXULAppInfo, + AM_Ci.nsIXULRuntime, + AM_Ci.nsISupports]) + }; + + var XULAppInfoFactory = { + createInstance: function (outer, iid) { + if (outer != null) + throw Components.results.NS_ERROR_NO_AGGREGATION; + return gAppInfo.QueryInterface(iid); + } + }; + var registrar = Components.manager.QueryInterface(AM_Ci.nsIComponentRegistrar); + registrar.registerFactory(XULAPPINFO_CID, "XULAppInfo", + XULAPPINFO_CONTRACTID, XULAppInfoFactory); +} + +/** + * Returns a testcase xpi + * + * @param name + * The name of the testcase (without extension) + * @return an nsILocalFile pointing to the testcase xpi + */ +function do_get_addon(name) { + return do_get_file("addons/" + name + ".xpi"); +} + +/** + * Starts up the add-on manager as if it was started by the application. This + * will simulate any restarts requested by the manager. + * + * @param expectedRestarts + * An optional parameter to specify the expected number of restarts. + * If passed and the number of restarts requested differs then the + * test will fail + * @param appChanged + * An optional boolean parameter to simulate the case where the + * application has changed version since the last run. If not passed it + * defaults to true + */ +function startupManager(expectedRestarts, appChanged) { + if (gInternalManager) + do_throw("Test attempt to startup manager that was already started."); + + if (appChanged === undefined) + appChanged = true; + + // Load the add-ons list as it was during application startup + loadAddonsList(appChanged); + + gInternalManager = AM_Cc["@mozilla.org/addons/integration;1"]. + getService(AM_Ci.nsIObserver). + QueryInterface(AM_Ci.nsITimerCallback); + + gInternalManager.observe(null, "profile-after-change", "startup"); + + let appStartup = AM_Cc["@mozilla.org/toolkit/app-startup;1"]. + getService(AM_Ci.nsIAppStartup2); + var restart = appChanged || appStartup.needsRestart; + appStartup.needsRestart = false; + + if (restart) { + if (expectedRestarts !== undefined) + restartManager(expectedRestarts - 1); + else + restartManager(); + } + else if (expectedRestarts !== undefined) { + if (expectedRestarts > 0) + do_throw("Expected to need to restart " + expectedRestarts + " more times"); + else if (expectedRestarts < 0) + do_throw("Restarted " + (-expectedRestarts) + " more times than expected"); + } +} + +/** + * Restarts the add-on manager as if the host application was restarted. This + * will simulate any restarts requested by the manager. + * + * @param expectedRestarts + * An optional parameter to specify the expected number of restarts. + * If passed and the number of restarts requested differs then the + * test will fail + * @param newVersion + * An optional new version to use for the application. Passing this + * will change nsIXULAppInfo.version and make the startup appear as if + * the application version has changed. + */ +function restartManager(expectedRestarts, newVersion) { + shutdownManager(); + if (newVersion) { + gAppInfo.version = newVersion; + startupManager(expectedRestarts, true); + } + else { + startupManager(expectedRestarts, false); + } +} + +function shutdownManager() { + if (!gInternalManager) + return; + + let obs = AM_Cc["@mozilla.org/observer-service;1"]. + getService(AM_Ci.nsIObserverService); + obs.notifyObservers(null, "quit-application-granted", null); + gInternalManager.observe(null, "xpcom-shutdown", null); + gInternalManager = null; +} + +function loadAddonsList(appChanged) { + function readDirectories(section) { + var dirs = []; + var keys = parser.getKeys(section); + while (keys.hasMore()) { + let descriptor = parser.getString(section, keys.getNext()); + try { + let file = AM_Cc["@mozilla.org/file/local;1"]. + createInstance(AM_Ci.nsILocalFile); + file.persistentDescriptor = descriptor; + dirs.push(file); + } + catch (e) { + // Throws if the directory doesn't exist, we can ignore this since the + // platform will too. + } + } + return dirs; + } + + gAddonsList = { + extensions: [], + themes: [] + }; + + var file = gProfD.clone(); + file.append("extensions.ini"); + if (!file.exists()) + return; + if (appChanged) { + file.remove(true); + return; + } + + var factory = AM_Cc["@mozilla.org/xpcom/ini-parser-factory;1"]. + getService(AM_Ci.nsIINIParserFactory); + var parser = factory.createINIParser(file); + gAddonsList.extensions = readDirectories("ExtensionDirs"); + gAddonsList.themes = readDirectories("ThemeDirs"); +} + +function isItemInAddonsList(type, dir, id) { + var path = dir.clone(); + path.append(id); + for (var i = 0; i < gAddonsList[type].length; i++) { + if (gAddonsList[type][i].equals(path)) + return true; + } + return false; +} + +function isThemeInAddonsList(dir, id) { + return isItemInAddonsList("themes", dir, id); +} + +function isExtensionInAddonsList(dir, id) { + return isItemInAddonsList("extensions", dir, id); +} + +function writeLocaleStrings(data) { + let rdf = ""; + ["name", "description", "creator", "homepageURL"].forEach(function(prop) { + if (prop in data) + rdf += "" + data[prop] + "\n"; + }); + + ["developer", "translator", "contributor"].forEach(function(prop) { + if (prop in data) { + data[prop].forEach(function(value) { + rdf += "" + value + "\n"; + }); + } + }); + return rdf; +} + +/** + * Writes an install.rdf manifest into a directory using the properties passed + * in a JS object. The objects should contain a property for each property to + * appear in the RDFThe object may contain an array of objects with id, + * minVersion and maxVersion in the targetApplications property to give target + * application compatibility. + * + * @param data + * The object holding data about the add-on + * @param dir + * The directory to add the install.rdf to + */ +function writeInstallRDFToDir(data, dir) { + var rdf = '\n'; + rdf += '\n'; + rdf += '\n'; + + ["id", "version", "type", "internalName", "updateURL", "updateKey", + "optionsURL", "aboutURL", "iconURL"].forEach(function(prop) { + if (prop in data) + rdf += "" + data[prop] + "\n"; + }); + + rdf += writeLocaleStrings(data); + + if ("targetApplications" in data) { + data.targetApplications.forEach(function(app) { + rdf += "\n"; + ["id", "minVersion", "maxVersion"].forEach(function(prop) { + if (prop in app) + rdf += "" + app[prop] + "\n"; + }); + rdf += "\n"; + }); + } + + rdf += "\n\n"; + + if (!dir.exists()) + dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755); + var file = dir.clone(); + file.append("install.rdf"); + var fos = AM_Cc["@mozilla.org/network/file-output-stream;1"]. + createInstance(AM_Ci.nsIFileOutputStream); + fos.init(file, + FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE, + FileUtils.PERMS_FILE, 0); + fos.write(rdf, rdf.length); + fos.close(); +} + +function registerDirectory(key, dir) { + var dirProvider = { + getFile: function(prop, persistent) { + persistent.value = true; + if (prop == key) + return dir.clone(); + return null; + }, + + QueryInterface: XPCOMUtils.generateQI([AM_Ci.nsIDirectoryServiceProvider, + AM_Ci.nsISupports]) + }; + Services.dirsvc.registerProvider(dirProvider); +} + +var gExpectedEvents = {}; +var gExpectedInstalls = []; +var gNext = null; + +function getExpectedEvent(id) { + if (!(id in gExpectedEvents)) + do_throw("Wasn't expecting events for " + id); + if (gExpectedEvents[id].length == 0) + do_throw("Too many events for " + id); + let event = gExpectedEvents[id].shift(); + if (event instanceof Array) + return event; + return [event, true]; +} + +const AddonListener = { + onEnabling: function(addon, requiresRestart) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onEnabling", event); + do_check_eq(requiresRestart, expectedRestart); + if (expectedRestart) + do_check_true(hasFlag(addon.pendingOperations, AddonManager.PENDING_ENABLE)); + do_check_false(hasFlag(addon.permissions, AddonManager.PERM_CAN_ENABLE)); + }, + + onEnabled: function(addon) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onEnabled", event); + do_check_eq(requiresRestart, expectedRestart); + do_check_false(hasFlag(addon.permissions, AddonManager.PERM_CAN_ENABLE)); + }, + + onDisabling: function(addon, requiresRestart) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onDisabling", event); + do_check_eq(requiresRestart, expectedRestart); + if (expectedRestart) + do_check_true(hasFlag(addon.pendingOperations, AddonManager.PENDING_DISABLE)); + do_check_false(hasFlag(addon.permissions, AddonManager.PERM_CAN_DISABLE)); + }, + + onDisabled: function(addon) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onDisabled", event); + do_check_false(hasFlag(addon.permissions, AddonManager.PERM_CAN_DISABLE)); + }, + + onInstalling: function(addon, requiresRestart) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onInstalling", event); + do_check_eq(requiresRestart, expectedRestart); + if (expectedRestart) + do_check_true(hasFlag(addon.pendingOperations, AddonManager.PENDING_INSTALL)); + }, + + onInstalled: function(addon) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onInstalled", event); + }, + + onUninstalling: function(addon, requiresRestart) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onUninstalling", event); + do_check_eq(requiresRestart, expectedRestart); + if (expectedRestart) + do_check_true(hasFlag(addon.pendingOperations, AddonManager.PENDING_UNINSTALL)); + //do_check_false(hasFlag(addon.permissions, AddonManager.PERM_CAN_UNINSTALL)); + }, + + onUninstalled: function(addon) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onUninstalled", event); + do_check_eq(requiresRestart, expectedRestart); + do_check_false(hasFlag(addon.permissions, AddonManager.PERM_CAN_UNINSTALL)); + }, + + onOperationCancelled: function(addon) { + let [event, expectedRestart] = getExpectedEvent(addon.id); + do_check_eq("onOperationCancelled", event); + do_check_eq(requiresRestart, expectedRestart); + do_check_eq(addon.pendingOperations, 0); + } +}; + +const InstallListener = { + onNewInstall: function(install) { + if (install.state != AddonManager.STATE_DOWNLOADED && + install.state != AddonManager.STATE_AVAILABLE) + do_throw("Bad install state " + install.state); + do_check_eq("onNewInstall", gExpectedInstalls.shift()); + }, + + onDownloadStarted: function(install) { + do_check_eq(install.state, AddonManager.STATE_DOWNLOADING); + do_check_eq("onDownloadStarted", gExpectedInstalls.shift()); + }, + + onDownloadEnded: function(install) { + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_eq("onDownloadEnded", gExpectedInstalls.shift()); + // gNext should determine whether installation continues + return gNext(install); + }, + + onDownloadFailed: function(install, status) { + do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED); + do_check_eq("onDownloadFailed", gExpectedInstalls.shift()); + gNext(install); + }, + + onInstallStarted: function(install) { + do_check_eq(install.state, AddonManager.STATE_INSTALLING); + do_check_eq("onInstallStarted", gExpectedInstalls.shift()); + }, + + onInstallEnded: function(install, newAddon) { + do_check_eq(install.state, AddonManager.STATE_INSTALLED); + do_check_eq("onInstallEnded", gExpectedInstalls.shift()); + gNext(install); + }, + + onInstallFailed: function(install, status) { + do_check_eq(install.state, AddonManager.STATE_INSTALL_FAILED); + do_check_eq("onInstallFailed", gExpectedInstalls.shift()); + gNext(install); + } +}; + +function hasFlag(bits, flag) { + return (bits & flag) != 0; +} + +// Just a wrapper around setting the expected events +function prepare_test(expectedEvents, expectedInstalls, next) { + AddonManager.addAddonListener(AddonListener); + AddonManager.addInstallListener(InstallListener); + + gExpectedInstalls = expectedInstalls; + gExpectedEvents = expectedEvents; + gNext = next; +} + +// Verifies that all the expected events for all add-ons were seen +function ensure_test_completed() { + for (let i in gExpectedEvents) { + if (gExpectedEvents[i].length > 0) + do_throw("Didn't see all the expected events for " + i); + } + gExpectedEvents = {}; + if (gExpectedInstalls) + do_check_eq(gExpectedInstalls.length, 0); +} +// Get the profile directory for tests to use. +const gProfD = do_get_profile().QueryInterface(AM_Ci.nsILocalFile); + +// Enable more extensive EM logging +Services.prefs.setBoolPref("extensions.logging.enabled", true); + +do_register_cleanup(shutdownManager); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js b/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js new file mode 100644 index 000000000000..d512bd75389f --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_bootstrap.js @@ -0,0 +1,304 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that bootstrappable add-ons can be used with restarts. +Components.utils.import("resource://gre/modules/Services.jsm"); + +Services.prefs.setIntPref("bootstraptest.version", 0); + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function getActivatedVersion() { + return Services.prefs.getIntPref("bootstraptest.version"); +} + +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + startupManager(1); + + run_test_1(); +} + +// Tests that installing doesn't require a restart +function run_test_1() { + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "bootstrapped"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test Bootstrap 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_true(install.addon.hasResource("install.rdf")); + do_check_true(install.addon.hasResource("bootstrap.js")); + do_check_false(install.addon.hasResource("foo.bar")); + + prepare_test({ + "bootstrap1@tests.mozilla.org": [ + ["onInstalling", false], + "onInstalled" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_1); + install.install(); + }); +} + +function check_test_1() { + AddonManager.getAddon("bootstrap1@tests.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_eq(getActivatedVersion(), 1); + do_check_true(b1.hasResource("install.rdf")); + do_check_true(b1.hasResource("bootstrap.js")); + do_check_false(b1.hasResource("foo.bar")); + + let dir = profileDir.clone(); + dir.append("bootstrap1@tests.mozilla.org"); + dir.append("bootstrap.js"); + let uri = Services.io.newFileURI(dir).spec; + do_check_eq(b1.getResourceURL("bootstrap.js"), uri); + + AddonManager.getAddonsWithPendingOperations(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.getAddon("bootstrap1@tests.mozilla.org", function(b1) { + prepare_test({ + "bootstrap1@tests.mozilla.org": [ + ["onDisabling", false], + "onDisabled" + ] + }); + + 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_eq(getActivatedVersion(), 0); + + AddonManager.getAddon("bootstrap1@tests.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); + + run_test_3(); + }); + }); +} + +// Test that restarting doesn't accidentally re-enable +function run_test_3() { + shutdownManager(); + do_check_eq(getActivatedVersion(), 0); + startupManager(0, false); + do_check_eq(getActivatedVersion(), 0); + + AddonManager.getAddon("bootstrap1@tests.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.getAddon("bootstrap1@tests.mozilla.org", function(b1) { + prepare_test({ + "bootstrap1@tests.mozilla.org": [ + ["onEnabling", false], + "onEnabled" + ] + }); + + 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_eq(getActivatedVersion(), 1); + + AddonManager.getAddon("bootstrap1@tests.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); + + run_test_5(); + }); + }); +} + +// Tests that a restart shuts down and restarts the add-on +function run_test_5() { + shutdownManager(); + do_check_eq(getActivatedVersion(), 0); + startupManager(0, false); + do_check_eq(getActivatedVersion(), 1); + + AddonManager.getAddon("bootstrap1@tests.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_6(); + }); +} + +// Tests that installing an upgrade doesn't require a restart +function run_test_6() { + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "bootstrapped"); + do_check_eq(install.version, "2.0"); + do_check_eq(install.name, "Test Bootstrap 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + + prepare_test({ + "bootstrap1@tests.mozilla.org": [ + ["onInstalling", false], + "onInstalled" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_6); + install.install(); + }); +} + +function check_test_6() { + AddonManager.getAddon("bootstrap1@tests.mozilla.org", function(b1) { + do_check_neq(b1, null); + do_check_eq(b1.version, "2.0"); + do_check_false(b1.appDisabled); + do_check_false(b1.userDisabled); + do_check_true(b1.isActive); + do_check_eq(getActivatedVersion(), 2); + + run_test_7(); + }); +} + +// Tests that uninstalling doesn't require a restart +function run_test_7() { + AddonManager.getAddon("bootstrap1@tests.mozilla.org", function(b1) { + prepare_test({ + "bootstrap1@tests.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ] + }); + + b1.uninstall(); + + check_test_7(); + }); +} + +function check_test_7() { + ensure_test_completed(); + do_check_eq(getActivatedVersion(), 0); + + AddonManager.getAddon("bootstrap1@tests.mozilla.org", function(b1) { + do_check_eq(b1, null); + + restartManager(0); + + AddonManager.getAddon("bootstrap1@tests.mozilla.org", function(newb1) { + do_check_eq(newb1, null); + + 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("bootstrap1@tests.mozilla.org"); + dir.create(AM_Ci.nsIFile.DIRECTORY_TYPE, 0755); + let zip = AM_Cc["@mozilla.org/libjar/zip-reader;1"]. + createInstance(AM_Ci.nsIZipReader); + zip.open(do_get_addon("test_bootstrap1_1")); + dir.append("install.rdf"); + zip.extract("install.rdf", dir); + dir = dir.parent; + dir.append("bootstrap.js"); + zip.extract("bootstrap.js", dir); + zip.close(); + + startupManager(0, false); + + AddonManager.getAddon("bootstrap1@tests.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_eq(getActivatedVersion(), 1); + + run_test_9(); + }); +} + +// Test that items detected as removed during startup don't force an EM restart +function run_test_9() { + shutdownManager(); + + let dir = profileDir.clone(); + dir.append("bootstrap1@tests.mozilla.org"); + dir.remove(true); + startupManager(0, false); + + AddonManager.getAddon("bootstrap1@tests.mozilla.org", function(b1) { + do_check_eq(b1, null); + + do_test_finished(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_checkcompatibility.js b/toolkit/mozapps/extensions/test/xpcshell/test_checkcompatibility.js new file mode 100644 index 000000000000..39ae080f2ec4 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_checkcompatibility.js @@ -0,0 +1,187 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that the extensions.checkCompatibility.* preferences work. + +var ADDONS = [{ + // Cannot be enabled as it has no target app info for the applciation + id: "addon1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + targetApplications: [{ + id: "unknown@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}, { + // Always appears incompatible but can be enabled if compatibility checking is + // disabled + id: "addon2@tests.mozilla.org", + version: "1.0", + name: "Test 2", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}, { + // Always appears incompatible but can be enabled if compatibility checking is + // disabled + id: "addon3@tests.mozilla.org", + version: "1.0", + name: "Test 3", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}, { // Always compatible and enabled + id: "addon4@tests.mozilla.org", + version: "1.0", + name: "Test 4", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1", + maxVersion: "2" + }] +}, { // Always compatible and enabled + id: "addon5@tests.mozilla.org", + version: "1.0", + name: "Test 5", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "3" + }] +}]; + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "2.2.3", "2"); + + ADDONS.forEach(function(a) { + let dest = profileDir.clone(); + dest.append(a.id); + writeInstallRDFToDir(a, dest); + }); + + startupManager(1); + + run_test_1(); +} + +/** + * Checks that the add-ons are enabled as expected. + * @param overridden + * A boolean indicating that compatibility checking is overridden + * @param a1 + * The Addon for addon1@tests.mozilla.org + * @param a2 + * The Addon for addon2@tests.mozilla.org + * @param a3 + * The Addon for addon3@tests.mozilla.org + * @param a4 + * The Addon for addon4@tests.mozilla.org + * @param a5 + * The Addon for addon5@tests.mozilla.org + */ +function check_state(overridden, a1, a2, a3, a4, a5) { + do_check_neq(a1, null); + do_check_false(a1.isActive); + do_check_false(a1.isCompatible); + + do_check_neq(a2, null); + if (overridden) + do_check_true(a2.isActive); + else + do_check_false(a2.isActive); + do_check_false(a2.isCompatible); + + do_check_neq(a3, null); + if (overridden) + do_check_true(a3.isActive); + else + do_check_false(a3.isActive); + do_check_false(a3.isCompatible); + + do_check_neq(a4, null); + do_check_true(a4.isActive); + do_check_true(a4.isCompatible); + + do_check_neq(a5, null); + do_check_true(a5.isActive); + do_check_true(a5.isCompatible); +} + +// Tests that with compatibility checking enabled we see the incompatible +// add-ons disabled +function run_test_1() { + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + check_state(false, a1, a2, a3, a4, a5); + + run_test_2(); + }); +} + +// Tests that with compatibility checking disabled we see the incompatible +// add-ons enabled +function run_test_2() { + Services.prefs.setBoolPref("extensions.checkCompatibility.2.2", false); + restartManager(0); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + check_state(true, a1, a2, a3, a4, a5); + + run_test_3(); + }); +} + +// Tests that with compatibility checking disabled we see the incompatible +// add-ons enabled. +function run_test_3() { + Services.prefs.setBoolPref("extensions.checkCompatibility.2.1a", false); + restartManager(1, "2.1a4"); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + check_state(true, a1, a2, a3, a4, a5); + + run_test_4(); + }); +} + +// Tests that with compatibility checking enabled we see the incompatible +// add-ons disabled. +function run_test_4() { + Services.prefs.setBoolPref("extensions.checkCompatibility.2.1a", true); + restartManager(0); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + check_state(false, a1, a2, a3, a4, a5); + + do_test_finished(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_disable.js b/toolkit/mozapps/extensions/test/xpcshell/test_disable.js new file mode 100644 index 000000000000..04e491396bcc --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_disable.js @@ -0,0 +1,158 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that add-ons can be disabled and enabled. + +var addon1 = { + id: "addon1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + iconURL: "chrome://foo/content/icon.png", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +// Sets up the profile by installing an add-on. +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + startupManager(1); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_eq(a1, null); + + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir(addon1, dest); + + restartManager(1); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(newa1) { + do_check_neq(newa1, null); + do_check_true(newa1.isActive); + do_check_false(newa1.userDisabled); + do_check_eq(newa1.iconURL, "chrome://foo/content/icon.png"); + do_check_true(isExtensionInAddonsList(profileDir, newa1.id)); + do_check_true(hasFlag(newa1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(newa1.permissions, AddonManager.PERM_CAN_ENABLE)); + + run_test_1(); + }); + }); +} + +// Disabling an add-on should work +function run_test_1() { + prepare_test({ + "addon1@tests.mozilla.org": [ + "onDisabling" + ] + }); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + a1.userDisabled = true; + do_check_false(hasFlag(a1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_ENABLE)); + + ensure_test_completed(); + + AddonManager.getAddonsWithPendingOperations(null, function(list) { + do_check_eq(list.length, 1); + do_check_eq(list[0].id, "addon1@tests.mozilla.org"); + + restartManager(0); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(newa1) { + do_check_neq(newa1, null); + do_check_false(newa1.isActive); + do_check_true(newa1.userDisabled); + do_check_eq(newa1.iconURL, null); + do_check_false(isExtensionInAddonsList(profileDir, newa1.id)); + do_check_false(hasFlag(newa1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(newa1.permissions, AddonManager.PERM_CAN_ENABLE)); + + run_test_2(); + }); + }); + }); +} + +// Enabling an add-on should work. +function run_test_2() { + prepare_test({ + "addon1@tests.mozilla.org": [ + "onEnabling" + ] + }); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + a1.userDisabled = false; + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(a1.permissions, AddonManager.PERM_CAN_ENABLE)); + + ensure_test_completed(); + + AddonManager.getAddonsWithPendingOperations(null, function(list) { + do_check_eq(list.length, 1); + do_check_eq(list[0].id, "addon1@tests.mozilla.org"); + + restartManager(0); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(newa1) { + do_check_neq(newa1, null); + do_check_true(newa1.isActive); + do_check_false(newa1.userDisabled); + do_check_true(isExtensionInAddonsList(profileDir, newa1.id)); + do_check_true(hasFlag(newa1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(newa1.permissions, AddonManager.PERM_CAN_ENABLE)); + + run_test_3(); + }); + }); + }); +} + +// Disabling then enabling withut restart should fire onOperationCancelled. +function run_test_3() { + prepare_test({ + "addon1@tests.mozilla.org": [ + "onDisabling" + ] + }); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + a1.userDisabled = true; + ensure_test_completed(); + prepare_test({ + "addon1@tests.mozilla.org": [ + "onOperationCancelled" + ] + }); + a1.userDisabled = false; + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(a1.permissions, AddonManager.PERM_CAN_ENABLE)); + + ensure_test_completed(); + + restartManager(0); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(newa1) { + do_check_neq(newa1, null); + do_check_true(newa1.isActive); + do_check_false(newa1.userDisabled); + do_check_true(isExtensionInAddonsList(profileDir, newa1.id)); + do_check_true(hasFlag(newa1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(newa1.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_test_finished(); + }); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_general.js b/toolkit/mozapps/extensions/test/xpcshell/test_general.js new file mode 100644 index 000000000000..7dc071279f89 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_general.js @@ -0,0 +1,59 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This just verifies that the EM can actually startup and shutdown a few times +// without any errors + +// We have to look up how many add-ons are present in case apps like SeaMonkey +// try to use this test with their built-in add-ons. +var gCount; + +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + var count = 0; + startupManager(1); + AddonManager.getAddonsByTypes(null, function(list) { + gCount = list.length; + + run_test_1(); + }); +} + +function run_test_1() { + restartManager(0); + + AddonManager.getAddonsByTypes(null, function(addons) { + do_check_eq(gCount, addons.length); + + AddonManager.getAddonsWithPendingOperations(null, function(pendingAddons) { + do_check_eq(0, pendingAddons.length); + + run_test_2(); + }); + }); +} + +function run_test_2() { + shutdownManager(); + + startupManager(0, false); + + AddonManager.getAddonsByTypes(null, function(addons) { + do_check_eq(gCount, addons.length); + + run_test_3(); + }); +} + +function run_test_3() { + restartManager(0); + + AddonManager.getAddonsByTypes(null, function(addons) { + do_check_eq(gCount, addons.length); + shutdownManager(); + do_test_finished(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_install.js b/toolkit/mozapps/extensions/test/xpcshell/test_install.js new file mode 100644 index 000000000000..7f84ba0b139b --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_install.js @@ -0,0 +1,379 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that add-ons can be installed from XPI files + +Components.utils.import("resource://gre/modules/Services.jsm"); + +do_load_httpd_js(); +var testserver; +var gInstallDate; + +// The test extension uses an insecure update url. +Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false); + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + startupManager(1); + // Make sure we only register once despite multiple calls + AddonManager.addInstallListener(InstallListener); + AddonManager.addAddonListener(AddonListener); + AddonManager.addInstallListener(InstallListener); + AddonManager.addAddonListener(AddonListener); + + // Create and configure the HTTP server. + testserver = new nsHttpServer(); + testserver.registerDirectory("/addons/", do_get_file("addons")); + testserver.registerDirectory("/data/", do_get_file("data")); + testserver.start(4444); + + do_test_pending(); + run_test_1(); +} + +function end_test() { + testserver.stop(do_test_finished); +} + +// Checks that an install from a local file proceeds as expected +function run_test_1() { + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_install1"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "extension"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_true(install.addon.hasResource("install.rdf")); + + let file = do_get_addon("test_install1"); + let uri = Services.io.newFileURI(file).spec; + do_check_eq(install.addon.getResourceURL("install.rdf"), "jar:" + uri + "!/install.rdf"); + + AddonManager.getInstalls(null, function(activeInstalls) { + do_check_eq(activeInstalls.length, 1); + do_check_eq(activeInstalls[0], install); + + prepare_test({ + "addon1@tests.mozilla.org": [ + "onInstalling" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_1); + install.install(); + }); + }); +} + +function check_test_1() { + ensure_test_completed(); + AddonManager.getAddon("addon1@tests.mozilla.org", function(olda1) { + do_check_eq(olda1, null); + + AddonManager.getAddonsWithPendingOperations(null, function(pendingAddons) { + do_check_eq(pendingAddons.length, 1); + do_check_eq(pendingAddons[0].id, "addon1@tests.mozilla.org"); + + restartManager(1); + + AddonManager.getInstalls(null, function(activeInstalls) { + do_check_eq(activeInstalls, 0); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_eq(a1.type, "extension"); + do_check_eq(a1.version, "1.0"); + do_check_eq(a1.name, "Test 1"); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + do_check_true(do_get_addon("test_install1").exists()); + + // Should have been installed sometime in the last two second. + let difference = Date.now() - a1.installDate.getTime(); + if (difference > 2000) + do_throw("Add-on was installed " + difference + "ms ago"); + if (difference < 0) + do_throw("Add-on was installed " + difference + "ms in the future"); + + do_check_eq(a1.installDate.getTime(), a1.updateDate.getTime()); + + do_check_true(a1.hasResource("install.rdf")); + do_check_false(a1.hasResource("foo.bar")); + + let dir = profileDir.clone(); + dir.append("addon1@tests.mozilla.org"); + dir.append("install.rdf"); + let uri = Services.io.newFileURI(dir).spec; + do_check_eq(a1.getResourceURL("install.rdf"), uri); + + a1.uninstall(); + restartManager(0); + + run_test_2(); + }); + }); + }); + }); +} + +// Tests that an install from a url downloads. +function run_test_2() { + let url = "http://localhost:4444/addons/test_install2_1.xpi"; + AddonManager.getInstallForURL(url, function(install) { + do_check_neq(install, null); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test 2"); + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); + + AddonManager.getInstalls(null, function(activeInstalls) { + do_check_eq(activeInstalls.length, 1); + do_check_eq(activeInstalls[0], install); + + prepare_test({}, [ + "onDownloadStarted", + "onDownloadEnded", + ], check_test_2); + + install.addListener({ + onDownloadProgress: function(install) { + do_execute_soon(function() { + Components.utils.forceGC(); + }); + } + }); + + install.install(); + }); + }, "application/x-xpinstall", null, "Test 2", null, "1.0"); +} + +function check_test_2(install) { + ensure_test_completed(); + do_check_eq(install.version, "2.0"); + do_check_eq(install.name, "Real Test 2"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + + // Pause the install here and start it again in run_test_3 + do_execute_soon(function() { run_test_3(install); }); + return false; +} + +// Tests that the downloaded XPI installs ok +function run_test_3(install) { + prepare_test({ + "addon2@tests.mozilla.org": [ + "onInstalling" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_3); + install.install(); +} + +function check_test_3() { + ensure_test_completed(); + AddonManager.getAddon("addon2@tests.mozilla.org", function(olda2) { + do_check_eq(olda2, null); + restartManager(1); + + AddonManager.getInstalls(null, function(installs) { + do_check_eq(installs, 0); + + AddonManager.getAddon("addon2@tests.mozilla.org", function(a2) { + do_check_neq(a2, null); + do_check_eq(a2.type, "extension"); + do_check_eq(a2.version, "2.0"); + do_check_eq(a2.name, "Real Test 2"); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + do_check_true(do_get_addon("test_install2_1").exists()); + + // Should have been installed sometime in the last two second. + let difference = Date.now() - a2.installDate.getTime(); + if (difference > 2000) + do_throw("Add-on was installed " + difference + "ms ago"); + if (difference < 0) + do_throw("Add-on was installed " + difference + "ms in the future"); + + do_check_eq(a2.installDate.getTime(), a2.updateDate.getTime()); + gInstallDate = a2.installDate.getTime(); + + run_test_4(); + }); + }); + }); +} + +// Tests that installing a new version of an existing add-on works +function run_test_4() { + prepare_test({ }, [ + "onNewInstall" + ]); + + let url = "http://localhost:4444/addons/test_install2_2.xpi"; + AddonManager.getInstallForURL(url, function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.version, "3.0"); + do_check_eq(install.name, "Test 3"); + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); + + AddonManager.getInstalls(null, function(activeInstalls) { + do_check_eq(activeInstalls.length, 1); + do_check_eq(activeInstalls[0], install); + do_check_eq(install.existingAddon, null); + + prepare_test({}, [ + "onDownloadStarted", + "onDownloadEnded", + ], check_test_4); + install.install(); + }); + }, "application/x-xpinstall", null, "Test 3", null, "3.0"); +} + +function check_test_4(install) { + ensure_test_completed(); + + do_check_eq(install.version, "3.0"); + do_check_eq(install.name, "Real Test 3"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_neq(install.existingAddon); + do_check_eq(install.existingAddon.id, "addon2@tests.mozilla.org"); + + run_test_5(); + // Installation will continue when there is nothing returned. +} + +// Continue installing the new version +function run_test_5() { + prepare_test({ + "addon2@tests.mozilla.org": [ + "onInstalling" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_5); +} + +function check_test_5() { + ensure_test_completed(); + AddonManager.getAddon("addon2@tests.mozilla.org", function(olda2) { + do_check_neq(olda2, null); + restartManager(); + + AddonManager.getInstalls(null, function(installs) { + do_check_eq(installs, 0); + + AddonManager.getAddon("addon2@tests.mozilla.org", function(a2) { + do_check_neq(a2, null); + do_check_eq(a2.type, "extension"); + do_check_eq(a2.version, "3.0"); + do_check_eq(a2.name, "Real Test 3"); + do_check_true(a2.isActive); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + do_check_true(do_get_addon("test_install2_2").exists()); + + do_check_eq(a2.installDate.getTime(), gInstallDate); + // Update date should be later (or the same if this test is too fast) + do_check_true(a2.installDate <= a2.updateDate); + + a2.uninstall(); + restartManager(0); + + run_test_6(); + }); + }); + }); +} + +// Tests that an install that requires a compatibility update works +function run_test_6() { + prepare_test({ }, [ + "onNewInstall" + ]); + + let url = "http://localhost:4444/addons/test_install3.xpi"; + AddonManager.getInstallForURL(url, function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Real Test 4"); + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); + + AddonManager.getInstalls(null, function(activeInstalls) { + do_check_eq(activeInstalls.length, 1); + do_check_eq(activeInstalls[0], install); + + prepare_test({}, [ + "onDownloadStarted", + "onDownloadEnded", + ], check_test_6); + install.install(); + }); + }, "application/x-xpinstall", null, "Real Test 4", null, "1.0"); +} + +function check_test_6(install) { + ensure_test_completed(); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Real Test 4"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_eq(install.existingAddon, null); + do_check_false(install.addon.appDisabled); + run_test_7(); + return true; +} + +// Continue the install +function run_test_7() { + prepare_test({ + "addon3@tests.mozilla.org": [ + "onInstalling" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_7); +} + +function check_test_7() { + ensure_test_completed(); + AddonManager.getAddon("addon3@tests.mozilla.org", function(olda3) { + do_check_eq(olda3, null); + restartManager(); + + AddonManager.getInstalls(null, function(installs) { + do_check_eq(installs, 0); + + AddonManager.getAddon("addon3@tests.mozilla.org", function(a3) { + do_check_neq(a3, null); + do_check_eq(a3.type, "extension"); + do_check_eq(a3.version, "1.0"); + do_check_eq(a3.name, "Real Test 4"); + do_check_true(a3.isActive); + do_check_false(a3.appDisabled); + do_check_true(isExtensionInAddonsList(profileDir, a3.id)); + do_check_true(do_get_addon("test_install3").exists()); + a3.uninstall(); + restartManager(0); + + end_test(); + }); + }); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_manifest.js b/toolkit/mozapps/extensions/test/xpcshell/test_manifest.js new file mode 100644 index 000000000000..f008f2856943 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_manifest.js @@ -0,0 +1,397 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This tests that all properties are read from the install manifests and that +// items are correctly enabled/disabled based on them (blocklist tests are +// elsewhere) + +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + const profileDir = gProfD.clone(); + profileDir.append("extensions"); + + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon1@tests.mozilla.org", + version: "1.0", + optionsURL: "chrome://test/content/options.xul", + aboutURL: "chrome://test/content/about.xul", + iconURL: "chrome://test/skin/icon.png", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 1", + description: "Test Description", + creator: "Test Creator", + homepageURL: "http://www.example.com", + developer: [ + "Test Developer 1", + "Test Developer 2" + ], + translator: [ + "Test Translator 1", + "Test Translator 2" + ], + contributor: [ + "Test Contributor 1", + "Test Contributor 2" + ] + }, dest); + + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon2@tests.mozilla.org", + version: "1.0", + updateURL: "https://www.foo.com", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 2" + }, dest); + + dest = profileDir.clone(); + dest.append("addon3@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon3@tests.mozilla.org", + version: "1.0", + updateURL: "http://www.foo.com", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 3" + }, dest); + + dest = profileDir.clone(); + dest.append("addon4@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon4@tests.mozilla.org", + version: "1.0", + updateURL: "http://www.foo.com", + updateKey: "foo", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 4" + }, dest); + + dest = profileDir.clone(); + dest.append("addon5@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon5@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "*" + }], + name: "Test Addon 5" + }, dest); + + dest = profileDir.clone(); + dest.append("addon6@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon6@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "0", + maxVersion: "1" + }], + name: "Test Addon 6" + }, dest); + + dest = profileDir.clone(); + dest.append("addon7@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon7@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "0", + maxVersion: "0" + }], + name: "Test Addon 7" + }, dest); + + dest = profileDir.clone(); + dest.append("addon8@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon8@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1.1", + maxVersion: "*" + }], + name: "Test Addon 8" + }, dest); + + dest = profileDir.clone(); + dest.append("addon9@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon9@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1.9.2", + maxVersion: "1.9.*" + }], + name: "Test Addon 9" + }, dest); + + dest = profileDir.clone(); + dest.append("addon10@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon10@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1.9.2.1", + maxVersion: "1.9.*" + }], + name: "Test Addon 10" + }, dest); + + dest = profileDir.clone(); + dest.append("addon11@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon11@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1.9", + maxVersion: "1.9.2" + }], + name: "Test Addon 11" + }, dest); + + dest = profileDir.clone(); + dest.append("addon12@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon12@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1.9", + maxVersion: "1.9.1.*" + }], + name: "Test Addon 12" + }, dest); + + dest = profileDir.clone(); + dest.append("addon13@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon13@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1.9", + maxVersion: "1.9.*" + }, { + id: "xpcshell@tests.mozilla.org", + minVersion: "0", + maxVersion: "0.5" + }], + name: "Test Addon 13" + }, dest); + + dest = profileDir.clone(); + dest.append("addon14@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon14@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1.9", + maxVersion: "1.9.1" + }, { + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 14" + }, dest); + + dest = profileDir.clone(); + dest.append("addon15@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon15@tests.mozilla.org", + version: "1.0", + updateKey: "foo", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 15" + }, dest); + + dest = profileDir.clone(); + dest.append("addon16@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon16@tests.mozilla.org", + version: "1.0", + updateKey: "foo", + updateURL: "https://www.foo.com", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 16" + }, dest); + + do_test_pending(); + startupManager(1); + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org", + "addon6@tests.mozilla.org", + "addon7@tests.mozilla.org", + "addon8@tests.mozilla.org", + "addon9@tests.mozilla.org", + "addon10@tests.mozilla.org", + "addon11@tests.mozilla.org", + "addon12@tests.mozilla.org", + "addon13@tests.mozilla.org", + "addon14@tests.mozilla.org", + "addon15@tests.mozilla.org", + "addon16@tests.mozilla.org"], + function([a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16]) { + + do_check_neq(a1, null); + do_check_eq(a1.id, "addon1@tests.mozilla.org"); + do_check_eq(a1.type, "extension"); + do_check_eq(a1.version, "1.0"); + do_check_eq(a1.optionsURL, "chrome://test/content/options.xul"); + do_check_eq(a1.aboutURL, "chrome://test/content/about.xul"); + do_check_eq(a1.iconURL, "chrome://test/skin/icon.png"); + do_check_eq(a1.name, "Test Addon 1"); + do_check_eq(a1.description, "Test Description"); + do_check_eq(a1.creator, "Test Creator"); + do_check_eq(a1.homepageURL, "http://www.example.com"); + do_check_eq(a1.developers[0], "Test Developer 1"); + do_check_eq(a1.developers[1], "Test Developer 2"); + do_check_eq(a1.translators[0], "Test Translator 1"); + do_check_eq(a1.translators[1], "Test Translator 2"); + do_check_eq(a1.contributors[0], "Test Contributor 1"); + do_check_eq(a1.contributors[1], "Test Contributor 2"); + do_check_true(a1.isActive); + do_check_false(a1.userDisabled); + do_check_false(a1.appDisabled); + do_check_true(a1.isCompatible); + do_check_true(a1.providesUpdatesSecurely); + do_check_eq(a1.blocklistState, AM_Ci.nsIBlocklistService.STATE_NOT_BLOCKED); + + do_check_neq(a2, null); + do_check_eq(a2.id, "addon2@tests.mozilla.org"); + do_check_true(a2.isActive); + do_check_false(a2.userDisabled); + do_check_false(a2.appDisabled); + do_check_true(a2.providesUpdatesSecurely); + + do_check_neq(a3, null); + do_check_eq(a3.id, "addon3@tests.mozilla.org"); + do_check_false(a3.isActive); + do_check_false(a3.userDisabled); + do_check_true(a3.appDisabled); + do_check_false(a3.providesUpdatesSecurely); + + do_check_neq(a4, null); + do_check_eq(a4.id, "addon4@tests.mozilla.org"); + do_check_true(a4.isActive); + do_check_false(a4.userDisabled); + do_check_false(a4.appDisabled); + do_check_true(a4.providesUpdatesSecurely); + + do_check_neq(a5, null); + do_check_true(a5.isActive); + do_check_false(a5.userDisabled); + do_check_false(a5.appDisabled); + do_check_true(a5.isCompatible); + + do_check_neq(a6, null); + do_check_true(a6.isActive); + do_check_false(a6.userDisabled); + do_check_false(a6.appDisabled); + do_check_true(a6.isCompatible); + + do_check_neq(a7, null); + do_check_false(a7.isActive); + do_check_false(a7.userDisabled); + do_check_true(a7.appDisabled); + do_check_false(a7.isCompatible); + + do_check_neq(a8, null); + do_check_false(a8.isActive); + do_check_false(a8.userDisabled); + do_check_true(a8.appDisabled); + do_check_false(a8.isCompatible); + + do_check_neq(a9, null); + do_check_true(a9.isActive); + do_check_false(a9.userDisabled); + do_check_false(a9.appDisabled); + do_check_true(a9.isCompatible); + + do_check_neq(a10, null); + do_check_false(a10.isActive); + do_check_false(a10.userDisabled); + do_check_true(a10.appDisabled); + do_check_false(a10.isCompatible); + + do_check_neq(a11, null); + do_check_true(a11.isActive); + do_check_false(a11.userDisabled); + do_check_false(a11.appDisabled); + do_check_true(a11.isCompatible); + + do_check_neq(a12, null); + do_check_false(a12.isActive); + do_check_false(a12.userDisabled); + do_check_true(a12.appDisabled); + do_check_false(a12.isCompatible); + + do_check_neq(a13, null); + do_check_false(a13.isActive); + do_check_false(a13.userDisabled); + do_check_true(a13.appDisabled); + do_check_false(a13.isCompatible); + + do_check_neq(a14, null); + do_check_true(a14.isActive); + do_check_false(a14.userDisabled); + do_check_false(a14.appDisabled); + do_check_true(a14.isCompatible); + + do_check_neq(a15, null); + do_check_true(a15.isActive); + do_check_false(a15.userDisabled); + do_check_false(a15.appDisabled); + do_check_true(a15.isCompatible); + do_check_true(a15.providesUpdatesSecurely); + + do_check_neq(a16, null); + do_check_true(a16.isActive); + do_check_false(a16.userDisabled); + do_check_false(a16.appDisabled); + do_check_true(a16.isCompatible); + do_check_true(a16.providesUpdatesSecurely); + + do_test_finished(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_migrate1.js b/toolkit/mozapps/extensions/test/xpcshell/test_migrate1.js new file mode 100644 index 000000000000..d1471a1e6cf8 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_migrate1.js @@ -0,0 +1,93 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Checks that we migrate data from previous versions of the database + +var addon1 = { + id: "addon1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +var addon2 = { + id: "addon2@tests.mozilla.org", + version: "2.0", + name: "Test 2", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +var addon3 = { + id: "addon3@tests.mozilla.org", + version: "2.0", + name: "Test 3", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +var addon4 = { + id: "addon4@tests.mozilla.org", + version: "2.0", + name: "Test 4", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir(addon1, dest); + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + writeInstallRDFToDir(addon2, dest); + dest = profileDir.clone(); + dest.append("addon3@tests.mozilla.org"); + writeInstallRDFToDir(addon3, dest); + dest = profileDir.clone(); + dest.append("addon4@tests.mozilla.org"); + writeInstallRDFToDir(addon4, dest); + + let old = do_get_file("data/test_migrate.rdf"); + old.copyTo(gProfD, "extensions.rdf"); + + startupManager(1); + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org"], function([a1, a2, a3, a4]) { + // addon1 was enabled in the old extensions.rdf + do_check_neq(a1, null); + do_check_false(a1.userDisabled); + // addon1 was disabled in the old extensions.rdf + do_check_neq(a2, null); + do_check_true(a2.userDisabled); + // addon1 was pending-disable in the old extensions.rdf + do_check_neq(a3, null); + do_check_true(a3.userDisabled); + // addon1 was pending-enable in the old extensions.rdf + do_check_neq(a4, null); + do_check_false(a4.userDisabled); + do_test_finished(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_migrate2.js b/toolkit/mozapps/extensions/test/xpcshell/test_migrate2.js new file mode 100644 index 000000000000..88d0baf883ee --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_migrate2.js @@ -0,0 +1,118 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Checks that we migrate data from future versions of the database + +var addon1 = { + id: "addon1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +var addon2 = { + id: "addon2@tests.mozilla.org", + version: "2.0", + name: "Test 2", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +var addon3 = { + id: "addon3@tests.mozilla.org", + version: "2.0", + name: "Test 3", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +var addon4 = { + id: "addon4@tests.mozilla.org", + version: "2.0", + name: "Test 4", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir(addon1, dest); + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + writeInstallRDFToDir(addon2, dest); + dest = profileDir.clone(); + dest.append("addon3@tests.mozilla.org"); + writeInstallRDFToDir(addon3, dest); + dest = profileDir.clone(); + dest.append("addon4@tests.mozilla.org"); + writeInstallRDFToDir(addon4, dest); + + + // Write out a minimal database + let dbfile = gProfD.clone(); + dbfile.append("extensions.sqlite"); + let db = AM_Cc["@mozilla.org/storage/service;1"]. + getService(AM_Ci.mozIStorageService). + openDatabase(dbfile); + db.createTable("addon", "id TEXT, location TEXT, active INTEGER, " + + "userDisabled INTEGER, installDate INTEGER, " + + "UNIQUE (id, location)"); + let stmt = db.createStatement("INSERT INTO addon VALUES (:id, :location, " + + ":active, :userDisabled, :installDate)"); + + [["addon1@tests.mozilla.org", "app-profile", "1", "0", "0"], + ["addon2@tests.mozilla.org", "app-profile", "0", "1", "0"], + ["addon3@tests.mozilla.org", "app-profile", "1", "1", "0"], + ["addon4@tests.mozilla.org", "app-profile", "0", "0", "0"]].forEach(function(a) { + stmt.params.id = a[0]; + stmt.params.location = a[1]; + stmt.params.active = a[2]; + stmt.params.userDisabled = a[3]; + stmt.params.installDate = a[4]; + stmt.execute(); + }); + stmt.finalize(); + db.close(); + Services.prefs.setIntPref("extensions.databaseSchema", 100); + + startupManager(1); + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org"], function([a1, a2, a3, a4]) { + // addon1 was enabled in the database + do_check_neq(a1, null); + do_check_false(a1.userDisabled); + // addon1 was disabled in the database + do_check_neq(a2, null); + do_check_true(a2.userDisabled); + // addon1 was pending-disable in the database + do_check_neq(a3, null); + do_check_true(a3.userDisabled); + // addon1 was pending-enable in the database + do_check_neq(a4, null); + do_check_false(a4.userDisabled); + do_test_finished(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_startup.js b/toolkit/mozapps/extensions/test/xpcshell/test_startup.js new file mode 100644 index 000000000000..540331f4ef5b --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_startup.js @@ -0,0 +1,501 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies startup detection of added/removed/changed items and install +// location priorities + +// We try to count the non-test extensions the add-on manager detects like the +// built-in extensions in seamonkey. +var additionalAddons, additionalExtensions; + +var addon1 = { + id: "addon1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +var addon2 = { + id: "addon2@tests.mozilla.org", + version: "2.0", + name: "Test 2", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] +}; + +var addon3 = { + id: "addon3@tests.mozilla.org", + version: "3.0", + name: "Test 3", + targetApplications: [{ + id: "toolkit@mozilla.org", + minVersion: "1.9.2", + maxVersion: "1.9.2.*" + }] +}; + +// Should be ignored because it has no ID +var addon4 = { + version: "4.0", + name: "Test 4", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +// Should be ignored because it has no version +var addon5 = { + id: "addon5@tests.mozilla.org", + name: "Test 5", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + +const globalDir = gProfD.clone(); +globalDir.append("extensions2"); +globalDir.append(gAppInfo.ID); +registerDirectory("XRESysSExtPD", globalDir.parent); +const userDir = gProfD.clone(); +userDir.append("extensions3"); +userDir.append(gAppInfo.ID); +registerDirectory("XREUSysExt", userDir.parent); +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +// Set up the profile +function run_test() { + do_test_pending(); + startupManager(1); + + AddonManager.getAddonsByTypes(null, function(allAddons) { + additionalAddons = allAddons.length; + AddonManager.getAddonsByTypes(["extension"], function(allExtensions) { + additionalExtensions = allExtensions.length; + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_eq(a1, null); + do_check_eq(a2, null); + do_check_eq(a3, null); + do_check_eq(a4, null); + do_check_eq(a5, null); + + run_test_1(); + }); + }); + }); +} + +function end_test() { + do_test_finished(); +} + +// Try to install all the items into the profile +function run_test_1() { + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir(addon1, dest); + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + writeInstallRDFToDir(addon2, dest); + dest = profileDir.clone(); + dest.append("addon3@tests.mozilla.org"); + writeInstallRDFToDir(addon3, dest); + dest = profileDir.clone(); + dest.append("addon4@tests.mozilla.org"); + writeInstallRDFToDir(addon4, dest); + dest = profileDir.clone(); + dest.append("addon5@tests.mozilla.org"); + writeInstallRDFToDir(addon5, dest); + + restartManager(1); + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_neq(a1, null); + do_check_eq(a1.id, "addon1@tests.mozilla.org"); + do_check_eq(a1.version, "1.0"); + do_check_eq(a1.name, "Test 1"); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_neq(a2, null); + do_check_eq(a2.id, "addon2@tests.mozilla.org"); + do_check_eq(a2.version, "2.0"); + do_check_eq(a2.name, "Test 2"); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_neq(a3, null); + do_check_eq(a3.id, "addon3@tests.mozilla.org"); + do_check_eq(a3.version, "3.0"); + do_check_eq(a3.name, "Test 3"); + do_check_true(isExtensionInAddonsList(profileDir, a3.id)); + do_check_true(hasFlag(a3.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a3.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_eq(a4, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon4@tests.mozilla.org")); + dest = profileDir.clone(); + dest.append("addon4@tests.mozilla.org"); + do_check_false(dest.exists()); + + do_check_eq(a5, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon5@tests.mozilla.org")); + dest = profileDir.clone(); + dest.append("addon5@tests.mozilla.org"); + do_check_false(dest.exists()); + + AddonManager.getAddonsByTypes(null, function(addons) { + do_check_eq(addons.length, 3 + additionalAddons); + AddonManager.getAddonsByTypes(["extension"], function(extensionAddons) { + do_check_eq(extensionAddons.length, 3 + additionalExtensions); + run_test_2(); + }); + }); + }); +} + +// Test that modified items are detected and items in other install locations +// are ignored +function run_test_2() { + var dest = userDir.clone(); + dest.append("addon1@tests.mozilla.org"); + addon1.version = "1.1"; + writeInstallRDFToDir(addon1, dest); + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + try { + dest.lastModifiedTime -= 20000; // test runs too fast to see real modifications + } + catch (e) { + // Cannot set last modified time for directories on windows + dest.append("install.rdf"); + dest.lastModifiedTime -= 20000; + } + addon2.version="2.1"; + writeInstallRDFToDir(addon2, dest); + dest = globalDir.clone(); + dest.append("addon2@tests.mozilla.org"); + addon2.version="2.2"; + writeInstallRDFToDir(addon2, dest); + dest = userDir.clone(); + dest.append("addon2@tests.mozilla.org"); + addon2.version="2.3"; + writeInstallRDFToDir(addon2, dest); + dest = profileDir.clone(); + dest.append("addon3@tests.mozilla.org"); + dest.remove(true); + + restartManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_neq(a1, null); + do_check_eq(a1.id, "addon1@tests.mozilla.org"); + do_check_eq(a1.version, "1.0"); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + do_check_false(isExtensionInAddonsList(userDir, a1.id)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_neq(a2, null); + do_check_eq(a2.id, "addon2@tests.mozilla.org"); + do_check_eq(a2.version, "2.1"); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + do_check_false(isExtensionInAddonsList(userDir, a2.id)); + do_check_false(isExtensionInAddonsList(globalDir, a2.id)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_eq(a3, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon3@tests.mozilla.org")); + + do_check_eq(a4, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon4@tests.mozilla.org")); + + do_check_eq(a5, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon5@tests.mozilla.org")); + + run_test_3(); + }); +} + +// Check that removing items from the profile reveals their hidden versions. +function run_test_3() { + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + dest.remove(true); + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + dest.remove(true); + dest = profileDir.clone(); + dest.append("addon4@tests.mozilla.org"); + writeInstallRDFToDir(addon3, dest); + + restartManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_neq(a1, null); + do_check_eq(a1.id, "addon1@tests.mozilla.org"); + do_check_eq(a1.version, "1.1"); + do_check_false(isExtensionInAddonsList(profileDir, a1.id)); + do_check_true(isExtensionInAddonsList(userDir, a1.id)); + do_check_false(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_false(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_neq(a2, null); + do_check_eq(a2.id, "addon2@tests.mozilla.org"); + do_check_eq(a2.version, "2.3"); + do_check_false(isExtensionInAddonsList(profileDir, a2.id)); + do_check_true(isExtensionInAddonsList(userDir, a2.id)); + do_check_false(isExtensionInAddonsList(globalDir, a2.id)); + do_check_false(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_false(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_eq(a3, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon3@tests.mozilla.org")); + + do_check_eq(a4, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon4@tests.mozilla.org")); + + do_check_eq(a5, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon5@tests.mozilla.org")); + + dest = profileDir.clone(); + dest.append("addon4@tests.mozilla.org"); + do_check_false(dest.exists()); + + run_test_4(); + }); +} + +// Check that items in the profile hide the others again. +function run_test_4() { + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + addon1.version = "1.2"; + writeInstallRDFToDir(addon1, dest); + dest = userDir.clone(); + dest.append("addon2@tests.mozilla.org"); + dest.remove(true); + + restartManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_neq(a1, null); + do_check_eq(a1.id, "addon1@tests.mozilla.org"); + do_check_eq(a1.version, "1.2"); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + do_check_false(isExtensionInAddonsList(userDir, a1.id)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_neq(a2, null); + do_check_eq(a2.id, "addon2@tests.mozilla.org"); + do_check_eq(a2.version, "2.2"); + do_check_false(isExtensionInAddonsList(profileDir, a2.id)); + do_check_false(isExtensionInAddonsList(userDir, a2.id)); + do_check_true(isExtensionInAddonsList(globalDir, a2.id)); + do_check_false(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_false(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_eq(a3, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon3@tests.mozilla.org")); + + do_check_eq(a4, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon4@tests.mozilla.org")); + + do_check_eq(a5, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon5@tests.mozilla.org")); + + run_test_5(); + }); +} + +// More hiding and revealing +function run_test_5() { + var dest = userDir.clone(); + dest.append("addon1@tests.mozilla.org"); + dest.remove(true); + dest = globalDir.clone(); + dest.append("addon2@tests.mozilla.org"); + dest.remove(true); + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + addon2.version = "2.4"; + writeInstallRDFToDir(addon2, dest); + + restartManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_neq(a1, null); + do_check_eq(a1.id, "addon1@tests.mozilla.org"); + do_check_eq(a1.version, "1.2"); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + do_check_false(isExtensionInAddonsList(userDir, a1.id)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_neq(a2, null); + do_check_eq(a2.id, "addon2@tests.mozilla.org"); + do_check_eq(a2.version, "2.4"); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + do_check_false(isExtensionInAddonsList(userDir, a2.id)); + do_check_false(isExtensionInAddonsList(globalDir, a2.id)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_eq(a3, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon3@tests.mozilla.org")); + + do_check_eq(a4, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon4@tests.mozilla.org")); + + do_check_eq(a5, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon5@tests.mozilla.org")); + + run_test_6(); + }); +} + +// Checks that a removal from one location and an addition in another location +// for the same item is handled +function run_test_6() { + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + dest.remove(true); + dest = userDir.clone(); + dest.append("addon1@tests.mozilla.org"); + addon1.version = "1.3"; + writeInstallRDFToDir(addon1, dest); + + restartManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_neq(a1, null); + do_check_eq(a1.id, "addon1@tests.mozilla.org"); + do_check_eq(a1.version, "1.3"); + do_check_false(isExtensionInAddonsList(profileDir, a1.id)); + do_check_true(isExtensionInAddonsList(userDir, a1.id)); + do_check_false(hasFlag(a1.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_false(hasFlag(a1.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_neq(a2, null); + do_check_eq(a2.id, "addon2@tests.mozilla.org"); + do_check_eq(a2.version, "2.4"); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + do_check_false(isExtensionInAddonsList(userDir, a2.id)); + do_check_false(isExtensionInAddonsList(globalDir, a2.id)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UNINSTALL)); + do_check_true(hasFlag(a2.permissions, AddonManager.PERM_CAN_UPGRADE)); + + do_check_eq(a3, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon3@tests.mozilla.org")); + + do_check_eq(a4, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon4@tests.mozilla.org")); + + do_check_eq(a5, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon5@tests.mozilla.org")); + + run_test_7(); + }); +} + +// This should remove any remaining items +function run_test_7() { + var dest = userDir.clone(); + dest.append("addon1@tests.mozilla.org"); + dest.remove(true); + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + dest.remove(true); + + restartManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org", + "addon4@tests.mozilla.org", + "addon5@tests.mozilla.org"], + function([a1, a2, a3, a4, a5]) { + + do_check_eq(a1, null); + do_check_eq(a2, null); + do_check_eq(a3, null); + do_check_eq(a4, null); + do_check_eq(a5, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon1@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(profileDir, "addon2@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(profileDir, "addon3@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(profileDir, "addon4@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(profileDir, "addon5@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(userDir, "addon1@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(userDir, "addon2@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(userDir, "addon3@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(userDir, "addon4@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(userDir, "addon5@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(globalDir, "addon1@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(globalDir, "addon2@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(globalDir, "addon3@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(globalDir, "addon4@tests.mozilla.org")); + do_check_false(isExtensionInAddonsList(globalDir, "addon5@tests.mozilla.org")); + + end_test(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_theme.js b/toolkit/mozapps/extensions/test/xpcshell/test_theme.js new file mode 100644 index 000000000000..536df55ccd67 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_theme.js @@ -0,0 +1,680 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that themes behave as expected + +// TODO This test relies on the default theme being present + +const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin"; + +Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm"); + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + Services.prefs.setCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN, "theme1/1.0"); + var dest = profileDir.clone(); + dest.append("theme1@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "theme1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + type: 4, + internalName: "theme1/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] + }, dest); + dest = profileDir.clone(); + dest.append("theme2@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "theme2@tests.mozilla.org", + version: "1.0", + name: "Test 1", + internalName: "theme2/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] + }, dest); + + startupManager(1); + // Make sure we only register once despite multiple calls + AddonManager.addInstallListener(InstallListener); + AddonManager.addAddonListener(AddonListener); + AddonManager.addInstallListener(InstallListener); + AddonManager.addAddonListener(AddonListener); + + AddonManager.getAddons(["theme1@tests.mozilla.org", "theme2@tests.mozilla.org"], function([t1, t2]) { + do_check_neq(t1, null); + do_check_false(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_true(t1.isActive); + do_check_true(isThemeInAddonsList(profileDir, t1.id)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_check_neq(t2, null); + do_check_true(t2.userDisabled); + do_check_false(t2.appDisabled); + do_check_false(t2.isActive); + do_check_false(isThemeInAddonsList(profileDir, t2.id)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); + + run_test_1(); + }); +} + +function end_test() { + do_test_finished(); +} + +// Checks enabling one theme disables the others +function run_test_1() { + prepare_test({ + "theme1@tests.mozilla.org": [ + "onDisabling" + ], + "theme2@tests.mozilla.org": [ + "onEnabling" + ] + }); + AddonManager.getAddons(["theme1@tests.mozilla.org", "theme2@tests.mozilla.org"], function([t1, t2]) { + t2.userDisabled = false; + + ensure_test_completed(); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_check_true(t1.userDisabled); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + + check_test_1(); + }); +} + +function check_test_1() { + restartManager(0); + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme2/1.0"); + + AddonManager.getAddons(["theme1@tests.mozilla.org", "theme2@tests.mozilla.org"], function([t1, t2]) { + do_check_neq(t1, null); + do_check_true(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_false(t1.isActive); + do_check_false(isThemeInAddonsList(profileDir, t1.id)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_check_neq(t2, null); + do_check_false(t2.userDisabled); + do_check_false(t2.appDisabled); + do_check_true(t2.isActive); + do_check_true(isThemeInAddonsList(profileDir, t2.id)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); + + run_test_2(); + }); +} + +// Removing the active theme should fall back to the default (not ideal in this +// case since we don't have the default theme installed) +function run_test_2() { + var dest = profileDir.clone(); + dest.append("theme2@tests.mozilla.org"); + dest.remove(true); + + restartManager(1); + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "classic/1.0"); + + AddonManager.getAddons(["theme1@tests.mozilla.org", "theme2@tests.mozilla.org"], function([t1, t2]) { + do_check_neq(t1, null); + do_check_true(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_false(t1.isActive); + do_check_false(isThemeInAddonsList(profileDir, t1.id)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_check_eq(t2, null); + do_check_false(isThemeInAddonsList(profileDir, "theme2@tests.mozilla.org")); + + run_test_3(); + }); +} + +// Installing a lightweight theme should happen instantly and disable the default theme +function run_test_3() { + var dest = profileDir.clone(); + dest.append("theme2@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "theme2@tests.mozilla.org", + version: "1.0", + name: "Test 1", + internalName: "theme2/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] + }, dest); + restartManager(1); + + prepare_test({ + "1@personas.mozilla.org": [ + ["onInstalling", false], + "onInstalled", + ["onEnabling", false], + "onEnabled" + ], + "{972ce4c6-7e08-4474-a285-3208198ce6fd}": [ + ["onDisabling", false], + "onDisabled", + ] + }); + + LightweightThemeManager.currentTheme = { + id: "1", + version: "1", + name: "Test LW Theme", + description: "A test theme", + author: "Mozilla", + homepageURL: "http://localhost:4444/data/index.html", + headerURL: "http://localhost:4444/data/header.png", + footerURL: "http://localhost:4444/data/footer.png", + previewURL: "http://localhost:4444/data/preview.png", + iconURL: "http://localhost:4444/data/icon.png" + }; + + ensure_test_completed(); + + AddonManager.getAddon("1@personas.mozilla.org", function(p1) { + do_check_neq(null, p1); + do_check_eq(p1.name, "Test LW Theme"); + do_check_eq(p1.version, "1"); + do_check_eq(p1.description, "A test theme"); + do_check_eq(p1.creator, "Mozilla"); + do_check_eq(p1.homepageURL, "http://localhost:4444/data/index.html"); + do_check_eq(p1.iconURL, "http://localhost:4444/data/icon.png"); + do_check_eq(p1.screenshots.length, 1); + do_check_eq(p1.screenshots[0], "http://localhost:4444/data/preview.png"); + do_check_false(p1.appDisabled); + do_check_false(p1.userDisabled); + do_check_true(p1.isActive); + do_check_eq(p1.pendingOperations, 0); + do_check_eq(p1.permissions, AddonManager.PERM_CAN_UNINSTALL); + + AddonManager.getAddonsByTypes(["theme"], function(addons) { + let seen = false; + addons.forEach(function(a) { + if (a.id == "1@personas.mozilla.org") { + seen = true; + } + else { + dump("Checking theme " + a.id + "\n"); + do_check_false(a.isActive); + do_check_true(a.userDisabled); + } + }); + do_check_true(seen); + + run_test_4(); + }); + }); +} + +// Installing a second lightweight theme should disable the first with no restart +function run_test_4() { + prepare_test({ + "1@personas.mozilla.org": [ + ["onDisabling", false], + "onDisabled", + ], + "2@personas.mozilla.org": [ + ["onInstalling", false], + "onInstalled", + ["onEnabling", false], + "onEnabled" + ] + }); + + LightweightThemeManager.currentTheme = { + id: "2", + version: "1", + name: "Test LW Theme", + description: "A second test theme", + author: "Mozilla", + homepageURL: "http://localhost:4444/data/index.html", + headerURL: "http://localhost:4444/data/header.png", + footerURL: "http://localhost:4444/data/footer.png", + previewURL: "http://localhost:4444/data/preview.png", + iconURL: "http://localhost:4444/data/icon.png" + }; + + ensure_test_completed(); + + AddonManager.getAddons(["1@personas.mozilla.org", + "2@personas.mozilla.org"], function([p1, p2]) { + do_check_neq(null, p2); + do_check_false(p2.appDisabled); + do_check_false(p2.userDisabled); + do_check_true(p2.isActive); + do_check_eq(p2.pendingOperations, 0); + do_check_eq(p2.permissions, AddonManager.PERM_CAN_UNINSTALL); + + do_check_neq(null, p1); + do_check_false(p1.appDisabled); + do_check_true(p1.userDisabled); + do_check_false(p1.isActive); + do_check_eq(p1.pendingOperations, 0); + do_check_eq(p1.permissions, AddonManager.PERM_CAN_UNINSTALL + AddonManager.PERM_CAN_ENABLE); + + AddonManager.getAddonsByTypes(["theme"], function(addons) { + let seen = false; + addons.forEach(function(a) { + if (a.id == "2@personas.mozilla.org") { + seen = true; + } + else { + dump("Checking theme " + a.id + "\n"); + do_check_false(a.isActive); + do_check_true(a.userDisabled); + } + }); + do_check_true(seen); + + run_test_5(); + }); + }); +} + +// Switching to a custom theme should disable the lightweight theme and require +// a restart. Cancelling that should also be possible. +function run_test_5() { + prepare_test({ + "2@personas.mozilla.org": [ + "onDisabling", + ], + "theme2@tests.mozilla.org": [ + "onEnabling" + ] + }); + + AddonManager.getAddons(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + t2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onOperationCancelled", + ], + "theme2@tests.mozilla.org": [ + "onOperationCancelled" + ] + }); + + p2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onDisabling", + ], + "theme2@tests.mozilla.org": [ + "onEnabling" + ] + }); + + t2.userDisabled = false; + + ensure_test_completed(); + + do_check_false(t2.isActive); + do_check_false(t2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_ENABLE, t2.pendingOperations)); + do_check_true(p2.isActive); + do_check_true(p2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, p2.pendingOperations)); + do_check_true(hasFlag(AddonManager.PERM_CAN_ENABLE, p2.permissions)); + + check_test_5(); + }); +} + +function check_test_5() { + restartManager(0); + + AddonManager.getAddons(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + do_check_true(t2.isActive); + do_check_false(t2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_ENABLE, t2.pendingOperations)); + do_check_false(p2.isActive); + do_check_true(p2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_DISABLE, p2.pendingOperations)); + + run_test_6(); + }); +} + +// Switching from a custom theme to a lightweight theme should require a restart +function run_test_6() { + prepare_test({ + "2@personas.mozilla.org": [ + "onEnabling", + ], + "theme2@tests.mozilla.org": [ + "onDisabling" + ] + }); + + AddonManager.getAddons(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + p2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onOperationCancelled", + ], + "theme2@tests.mozilla.org": [ + "onOperationCancelled" + ] + }); + + t2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onEnabling", + ], + "theme2@tests.mozilla.org": [ + "onDisabling" + ] + }); + + p2.userDisabled = false; + + ensure_test_completed(); + + do_check_false(p2.isActive); + do_check_false(p2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_ENABLE, p2.pendingOperations)); + do_check_true(t2.isActive); + do_check_true(t2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, t2.pendingOperations)); + + check_test_6(); + }); +} + +function check_test_6() { + restartManager(0); + + AddonManager.getAddons(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + do_check_true(p2.isActive); + do_check_false(p2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_ENABLE, p2.pendingOperations)); + do_check_false(t2.isActive); + do_check_true(t2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_DISABLE, t2.pendingOperations)); + + run_test_7(); + }); +} + +// Uninstalling a lightweight theme should not require a restart +function run_test_7() { + prepare_test({ + "1@personas.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ] + }); + + AddonManager.getAddon("1@personas.mozilla.org", function(p1) { + p1.uninstall(); + + ensure_test_completed(); + do_check_eq(LightweightThemeManager.usedThemes.length, 1); + + run_test_8(); + }); +} + +// Uninstalling a lightweight theme in use should not require a restart and it +// should reactivate the default theme +function run_test_8() { + // TODO stop this depending on the default theme being present + prepare_test({ + "2@personas.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ], + "{972ce4c6-7e08-4474-a285-3208198ce6fd}": [ + ["onEnabling", false], + "onEnabled" + ] + }); + + AddonManager.getAddon("2@personas.mozilla.org", function(p2) { + p2.uninstall(); + + ensure_test_completed(); + do_check_eq(LightweightThemeManager.usedThemes.length, 0); + + run_test_9(); + }); +} + +// Uninstalling a theme not in use should not require a restart +function run_test_9() { + AddonManager.getAddon("theme1@tests.mozilla.org", function(t1) { + prepare_test({ + "theme1@tests.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ] + }); + + t1.uninstall(); + + ensure_test_completed(); + + AddonManager.getAddon("theme1@tests.mozilla.org", function(newt1) { + do_check_eq(newt1, null); + + run_test_10(); + }); + }); +} + +// Uninstalling a custom theme in use should require a restart +function run_test_10() { + AddonManager.getAddon("theme2@tests.mozilla.org", function(oldt2) { + prepare_test({ + "theme2@tests.mozilla.org": [ + "onEnabling", + ], + "{972ce4c6-7e08-4474-a285-3208198ce6fd}": [ + "onDisabling" + ] + }); + + oldt2.userDisabled = false; + + ensure_test_completed(); + + restartManager(0); + + AddonManager.getAddons(["{972ce4c6-7e08-4474-a285-3208198ce6fd}", + "theme2@tests.mozilla.org"], function([d, t2]) { + do_check_true(t2.isActive); + do_check_false(t2.userDisabled); + do_check_false(t2.appDisabled); + do_check_false(d.isActive); + do_check_true(d.userDisabled); + do_check_false(d.appDisabled); + + prepare_test({ + "theme2@tests.mozilla.org": [ + "onUninstalling", + ], + "{972ce4c6-7e08-4474-a285-3208198ce6fd}": [ + "onEnabling" + ] + }); + + t2.uninstall(); + + ensure_test_completed(); + + restartManager(0); + + run_test_11(); + }); + }); +} + +// Installing a custom theme not in use should not require a restart +function run_test_11() { + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "theme"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test Theme 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + + prepare_test({ + "theme1@tests.mozilla.org": [ + ["onInstalling", false], + "onInstalled" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_11); + install.install(); + }); +} + +function check_test_11() { + AddonManager.getAddon("theme1@tests.mozilla.org", function(t1) { + do_check_neq(t1, null); + + run_test_12(); + }); +} + +// Updating a custom theme not in use should not require a restart +function run_test_12() { + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "theme"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test Theme 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + + prepare_test({ + "theme1@tests.mozilla.org": [ + ["onInstalling", false], + "onInstalled" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_12); + install.install(); + }); +} + +function check_test_12() { + AddonManager.getAddon("theme1@tests.mozilla.org", function(t1) { + do_check_neq(t1, null); + + run_test_13(); + }); +} + +// Updating a custom theme in use should require a restart +function run_test_13() { + AddonManager.getAddon("theme1@tests.mozilla.org", function(t1) { + prepare_test({ + "theme1@tests.mozilla.org": [ + "onEnabling", + ], + "{972ce4c6-7e08-4474-a285-3208198ce6fd}": [ + "onDisabling" + ] + }); + + t1.userDisabled = false; + ensure_test_completed(); + restartManager(0); + + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "theme"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test Theme 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + + prepare_test({ + "theme1@tests.mozilla.org": [ + "onInstalling", + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_13); + install.install(); + }); + }); +} + +function check_test_13() { + restartManager(1); + + AddonManager.getAddon("theme1@tests.mozilla.org", function(t1) { + do_check_neq(t1, null); + do_check_true(t1.isActive); + + end_test(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_uninstall.js b/toolkit/mozapps/extensions/test/xpcshell/test_uninstall.js new file mode 100644 index 000000000000..be66b802cb37 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_uninstall.js @@ -0,0 +1,212 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that add-ons can be uninstalled. + +var addon1 = { + id: "addon1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }] +}; + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +// Sets up the profile by installing a couple of add-ons. One is dependent on +// the other. +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + do_test_pending(); + startupManager(1); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(olda1) { + do_check_eq(olda1, null); + + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir(addon1, dest); + + restartManager(1); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_true(a1.isActive); + do_check_false(a1.userDisabled); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + do_check_eq(a1.pendingOperations, 0); + + run_test_1(); + }); + }); +} + +function end_test() { + do_test_finished(); +} + +// Uninstalling an add-on should work. +function run_test_1() { + prepare_test({ + "addon1@tests.mozilla.org": [ + "onUninstalling" + ] + }); + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_eq(a1.pendingOperations, 0); + a1.uninstall(); + do_check_true(hasFlag(a1.pendingOperations, AddonManager.PENDING_UNINSTALL)); + + ensure_test_completed(); + + AddonManager.getAddonsWithPendingOperations(null, function(list) { + do_check_eq(list.length, 1); + do_check_eq(list[0].id, "addon1@tests.mozilla.org"); + + check_test_1(); + }); + }); +} + +function check_test_1() { + restartManager(0); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_eq(a1, null); + do_check_false(isExtensionInAddonsList(profileDir, "addon1@tests.mozilla.org")); + + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + do_check_false(dest.exists()); + writeInstallRDFToDir(addon1, dest); + restartManager(1); + + run_test_2(); + }); +} + +// Cancelling the uninstall should send onOperationCancelled +function run_test_2() { + prepare_test({ + "addon1@tests.mozilla.org": [ + "onUninstalling" + ] + }); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_true(a1.isActive); + do_check_false(a1.userDisabled); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + do_check_eq(a1.pendingOperations, 0); + a1.uninstall(); + do_check_true(hasFlag(a1.pendingOperations, AddonManager.PENDING_UNINSTALL)); + + ensure_test_completed(); + + prepare_test({ + "addon1@tests.mozilla.org": [ + "onOperationCancelled" + ] + }); + a1.cancelUninstall(); + do_check_eq(a1.pendingOperations, 0); + + ensure_test_completed(); + + check_test_2(); + }); +} + +function check_test_2() { + restartManager(0); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_true(a1.isActive); + do_check_false(a1.userDisabled); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + + run_test_3(); + }); +} + +// Uninstalling an item pending disable should still require a restart +function run_test_3() { + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + prepare_test({ + "addon1@tests.mozilla.org": [ + "onDisabling" + ] + }); + a1.userDisabled = true; + ensure_test_completed(); + + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, a1.pendingOperations)); + do_check_true(a1.isActive); + + prepare_test({ + "addon1@tests.mozilla.org": [ + "onUninstalling" + ] + }); + a1.uninstall(); + + check_test_3(); + }); +} + +function check_test_3() { + ensure_test_completed(); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, a1.pendingOperations)); + do_check_true(hasFlag(AddonManager.PENDING_UNINSTALL, a1.pendingOperations)); + + prepare_test({ + "addon1@tests.mozilla.org": [ + "onOperationCancelled" + ] + }); + a1.cancelUninstall(); + ensure_test_completed(); + + restartManager(0); + run_test_4(); + }); +} + +// Test that uninstalling an inactive item should happen without a restart +function run_test_4() { + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_false(a1.isActive); + do_check_true(a1.userDisabled); + do_check_false(isExtensionInAddonsList(profileDir, a1.id)); + + prepare_test({ + "addon1@tests.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ] + }); + a1.uninstall(); + + check_test_4(); + }); +} + +function check_test_4() { + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_eq(a1, null); + + end_test(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_update.js b/toolkit/mozapps/extensions/test/xpcshell/test_update.js new file mode 100644 index 000000000000..a71d9b6939f1 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_update.js @@ -0,0 +1,233 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that add-on update checks work + +// The test extension uses an insecure update url. +Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false); + +do_load_httpd_js(); +var testserver; +var profileDir; + +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + // Create and configure the HTTP server. + testserver = new nsHttpServer(); + testserver.registerDirectory("/data/", do_get_file("data")); + testserver.registerDirectory("/addons/", do_get_file("addons")); + testserver.start(4444); + + profileDir = gProfD.clone(); + profileDir.append("extensions"); + + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon1@tests.mozilla.org", + version: "1.0", + updateURL: "http://localhost:4444/data/test_update.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 1", + }, dest); + + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon2@tests.mozilla.org", + version: "1.0", + updateURL: "http://localhost:4444/data/test_update.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "0", + maxVersion: "0" + }], + name: "Test Addon 2", + }, dest); + + startupManager(1); + + do_test_pending(); + run_test_1(); +} + +function end_test() { + testserver.stop(do_test_finished); +} + +// Verify that an update is available and can be installed. +function run_test_1() { + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_eq(a1.version, "1.0"); + + prepare_test({}, [ + "onNewInstall", + ]); + + a1.findUpdates({ + onCompatibilityUpdated: function(addon) { + do_throw("Should not have seen a compatibility update"); + }, + + onUpdateAvailable: function(addon, install) { + ensure_test_completed(); + + do_check_eq(addon, a1); + do_check_eq(install.name, addon.name); + do_check_eq(install.version, "2.0"); + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); + do_check_eq(install.existingAddon, addon); + + prepare_test({}, [ + "onDownloadStarted", + "onDownloadEnded", + ], check_test_1); + install.install(); + }, + + onUpdateFinished: function(addon, status) { + do_check_eq(addon, a1); + do_check_eq(status, 0); + } + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); + }); +} + +function check_test_1(install) { + ensure_test_completed(); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + run_test_2(); +} + +// Continue installing the update. +function run_test_2() { + prepare_test({ + "addon1@tests.mozilla.org": [ + "onInstalling" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_2); +} + +function check_test_2() { + ensure_test_completed(); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(olda1) { + do_check_neq(olda1, null); + do_check_eq(olda1.version, "1.0"); + restartManager(1); + + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_eq(a1.version, "2.0"); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + a1.uninstall(); + restartManager(0); + + run_test_3(); + }); + }); +} + + +// Check that an update check finds compatibility updates and applies them +function run_test_3() { + AddonManager.getAddon("addon2@tests.mozilla.org", function(a2) { + do_check_neq(a2, null); + do_check_false(a2.isActive); + do_check_false(a2.isCompatible); + do_check_true(a2.appDisabled); + a2.findUpdates({ + onCompatibilityUpdated: function(addon) { + do_check_true(a2.isCompatible); + do_check_false(a2.appDisabled); + do_check_false(a2.isActive); + }, + + onUpdateAvailable: function(addon, install) { + do_throw("Should not have seen an available update"); + }, + + onUpdateFinished: function(addon, status) { + do_check_eq(addon, a2); + do_check_eq(status, 0); + restartManager(0); + check_test_3(); + } + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); + }); +} + +function check_test_3() { + AddonManager.getAddon("addon2@tests.mozilla.org", function(a2) { + do_check_neq(a2, null); + do_check_true(a2.isActive); + do_check_true(a2.isCompatible); + do_check_false(a2.appDisabled); + a2.uninstall(); + + run_test_4(); + }); +} + +// Test that background update checks work +function run_test_4() { + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon1@tests.mozilla.org", + version: "1.0", + updateURL: "http://localhost:4444/data/test_update.rdf", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 1", + }, dest); + restartManager(1); + + prepare_test({}, [ + "onNewInstall", + "onDownloadStarted", + "onDownloadEnded" + ], continue_test_4); + + // Fake a timer event to cause a background update and wait for the magic to + // happen + gInternalManager.notify(null); +} + +function continue_test_4(install) { + do_check_neq(install.existingAddon, null); + do_check_eq(install.existingAddon.id, "addon1@tests.mozilla.org"); + prepare_test({ + "addon1@tests.mozilla.org": [ + "onInstalling" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_4); +} + +function check_test_4() { + restartManager(1); + AddonManager.getAddon("addon1@tests.mozilla.org", function(a1) { + do_check_neq(a1, null); + do_check_eq(a1.version, "2.0"); + a1.uninstall(); + restartManager(0); + + end_test(); + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_updatecheck.js b/toolkit/mozapps/extensions/test/xpcshell/test_updatecheck.js new file mode 100644 index 000000000000..e2418456e4dd --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_updatecheck.js @@ -0,0 +1,202 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that AddonUpdateChecker works correctly + +Components.utils.import("resource://gre/modules/AddonUpdateChecker.jsm"); + +do_load_httpd_js(); +var testserver; + +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + // Create and configure the HTTP server. + testserver = new nsHttpServer(); + testserver.registerDirectory("/data/", do_get_file("data")); + testserver.start(4444); + + do_test_pending(); + run_test_1(); +} + +function end_test() { + testserver.stop(do_test_finished); +} + +// Test that a basic update check returns the expected available updates +function run_test_1() { + AddonUpdateChecker.checkForUpdates("updatecheck1@tests.mozilla.org", "extension", null, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + check_test_1(updates); + }, + + onUpdateCheckError: function(status) { + do_throw("Update check failed with status " + status); + } + }); +} + +function check_test_1(updates) { + do_check_eq(updates.length, 5); + let update = AddonUpdateChecker.getNewestCompatibleUpdate(updates); + do_check_neq(update, null); + do_check_eq(update.version, 3); + update = AddonUpdateChecker.getCompatibilityUpdate(updates, "2"); + do_check_neq(update, null); + do_check_eq(update.version, 2); + do_check_eq(update.targetApplications[0].minVersion, 1); + do_check_eq(update.targetApplications[0].maxVersion, 2); + + run_test_2(); +} + +/* + * Tests that the security checks are applied correctly + * + * Test signature updateHash updateLink expected + *-------------------------------------------------------- + * 2 absent absent http fail + * 3 broken absent http fail + * 4 correct absent http no update + * 5 correct sha1 http update + * 6 corrent absent https update + * 7 corrent sha1 https update + * 8 corrent md2 http no update + * 9 corrent md2 https update + */ + +let updateKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK426erD/H3XtsjvaB5+PJqbhj" + + "Zc9EDI5OCJS8R3FIObJ9ZHJK1TXeaE7JWqt9WUmBWTEFvwS+FI9vWu8058N9CHhD" + + "NyeP6i4LuUYjTURnn7Yw/IgzyIJ2oKsYa32RuxAyteqAWqPT/J63wBixIeCxmysf" + + "awB/zH4KaPiY3vnrzQIDAQAB"; + +function run_test_2() { + AddonUpdateChecker.checkForUpdates("test_bug378216_5@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_throw("Expected the update check to fail"); + }, + + onUpdateCheckError: function(status) { + run_test_3(); + } + }); +} + +function run_test_3() { + AddonUpdateChecker.checkForUpdates("test_bug378216_7@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_throw("Expected the update check to fail"); + }, + + onUpdateCheckError: function(status) { + run_test_4(); + } + }); +} + +function run_test_4() { + AddonUpdateChecker.checkForUpdates("test_bug378216_8@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_check_eq(updates.length, 1); + do_check_false("updateURL" in updates[0]); + run_test_5(); + }, + + onUpdateCheckError: function(status) { + do_throw("Update check failed with status " + status); + } + }); +} + +function run_test_5() { + AddonUpdateChecker.checkForUpdates("test_bug378216_9@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_check_eq(updates.length, 1); + do_check_eq(updates[0].version, "2.0"); + do_check_true("updateURL" in updates[0]); + run_test_6(); + }, + + onUpdateCheckError: function(status) { + do_throw("Update check failed with status " + status); + } + }); +} + +function run_test_6() { + AddonUpdateChecker.checkForUpdates("test_bug378216_10@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_check_eq(updates.length, 1); + do_check_eq(updates[0].version, "2.0"); + do_check_true("updateURL" in updates[0]); + run_test_7(); + }, + + onUpdateCheckError: function(status) { + do_throw("Update check failed with status " + status); + } + }); +} + +function run_test_7() { + AddonUpdateChecker.checkForUpdates("test_bug378216_11@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_check_eq(updates.length, 1); + do_check_eq(updates[0].version, "2.0"); + do_check_true("updateURL" in updates[0]); + run_test_8(); + }, + + onUpdateCheckError: function(status) { + do_throw("Update check failed with status " + status); + } + }); +} + +function run_test_8() { + AddonUpdateChecker.checkForUpdates("test_bug378216_12@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_check_eq(updates.length, 1); + do_check_false("updateURL" in updates[0]); + run_test_9(); + }, + + onUpdateCheckError: function(status) { + do_throw("Update check failed with status " + status); + } + }); +} + +function run_test_9() { + AddonUpdateChecker.checkForUpdates("test_bug378216_13@tests.mozilla.org", + "extension", updateKey, + "http://localhost:4444/data/test_updatecheck.rdf", { + onUpdateCheckComplete: function(updates) { + do_check_eq(updates.length, 1); + do_check_eq(updates[0].version, "2.0"); + do_check_true("updateURL" in updates[0]); + end_test(); + }, + + onUpdateCheckError: function(status) { + do_throw("Update check failed with status " + status); + } + }); +} diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_upgrade.js b/toolkit/mozapps/extensions/test/xpcshell/test_upgrade.js new file mode 100644 index 000000000000..162273f122d6 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_upgrade.js @@ -0,0 +1,125 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// This verifies that app upgrades produce the expected behaviours. + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + // Will be enabled in the first version and disabled in subsequent versions + var dest = profileDir.clone(); + dest.append("addon1@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon1@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "1" + }], + name: "Test Addon 1", + }, dest); + + // Works in all tested versions + dest = profileDir.clone(); + dest.append("addon2@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon2@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }], + name: "Test Addon 2", + }, dest); + + // Will be disabled in the first version and enabled in the second. + dest = profileDir.clone(); + dest.append("addon3@tests.mozilla.org"); + writeInstallRDFToDir({ + id: "addon3@tests.mozilla.org", + version: "1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "2", + maxVersion: "2" + }], + name: "Test Addon 3", + }, dest); + + do_test_pending(); + + run_test_1(); +} + +// Test that the test extensions are all installed +function run_test_1() { + startupManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org"], function([a1, a2, a3]) { + + do_check_neq(a1, null); + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); + + do_check_neq(a2, null); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + + do_check_neq(a3, null); + do_check_false(isExtensionInAddonsList(profileDir, a3.id)); + + run_test_2(); + }); +} + +// Test that upgrading the application disables now incompatible add-ons +function run_test_2() { + restartManager(1, "2"); + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org"], function([a1, a2, a3]) { + + do_check_neq(a1, null); + do_check_false(isExtensionInAddonsList(profileDir, a1.id)); + + do_check_neq(a2, null); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + + do_check_neq(a3, null); + do_check_true(isExtensionInAddonsList(profileDir, a3.id)); + + run_test_3(); + }); +} + +// Test that nothing changes when only the build ID changes. +function run_test_3() { + // Simulates a simple Build ID change, the platform deletes extensions.ini + // whenever the application is changed. + var file = gProfD.clone(); + file.append("extensions.ini"); + file.remove(true); + restartManager(1); + + AddonManager.getAddons(["addon1@tests.mozilla.org", + "addon2@tests.mozilla.org", + "addon3@tests.mozilla.org"], function([a1, a2, a3]) { + + do_check_neq(a1, null); + do_check_false(isExtensionInAddonsList(profileDir, a1.id)); + + do_check_neq(a2, null); + do_check_true(isExtensionInAddonsList(profileDir, a2.id)); + + do_check_neq(a3, null); + do_check_true(isExtensionInAddonsList(profileDir, a3.id)); + + do_test_finished(); + }); +}