toolkit/mozapps/extensions/addonManager.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 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 /**
     6  * This component serves as integration between the platform and AddonManager.
     7  * It is responsible for initializing and shutting down the AddonManager as well
     8  * as passing new installs from webpages to the AddonManager.
     9  */
    11 "use strict";
    13 const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
    15 const PREF_EM_UPDATE_INTERVAL = "extensions.update.interval";
    17 // The old XPInstall error codes
    18 const EXECUTION_ERROR   = -203;
    19 const CANT_READ_ARCHIVE = -207;
    20 const USER_CANCELLED    = -210;
    21 const DOWNLOAD_ERROR    = -228;
    22 const UNSUPPORTED_TYPE  = -244;
    23 const SUCCESS           = 0;
    25 const MSG_INSTALL_ENABLED  = "WebInstallerIsInstallEnabled";
    26 const MSG_INSTALL_ADDONS   = "WebInstallerInstallAddonsFromWebpage";
    27 const MSG_INSTALL_CALLBACK = "WebInstallerInstallCallback";
    29 const CHILD_SCRIPT = "resource://gre/modules/addons/Content.js";
    31 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
    32 Cu.import("resource://gre/modules/Services.jsm");
    34 let gSingleton = null;
    36 let gParentMM = null;
    39 function amManager() {
    40   Cu.import("resource://gre/modules/AddonManager.jsm");
    42   let globalMM = Cc["@mozilla.org/globalmessagemanager;1"]
    43                  .getService(Ci.nsIMessageListenerManager);
    44   globalMM.loadFrameScript(CHILD_SCRIPT, true);
    46   gParentMM = Cc["@mozilla.org/parentprocessmessagemanager;1"]
    47                  .getService(Ci.nsIMessageListenerManager);
    48   gParentMM.addMessageListener(MSG_INSTALL_ENABLED, this);
    49   gParentMM.addMessageListener(MSG_INSTALL_ADDONS, this);
    50 }
    52 amManager.prototype = {
    53   observe: function AMC_observe(aSubject, aTopic, aData) {
    54     if (aTopic == "addons-startup")
    55       AddonManagerPrivate.startup();
    56   },
    58   /**
    59    * @see amIAddonManager.idl
    60    */
    61   mapURIToAddonID: function AMC_mapURIToAddonID(uri, id) {
    62     id.value = AddonManager.mapURIToAddonID(uri);
    63     return !!id.value;
    64   },
    66   /**
    67    * @see amIWebInstaller.idl
    68    */
    69   isInstallEnabled: function AMC_isInstallEnabled(aMimetype, aReferer) {
    70     return AddonManager.isInstallEnabled(aMimetype);
    71   },
    73   /**
    74    * @see amIWebInstaller.idl
    75    */
    76   installAddonsFromWebpage: function AMC_installAddonsFromWebpage(aMimetype,
    77                                                                   aWindow,
    78                                                                   aReferer, aUris,
    79                                                                   aHashes, aNames,
    80                                                                   aIcons, aCallback) {
    81     if (aUris.length == 0)
    82       return false;
    84     let retval = true;
    85     if (!AddonManager.isInstallAllowed(aMimetype, aReferer)) {
    86       aCallback = null;
    87       retval = false;
    88     }
    90     let loadGroup = null;
    92     try {
    93       loadGroup = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
    94                          .getInterface(Ci.nsIWebNavigation)
    95                          .QueryInterface(Ci.nsIDocumentLoader).loadGroup;
    96     }
    97     catch (e) {
    98     }
   100     let installs = [];
   101     function buildNextInstall() {
   102       if (aUris.length == 0) {
   103         AddonManager.installAddonsFromWebpage(aMimetype, aWindow, aReferer, installs);
   104         return;
   105       }
   106       let uri = aUris.shift();
   107       AddonManager.getInstallForURL(uri, function buildNextInstall_getInstallForURL(aInstall) {
   108         function callCallback(aUri, aStatus) {
   109           try {
   110             aCallback.onInstallEnded(aUri, aStatus);
   111           }
   112           catch (e) {
   113             Components.utils.reportError(e);
   114           }
   115         }
   117         if (aInstall) {
   118           installs.push(aInstall);
   119           if (aCallback) {
   120             aInstall.addListener({
   121               onDownloadCancelled: function buildNextInstall_onDownloadCancelled(aInstall) {
   122                 callCallback(uri, USER_CANCELLED);
   123               },
   125               onDownloadFailed: function buildNextInstall_onDownloadFailed(aInstall) {
   126                 if (aInstall.error == AddonManager.ERROR_CORRUPT_FILE)
   127                   callCallback(uri, CANT_READ_ARCHIVE);
   128                 else
   129                   callCallback(uri, DOWNLOAD_ERROR);
   130               },
   132               onInstallFailed: function buildNextInstall_onInstallFailed(aInstall) {
   133                 callCallback(uri, EXECUTION_ERROR);
   134               },
   136               onInstallEnded: function buildNextInstall_onInstallEnded(aInstall, aStatus) {
   137                 callCallback(uri, SUCCESS);
   138               }
   139             });
   140           }
   141         }
   142         else if (aCallback) {
   143           aCallback.onInstallEnded(uri, UNSUPPORTED_TYPE);
   144         }
   145         buildNextInstall();
   146       }, aMimetype, aHashes.shift(), aNames.shift(), aIcons.shift(), null, loadGroup);
   147     }
   148     buildNextInstall();
   150     return retval;
   151   },
   153   notify: function AMC_notify(aTimer) {
   154     AddonManagerPrivate.backgroundUpdateCheck();
   155   },
   157   /**
   158    * messageManager callback function.
   159    *
   160    * Listens to requests from child processes for InstallTrigger
   161    * activity, and sends back callbacks.
   162    */
   163   receiveMessage: function AMC_receiveMessage(aMessage) {
   164     let payload = aMessage.data;
   165     let referer = Services.io.newURI(payload.referer, null, null);
   167     switch (aMessage.name) {
   168       case MSG_INSTALL_ENABLED:
   169         return this.isInstallEnabled(payload.mimetype, referer);
   171       case MSG_INSTALL_ADDONS:
   172         let callback = null;
   173         if (payload.callbackID != -1) {
   174           callback = {
   175             onInstallEnded: function ITP_callback(url, status) {
   176               gParentMM.broadcastAsyncMessage(MSG_INSTALL_CALLBACK, {
   177                 callbackID: payload.callbackID,
   178                 url: url,
   179                 status: status
   180               });
   181             },
   182           };
   183         }
   185         // Should reimplement this properly with Window IDs when possible,
   186         // see bug 596109.
   187         let window = aMessage.objects.win;
   189         return this.installAddonsFromWebpage(payload.mimetype,
   190           window, referer, payload.uris, payload.hashes, payload.names,
   191           payload.icons, callback);
   192     }
   193   },
   195   classID: Components.ID("{4399533d-08d1-458c-a87a-235f74451cfa}"),
   196   _xpcom_factory: {
   197     createInstance: function AMC_createInstance(aOuter, aIid) {
   198       if (aOuter != null)
   199         throw Components.Exception("Component does not support aggregation",
   200                                    Cr.NS_ERROR_NO_AGGREGATION);
   202       if (!gSingleton)
   203         gSingleton = new amManager();
   204       return gSingleton.QueryInterface(aIid);
   205     }
   206   },
   207   QueryInterface: XPCOMUtils.generateQI([Ci.amIAddonManager,
   208                                          Ci.amIWebInstaller,
   209                                          Ci.nsITimerCallback,
   210                                          Ci.nsIObserver,
   211                                          Ci.nsIMessageListener])
   212 };
   214 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([amManager]);

mercurial