michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: michael@0: // This verifies that add-ons URIs can be mapped to add-on IDs michael@0: // michael@0: Components.utils.import("resource://gre/modules/Services.jsm"); michael@0: michael@0: // Enable loading extensions from the user scopes michael@0: Services.prefs.setIntPref("extensions.enabledScopes", michael@0: AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER); michael@0: michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: michael@0: const profileDir = gProfD.clone(); michael@0: profileDir.append("extensions"); michael@0: const userExtDir = gProfD.clone(); michael@0: userExtDir.append("extensions2"); michael@0: userExtDir.append(gAppInfo.ID); michael@0: registerDirectory("XREUSysExt", userExtDir.parent); michael@0: michael@0: function TestProvider(result) { michael@0: this.result = result; michael@0: } michael@0: TestProvider.prototype = { michael@0: uri: Services.io.newURI("hellow://world", null, null), michael@0: id: "valid@id", michael@0: startup: function() {}, michael@0: shutdown: function() {}, michael@0: mapURIToAddonID: function(aURI) { michael@0: if (aURI.spec === this.uri.spec) { michael@0: return this.id; michael@0: } michael@0: throw Components.Exception("Not mapped", result); michael@0: } michael@0: }; michael@0: michael@0: function TestProviderNoMap() {} michael@0: TestProviderNoMap.prototype = { michael@0: startup: function() {}, michael@0: shutdown: function() {} michael@0: }; michael@0: michael@0: function check_mapping(uri, id) { michael@0: do_check_eq(AddonManager.mapURIToAddonID(uri), id); michael@0: let svc = Components.classes["@mozilla.org/addons/integration;1"]. michael@0: getService(Components.interfaces.amIAddonManager); michael@0: let val = {}; michael@0: do_check_true(svc.mapURIToAddonID(uri, val)); michael@0: do_check_eq(val.value, id); michael@0: } michael@0: michael@0: function resetPrefs() { michael@0: Services.prefs.setIntPref("bootstraptest.active_version", -1); michael@0: } michael@0: michael@0: function waitForPref(aPref, aCallback) { michael@0: function prefChanged() { michael@0: Services.prefs.removeObserver(aPref, prefChanged); michael@0: aCallback(); michael@0: } michael@0: Services.prefs.addObserver(aPref, prefChanged, false); michael@0: } michael@0: michael@0: function getActiveVersion() { michael@0: return Services.prefs.getIntPref("bootstraptest.active_version"); michael@0: } michael@0: michael@0: function run_test() { michael@0: do_test_pending(); michael@0: michael@0: resetPrefs(); michael@0: michael@0: run_test_early(); michael@0: } michael@0: michael@0: function run_test_early() { michael@0: startupManager(); michael@0: michael@0: installAllFiles([do_get_addon("test_chromemanifest_1")], function() { michael@0: restartManager(); michael@0: AddonManager.getAddonByID("addon1@tests.mozilla.org", function(addon) { michael@0: let uri = addon.getResourceURI("."); michael@0: let id = addon.id; michael@0: check_mapping(uri, id); michael@0: michael@0: shutdownManager(); michael@0: michael@0: // Force an early call, to check that mappings will get correctly michael@0: // initialized when the manager actually starts up. michael@0: // See bug 957089 michael@0: michael@0: // First force-initialize the XPIProvider. michael@0: let s = Components.utils.import( michael@0: "resource://gre/modules/addons/XPIProvider.jsm", {}); michael@0: michael@0: // Make the early API call. michael@0: do_check_null(s.XPIProvider.mapURIToAddonID(uri)); michael@0: do_check_null(AddonManager.mapURIToAddonID(uri)); michael@0: michael@0: // Actually start up the manager. michael@0: startupManager(false); michael@0: michael@0: // Check that the mapping is there now. michael@0: check_mapping(uri, id); michael@0: do_check_eq(s.XPIProvider.mapURIToAddonID(uri), id); michael@0: michael@0: run_test_nomapping(); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: function run_test_nomapping() { michael@0: do_check_eq(AddonManager.mapURIToAddonID(TestProvider.prototype.uri), null); michael@0: try { michael@0: let svc = Components.classes["@mozilla.org/addons/integration;1"]. michael@0: getService(Components.interfaces.amIAddonManager); michael@0: let val = {}; michael@0: do_check_false(svc.mapURIToAddonID(TestProvider.prototype.uri, val)); michael@0: } michael@0: catch (ex) { michael@0: do_throw(ex); michael@0: } michael@0: michael@0: run_test_1(); michael@0: } michael@0: michael@0: michael@0: // Tests that add-on URIs are mappable after an install michael@0: function run_test_1() { michael@0: prepare_test({ }, [ michael@0: "onNewInstall" michael@0: ]); michael@0: michael@0: AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) { michael@0: ensure_test_completed(); michael@0: michael@0: let addon = install.addon; michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onInstalling", false], michael@0: "onInstalled" michael@0: ] michael@0: }, [ michael@0: "onInstallStarted", michael@0: "onInstallEnded", michael@0: ], function() { michael@0: let uri = addon.getResourceURI("."); michael@0: check_mapping(uri, addon.id); michael@0: michael@0: waitForPref("bootstraptest.active_version", function() { michael@0: run_test_2(uri); michael@0: }); michael@0: }); michael@0: install.install(); michael@0: }); michael@0: } michael@0: michael@0: // Tests that add-on URIs are still mappable, even after the add-on gets michael@0: // disabled in-session. michael@0: function run_test_2(uri) { michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onDisabling", false], michael@0: "onDisabled" michael@0: ] michael@0: }); michael@0: michael@0: b1.userDisabled = true; michael@0: ensure_test_completed(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { michael@0: do_check_true(newb1.userDisabled); michael@0: check_mapping(uri, newb1.id); michael@0: michael@0: do_execute_soon(() => run_test_3(uri)); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that add-on URIs aren't mappable if the add-on was never started in a michael@0: // session michael@0: function run_test_3(uri) { michael@0: restartManager(); michael@0: michael@0: do_check_eq(AddonManager.mapURIToAddonID(uri), null); michael@0: michael@0: run_test_4(); michael@0: } michael@0: michael@0: // Tests that add-on URIs are mappable after a restart + reenable michael@0: function run_test_4() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: prepare_test({ michael@0: "bootstrap1@tests.mozilla.org": [ michael@0: ["onEnabling", false], michael@0: "onEnabled" michael@0: ] michael@0: }); michael@0: michael@0: b1.userDisabled = false; michael@0: ensure_test_completed(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { michael@0: let uri = newb1.getResourceURI("."); michael@0: check_mapping(uri, newb1.id); michael@0: michael@0: do_execute_soon(run_test_5); michael@0: }); michael@0: }); michael@0: } michael@0: michael@0: // Tests that add-on URIs are mappable after a restart michael@0: function run_test_5() { michael@0: restartManager(); michael@0: michael@0: AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { michael@0: let uri = b1.getResourceURI("."); michael@0: check_mapping(uri, b1.id); michael@0: michael@0: do_execute_soon(run_test_invalidarg); michael@0: }); michael@0: } michael@0: michael@0: // Tests that the AddonManager will bail when mapURIToAddonID is called with an michael@0: // invalid argument michael@0: function run_test_invalidarg() { michael@0: restartManager(); michael@0: michael@0: let tests = [undefined, michael@0: null, michael@0: 1, michael@0: "string", michael@0: "chrome://global/content/", michael@0: function() {} michael@0: ]; michael@0: for (var test of tests) { michael@0: try { michael@0: AddonManager.mapURIToAddonID(test); michael@0: throw new Error("Shouldn't be able to map the URI in question"); michael@0: } michael@0: catch (ex if ex.result) { michael@0: do_check_eq(ex.result, Components.results.NS_ERROR_INVALID_ARG); michael@0: } michael@0: catch (ex) { michael@0: do_throw(ex); michael@0: } michael@0: } michael@0: michael@0: run_test_provider(); michael@0: } michael@0: michael@0: // Tests that custom providers are correctly handled michael@0: function run_test_provider() { michael@0: restartManager(); michael@0: michael@0: const provider = new TestProvider(Components.results.NS_ERROR_NOT_AVAILABLE); michael@0: AddonManagerPrivate.registerProvider(provider); michael@0: michael@0: check_mapping(provider.uri, provider.id); michael@0: michael@0: let u2 = provider.uri.clone(); michael@0: u2.path = "notmapped"; michael@0: do_check_eq(AddonManager.mapURIToAddonID(u2), null); michael@0: michael@0: AddonManagerPrivate.unregisterProvider(provider); michael@0: michael@0: run_test_provider_nomap(); michael@0: } michael@0: michael@0: // Tests that custom providers are correctly handled, even not implementing michael@0: // mapURIToAddonID michael@0: function run_test_provider_nomap() { michael@0: restartManager(); michael@0: michael@0: const provider = new TestProviderNoMap(); michael@0: AddonManagerPrivate.registerProvider(provider); michael@0: michael@0: do_check_eq(AddonManager.mapURIToAddonID(TestProvider.prototype.uri), null); michael@0: michael@0: AddonManagerPrivate.unregisterProvider(provider); michael@0: michael@0: do_test_finished(); michael@0: } michael@0: michael@0: