Files
palemoon27/toolkit/mozapps/extensions/test/xpcshell/test_mapURIToAddonID.js
T

327 lines
8.1 KiB
JavaScript

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