toolkit/mozapps/extensions/test/xpcshell/test_mapURIToAddonID.js

changeset 0
6474c204b198
     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 +

mercurial