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

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/
     3  */
     5 // This verifies that add-ons URIs can be mapped to add-on IDs
     6 //
     7 Components.utils.import("resource://gre/modules/Services.jsm");
     9 // Enable loading extensions from the user scopes
    10 Services.prefs.setIntPref("extensions.enabledScopes",
    11                           AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_USER);
    13 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
    15 const profileDir = gProfD.clone();
    16 profileDir.append("extensions");
    17 const userExtDir = gProfD.clone();
    18 userExtDir.append("extensions2");
    19 userExtDir.append(gAppInfo.ID);
    20 registerDirectory("XREUSysExt", userExtDir.parent);
    22 function TestProvider(result) {
    23   this.result = result;
    24 }
    25 TestProvider.prototype = {
    26   uri: Services.io.newURI("hellow://world", null, null),
    27   id: "valid@id",
    28   startup: function() {},
    29   shutdown: function() {},
    30   mapURIToAddonID: function(aURI) {
    31     if (aURI.spec === this.uri.spec) {
    32       return this.id;
    33     }
    34     throw Components.Exception("Not mapped", result);
    35   }
    36 };
    38 function TestProviderNoMap() {}
    39 TestProviderNoMap.prototype = {
    40   startup: function() {},
    41   shutdown: function() {}
    42 };
    44 function check_mapping(uri, id) {
    45   do_check_eq(AddonManager.mapURIToAddonID(uri), id);
    46   let svc = Components.classes["@mozilla.org/addons/integration;1"].
    47             getService(Components.interfaces.amIAddonManager);
    48   let val = {};
    49   do_check_true(svc.mapURIToAddonID(uri, val));
    50   do_check_eq(val.value, id);
    51 }
    53 function resetPrefs() {
    54   Services.prefs.setIntPref("bootstraptest.active_version", -1);
    55 }
    57 function waitForPref(aPref, aCallback) {
    58   function prefChanged() {
    59     Services.prefs.removeObserver(aPref, prefChanged);
    60     aCallback();
    61   }
    62   Services.prefs.addObserver(aPref, prefChanged, false);
    63 }
    65 function getActiveVersion() {
    66   return Services.prefs.getIntPref("bootstraptest.active_version");
    67 }
    69 function run_test() {
    70   do_test_pending();
    72   resetPrefs();
    74   run_test_early();
    75 }
    77 function run_test_early() {
    78   startupManager();
    80   installAllFiles([do_get_addon("test_chromemanifest_1")], function() {
    81     restartManager();
    82     AddonManager.getAddonByID("addon1@tests.mozilla.org", function(addon) {
    83       let uri = addon.getResourceURI(".");
    84       let id = addon.id;
    85       check_mapping(uri, id);
    87       shutdownManager();
    89       // Force an early call, to check that mappings will get correctly
    90       // initialized when the manager actually starts up.
    91       // See bug 957089
    93       // First force-initialize the XPIProvider.
    94       let s = Components.utils.import(
    95         "resource://gre/modules/addons/XPIProvider.jsm", {});
    97       // Make the early API call.
    98       do_check_null(s.XPIProvider.mapURIToAddonID(uri));
    99       do_check_null(AddonManager.mapURIToAddonID(uri));
   101       // Actually start up the manager.
   102       startupManager(false);
   104       // Check that the mapping is there now.
   105       check_mapping(uri, id);
   106       do_check_eq(s.XPIProvider.mapURIToAddonID(uri), id);
   108       run_test_nomapping();
   109     });
   110   });
   111 }
   113 function run_test_nomapping() {
   114   do_check_eq(AddonManager.mapURIToAddonID(TestProvider.prototype.uri), null);
   115   try {
   116     let svc = Components.classes["@mozilla.org/addons/integration;1"].
   117               getService(Components.interfaces.amIAddonManager);
   118     let val = {};
   119     do_check_false(svc.mapURIToAddonID(TestProvider.prototype.uri, val));
   120   }
   121   catch (ex) {
   122     do_throw(ex);
   123   }
   125   run_test_1();
   126 }
   129 // Tests that add-on URIs are mappable after an install
   130 function run_test_1() {
   131   prepare_test({ }, [
   132     "onNewInstall"
   133   ]);
   135   AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), function(install) {
   136     ensure_test_completed();
   138     let addon = install.addon;
   139     prepare_test({
   140       "bootstrap1@tests.mozilla.org": [
   141         ["onInstalling", false],
   142         "onInstalled"
   143       ]
   144     }, [
   145       "onInstallStarted",
   146       "onInstallEnded",
   147     ], function() {
   148       let uri = addon.getResourceURI(".");
   149       check_mapping(uri, addon.id);
   151       waitForPref("bootstraptest.active_version", function() {
   152         run_test_2(uri);
   153       });
   154     });
   155     install.install();
   156   });
   157 }
   159 // Tests that add-on URIs are still mappable, even after the add-on gets
   160 // disabled in-session.
   161 function run_test_2(uri) {
   162   AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
   163     prepare_test({
   164       "bootstrap1@tests.mozilla.org": [
   165         ["onDisabling", false],
   166         "onDisabled"
   167       ]
   168     });
   170     b1.userDisabled = true;
   171     ensure_test_completed();
   173     AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) {
   174       do_check_true(newb1.userDisabled);
   175       check_mapping(uri, newb1.id);
   177       do_execute_soon(() => run_test_3(uri));
   178     });
   179   });
   180 }
   182 // Tests that add-on URIs aren't mappable if the add-on was never started in a
   183 // session
   184 function run_test_3(uri) {
   185   restartManager();
   187   do_check_eq(AddonManager.mapURIToAddonID(uri), null);
   189   run_test_4();
   190 }
   192 // Tests that add-on URIs are mappable after a restart + reenable
   193 function run_test_4() {
   194   restartManager();
   196   AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
   197     prepare_test({
   198       "bootstrap1@tests.mozilla.org": [
   199         ["onEnabling", false],
   200         "onEnabled"
   201       ]
   202     });
   204     b1.userDisabled = false;
   205     ensure_test_completed();
   207     AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(newb1) {
   208       let uri = newb1.getResourceURI(".");
   209       check_mapping(uri, newb1.id);
   211       do_execute_soon(run_test_5);
   212     });
   213   });
   214 }
   216 // Tests that add-on URIs are mappable after a restart
   217 function run_test_5() {
   218   restartManager();
   220   AddonManager.getAddonByID("bootstrap1@tests.mozilla.org", function(b1) {
   221     let uri = b1.getResourceURI(".");
   222     check_mapping(uri, b1.id);
   224     do_execute_soon(run_test_invalidarg);
   225   });
   226 }
   228 // Tests that the AddonManager will bail when mapURIToAddonID is called with an
   229 // invalid argument
   230 function run_test_invalidarg() {
   231   restartManager();
   233   let tests = [undefined,
   234                null,
   235                1,
   236                "string",
   237                "chrome://global/content/",
   238                function() {}
   239                ];
   240   for (var test of tests) {
   241     try {
   242       AddonManager.mapURIToAddonID(test);
   243       throw new Error("Shouldn't be able to map the URI in question");
   244     }
   245     catch (ex if ex.result) {
   246       do_check_eq(ex.result, Components.results.NS_ERROR_INVALID_ARG);
   247     }
   248     catch (ex) {
   249       do_throw(ex);
   250     }
   251   }
   253   run_test_provider();
   254 }
   256 // Tests that custom providers are correctly handled
   257 function run_test_provider() {
   258   restartManager();
   260   const provider = new TestProvider(Components.results.NS_ERROR_NOT_AVAILABLE);
   261   AddonManagerPrivate.registerProvider(provider);
   263   check_mapping(provider.uri, provider.id);
   265   let u2 = provider.uri.clone();
   266   u2.path = "notmapped";
   267   do_check_eq(AddonManager.mapURIToAddonID(u2), null);
   269   AddonManagerPrivate.unregisterProvider(provider);
   271   run_test_provider_nomap();
   272 }
   274 // Tests that custom providers are correctly handled, even not implementing
   275 // mapURIToAddonID
   276 function run_test_provider_nomap() {
   277   restartManager();
   279   const provider = new TestProviderNoMap();
   280   AddonManagerPrivate.registerProvider(provider);
   282   do_check_eq(AddonManager.mapURIToAddonID(TestProvider.prototype.uri), null);
   284   AddonManagerPrivate.unregisterProvider(provider);
   286   do_test_finished();
   287 }

mercurial