1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_mapURIToAddonID.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,289 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +// This verifies that add-ons URIs can be mapped to add-on IDs 1.9 +// 1.10 +Components.utils.import("resource://gre/modules/Services.jsm"); 1.11 + 1.12 +// Enable loading extensions from the user scopes 1.13 +Services.prefs.setIntPref("extensions.enabledScopes", 1.14 + AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER); 1.15 + 1.16 +createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.17 + 1.18 +const profileDir = gProfD.clone(); 1.19 +profileDir.append("extensions"); 1.20 +const userExtDir = gProfD.clone(); 1.21 +userExtDir.append("extensions2"); 1.22 +userExtDir.append(gAppInfo.ID); 1.23 +registerDirectory("XREUSysExt", userExtDir.parent); 1.24 + 1.25 +function TestProvider(result) { 1.26 + this.result = result; 1.27 +} 1.28 +TestProvider.prototype = { 1.29 + uri: Services.io.newURI("hellow://world", null, null), 1.30 + id: "valid@id", 1.31 + startup: function() {}, 1.32 + shutdown: function() {}, 1.33 + mapURIToAddonID: function(aURI) { 1.34 + if (aURI.spec === this.uri.spec) { 1.35 + return this.id; 1.36 + } 1.37 + throw Components.Exception("Not mapped", result); 1.38 + } 1.39 +}; 1.40 + 1.41 +function TestProviderNoMap() {} 1.42 +TestProviderNoMap.prototype = { 1.43 + startup: function() {}, 1.44 + shutdown: function() {} 1.45 +}; 1.46 + 1.47 +function check_mapping(uri, id) { 1.48 + do_check_eq(AddonManager.mapURIToAddonID(uri), id); 1.49 + let svc = Components.classes["@mozilla.org/addons/integration;1"]. 1.50 + getService(Components.interfaces.amIAddonManager); 1.51 + let val = {}; 1.52 + do_check_true(svc.mapURIToAddonID(uri, val)); 1.53 + do_check_eq(val.value, id); 1.54 +} 1.55 + 1.56 +function resetPrefs() { 1.57 + Services.prefs.setIntPref("bootstraptest.active_version", -1); 1.58 +} 1.59 + 1.60 +function waitForPref(aPref, aCallback) { 1.61 + function prefChanged() { 1.62 + Services.prefs.removeObserver(aPref, prefChanged); 1.63 + aCallback(); 1.64 + } 1.65 + Services.prefs.addObserver(aPref, prefChanged, false); 1.66 +} 1.67 + 1.68 +function getActiveVersion() { 1.69 + return Services.prefs.getIntPref("bootstraptest.active_version"); 1.70 +} 1.71 + 1.72 +function run_test() { 1.73 + do_test_pending(); 1.74 + 1.75 + resetPrefs(); 1.76 + 1.77 + run_test_early(); 1.78 +} 1.79 + 1.80 +function run_test_early() { 1.81 + startupManager(); 1.82 + 1.83 + installAllFiles([do_get_addon("test_chromemanifest_1")], function() { 1.84 + restartManager(); 1.85 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(addon) { 1.86 + let uri = addon.getResourceURI("."); 1.87 + let id = addon.id; 1.88 + check_mapping(uri, id); 1.89 + 1.90 + shutdownManager(); 1.91 + 1.92 + // Force an early call, to check that mappings will get correctly 1.93 + // initialized when the manager actually starts up. 1.94 + // See bug 957089 1.95 + 1.96 + // First force-initialize the XPIProvider. 1.97 + let s = Components.utils.import( 1.98 + "resource://gre/modules/addons/XPIProvider.jsm", {}); 1.99 + 1.100 + // Make the early API call. 1.101 + do_check_null(s.XPIProvider.mapURIToAddonID(uri)); 1.102 + do_check_null(AddonManager.mapURIToAddonID(uri)); 1.103 + 1.104 + // Actually start up the manager. 1.105 + startupManager(false); 1.106 + 1.107 + // Check that the mapping is there now. 1.108 + check_mapping(uri, id); 1.109 + do_check_eq(s.XPIProvider.mapURIToAddonID(uri), id); 1.110 + 1.111 + run_test_nomapping(); 1.112 + }); 1.113 + }); 1.114 +} 1.115 + 1.116 +function run_test_nomapping() { 1.117 + do_check_eq(AddonManager.mapURIToAddonID(TestProvider.prototype.uri), null); 1.118 + try { 1.119 + let svc = Components.classes["@mozilla.org/addons/integration;1"]. 1.120 + getService(Components.interfaces.amIAddonManager); 1.121 + let val = {}; 1.122 + do_check_false(svc.mapURIToAddonID(TestProvider.prototype.uri, val)); 1.123 + } 1.124 + catch (ex) { 1.125 + do_throw(ex); 1.126 + } 1.127 + 1.128 + run_test_1(); 1.129 +} 1.130 + 1.131 + 1.132 +// Tests that add-on URIs are mappable after an install 1.133 +function run_test_1() { 1.134 + prepare_test({ }, [ 1.135 + "onNewInstall" 1.136 + ]); 1.137 + 1.138 + AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) { 1.139 + ensure_test_completed(); 1.140 + 1.141 + let addon = install.addon; 1.142 + prepare_test({ 1.143 + "bootstrap1@tests.mozilla.org": [ 1.144 + ["onInstalling", false], 1.145 + "onInstalled" 1.146 + ] 1.147 + }, [ 1.148 + "onInstallStarted", 1.149 + "onInstallEnded", 1.150 + ], function() { 1.151 + let uri = addon.getResourceURI("."); 1.152 + check_mapping(uri, addon.id); 1.153 + 1.154 + waitForPref("bootstraptest.active_version", function() { 1.155 + run_test_2(uri); 1.156 + }); 1.157 + }); 1.158 + install.install(); 1.159 + }); 1.160 +} 1.161 + 1.162 +// Tests that add-on URIs are still mappable, even after the add-on gets 1.163 +// disabled in-session. 1.164 +function run_test_2(uri) { 1.165 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.166 + prepare_test({ 1.167 + "bootstrap1@tests.mozilla.org": [ 1.168 + ["onDisabling", false], 1.169 + "onDisabled" 1.170 + ] 1.171 + }); 1.172 + 1.173 + b1.userDisabled = true; 1.174 + ensure_test_completed(); 1.175 + 1.176 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { 1.177 + do_check_true(newb1.userDisabled); 1.178 + check_mapping(uri, newb1.id); 1.179 + 1.180 + do_execute_soon(() => run_test_3(uri)); 1.181 + }); 1.182 + }); 1.183 +} 1.184 + 1.185 +// Tests that add-on URIs aren't mappable if the add-on was never started in a 1.186 +// session 1.187 +function run_test_3(uri) { 1.188 + restartManager(); 1.189 + 1.190 + do_check_eq(AddonManager.mapURIToAddonID(uri), null); 1.191 + 1.192 + run_test_4(); 1.193 +} 1.194 + 1.195 +// Tests that add-on URIs are mappable after a restart + reenable 1.196 +function run_test_4() { 1.197 + restartManager(); 1.198 + 1.199 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.200 + prepare_test({ 1.201 + "bootstrap1@tests.mozilla.org": [ 1.202 + ["onEnabling", false], 1.203 + "onEnabled" 1.204 + ] 1.205 + }); 1.206 + 1.207 + b1.userDisabled = false; 1.208 + ensure_test_completed(); 1.209 + 1.210 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) { 1.211 + let uri = newb1.getResourceURI("."); 1.212 + check_mapping(uri, newb1.id); 1.213 + 1.214 + do_execute_soon(run_test_5); 1.215 + }); 1.216 + }); 1.217 +} 1.218 + 1.219 +// Tests that add-on URIs are mappable after a restart 1.220 +function run_test_5() { 1.221 + restartManager(); 1.222 + 1.223 + AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) { 1.224 + let uri = b1.getResourceURI("."); 1.225 + check_mapping(uri, b1.id); 1.226 + 1.227 + do_execute_soon(run_test_invalidarg); 1.228 + }); 1.229 +} 1.230 + 1.231 +// Tests that the AddonManager will bail when mapURIToAddonID is called with an 1.232 +// invalid argument 1.233 +function run_test_invalidarg() { 1.234 + restartManager(); 1.235 + 1.236 + let tests = [undefined, 1.237 + null, 1.238 + 1, 1.239 + "string", 1.240 + "chrome://global/content/", 1.241 + function() {} 1.242 + ]; 1.243 + for (var test of tests) { 1.244 + try { 1.245 + AddonManager.mapURIToAddonID(test); 1.246 + throw new Error("Shouldn't be able to map the URI in question"); 1.247 + } 1.248 + catch (ex if ex.result) { 1.249 + do_check_eq(ex.result, Components.results.NS_ERROR_INVALID_ARG); 1.250 + } 1.251 + catch (ex) { 1.252 + do_throw(ex); 1.253 + } 1.254 + } 1.255 + 1.256 + run_test_provider(); 1.257 +} 1.258 + 1.259 +// Tests that custom providers are correctly handled 1.260 +function run_test_provider() { 1.261 + restartManager(); 1.262 + 1.263 + const provider = new TestProvider(Components.results.NS_ERROR_NOT_AVAILABLE); 1.264 + AddonManagerPrivate.registerProvider(provider); 1.265 + 1.266 + check_mapping(provider.uri, provider.id); 1.267 + 1.268 + let u2 = provider.uri.clone(); 1.269 + u2.path = "notmapped"; 1.270 + do_check_eq(AddonManager.mapURIToAddonID(u2), null); 1.271 + 1.272 + AddonManagerPrivate.unregisterProvider(provider); 1.273 + 1.274 + run_test_provider_nomap(); 1.275 +} 1.276 + 1.277 +// Tests that custom providers are correctly handled, even not implementing 1.278 +// mapURIToAddonID 1.279 +function run_test_provider_nomap() { 1.280 + restartManager(); 1.281 + 1.282 + const provider = new TestProviderNoMap(); 1.283 + AddonManagerPrivate.registerProvider(provider); 1.284 + 1.285 + do_check_eq(AddonManager.mapURIToAddonID(TestProvider.prototype.uri), null); 1.286 + 1.287 + AddonManagerPrivate.unregisterProvider(provider); 1.288 + 1.289 + do_test_finished(); 1.290 +} 1.291 + 1.292 +