toolkit/mozapps/plugins/content/pluginInstallerDatasource.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/toolkit/mozapps/plugins/content/pluginInstallerDatasource.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,150 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +const PFS_NS = "http://www.mozilla.org/2004/pfs-rdf#";
     1.9 +
    1.10 +function nsRDFItemUpdater(aClientOS, aChromeLocale) {
    1.11 +  this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
    1.12 +                               .getService(Components.interfaces.nsIRDFService);
    1.13 +  this._os = Components.classes["@mozilla.org/observer-service;1"]
    1.14 +                       .getService(Components.interfaces.nsIObserverService);
    1.15 +
    1.16 +  var app = Components.classes["@mozilla.org/xre/app-info;1"]
    1.17 +                      .getService(Components.interfaces.nsIXULAppInfo);
    1.18 +  this.appID = app.ID;
    1.19 +  this.buildID = app.platformBuildID;
    1.20 +  this.appRelease = app.version;
    1.21 +
    1.22 +  this.clientOS = aClientOS;
    1.23 +  this.chromeLocale = aChromeLocale;
    1.24 +
    1.25 +  var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
    1.26 +                             .getService(Components.interfaces.nsIPrefBranch);
    1.27 +  this.dsURI = prefBranch.getCharPref("pfs.datasource.url");
    1.28 +}
    1.29 +
    1.30 +nsRDFItemUpdater.prototype = {
    1.31 +  checkForPlugin: function (aPluginRequestItem) {
    1.32 +    var dsURI = this.dsURI;
    1.33 +    // escape the mimetype as mimetypes can contain '+', which will break pfs.
    1.34 +    dsURI = dsURI.replace(/%PLUGIN_MIMETYPE%/g, encodeURIComponent(aPluginRequestItem.mimetype));
    1.35 +    dsURI = dsURI.replace(/%APP_ID%/g, this.appID);
    1.36 +    dsURI = dsURI.replace(/%APP_VERSION%/g, this.buildID);
    1.37 +    dsURI = dsURI.replace(/%APP_RELEASE%/g, this.appRelease);
    1.38 +    dsURI = dsURI.replace(/%CLIENT_OS%/g, this.clientOS);
    1.39 +    dsURI = dsURI.replace(/%CHROME_LOCALE%/g, this.chromeLocale);
    1.40 +
    1.41 +    var ds = this._rdfService.GetDataSource(dsURI);
    1.42 +    var rds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource)
    1.43 +    if (rds.loaded)
    1.44 +      this.onDatasourceLoaded(ds, aPluginRequestItem);
    1.45 +    else {
    1.46 +      var sink = ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
    1.47 +      sink.addXMLSinkObserver(new nsPluginXMLRDFDSObserver(this, aPluginRequestItem));
    1.48 +    }
    1.49 +  },
    1.50 +
    1.51 +  onDatasourceLoaded: function pfs_onDatasourceLoaded (aDatasource, aPluginRequestItem) {
    1.52 +    var container = Components.classes["@mozilla.org/rdf/container;1"]
    1.53 +                              .createInstance(Components.interfaces.nsIRDFContainer);
    1.54 +    var resultRes = this._rdfService.GetResource("urn:mozilla:plugin-results:" + aPluginRequestItem.mimetype);
    1.55 +    var pluginList = aDatasource.GetTarget(resultRes, this._rdfService.GetResource(PFS_NS+"plugins"), true);
    1.56 +
    1.57 +    var pluginInfo = null;
    1.58 +  
    1.59 +    try {
    1.60 +      container.Init(aDatasource, pluginList);
    1.61 +
    1.62 +      var children = container.GetElements();
    1.63 +      var target;
    1.64 +
    1.65 +      // get the first item
    1.66 +      var child = children.getNext();
    1.67 +      if (child instanceof Components.interfaces.nsIRDFResource) {
    1.68 +        var name = this._rdfService.GetResource("http://www.mozilla.org/2004/pfs-rdf#updates");
    1.69 +        target = aDatasource.GetTarget(child, name, true);
    1.70 +      }
    1.71 +
    1.72 +      try {
    1.73 +        container.Init(aDatasource, target);
    1.74 +        target = null;
    1.75 +        children = container.GetElements();
    1.76 +
    1.77 +        var child = children.getNext();
    1.78 +        if (child instanceof Components.interfaces.nsIRDFResource) {
    1.79 +          target = child;
    1.80 +        }
    1.81 +
    1.82 +        var rdfs = this._rdfService;
    1.83 +
    1.84 +        function getPFSValueFromRDF(aValue) {
    1.85 +          var rv = null;
    1.86 +
    1.87 +          var myTarget = aDatasource.GetTarget(target, rdfs.GetResource(PFS_NS + aValue), true);
    1.88 +          if (myTarget)
    1.89 +            rv = myTarget.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
    1.90 +
    1.91 +          return rv;
    1.92 +        }
    1.93 +
    1.94 +        pluginInfo = {
    1.95 +          name: getPFSValueFromRDF("name"),
    1.96 +          pid: getPFSValueFromRDF("guid"),
    1.97 +          version: getPFSValueFromRDF("version"),
    1.98 +          IconUrl: getPFSValueFromRDF("IconUrl"),
    1.99 +          InstallerLocation: getPFSValueFromRDF("InstallerLocation"),
   1.100 +          InstallerHash: getPFSValueFromRDF("InstallerHash"),
   1.101 +          XPILocation: getPFSValueFromRDF("XPILocation"),
   1.102 +          XPIHash: getPFSValueFromRDF("XPIHash"),
   1.103 +          InstallerShowsUI: getPFSValueFromRDF("InstallerShowsUI"),
   1.104 +          manualInstallationURL: getPFSValueFromRDF("manualInstallationURL"),
   1.105 +          requestedMimetype: getPFSValueFromRDF("requestedMimetype"),
   1.106 +          licenseURL: getPFSValueFromRDF("licenseURL"),
   1.107 +          needsRestart: getPFSValueFromRDF("needsRestart")
   1.108 +        };
   1.109 +      }
   1.110 +      catch (ex) {
   1.111 +        Components.utils.reportError(ex);
   1.112 +      }
   1.113 +    }
   1.114 +    catch (ex) {
   1.115 +      Components.utils.reportError(ex);
   1.116 +    }
   1.117 +    
   1.118 +    gPluginInstaller.pluginInfoReceived(aPluginRequestItem, pluginInfo);
   1.119 +  },
   1.120 +
   1.121 +  onDatasourceError: function pfs_onDatasourceError (aPluginRequestItem, aError) {
   1.122 +    this._os.notifyObservers(aPluginRequestItem, "error", aError);
   1.123 +    Components.utils.reportError(aError);
   1.124 +    gPluginInstaller.pluginInfoReceived(aPluginRequestItem, null);
   1.125 +  }
   1.126 +};
   1.127 +
   1.128 +function nsPluginXMLRDFDSObserver(aUpdater, aPluginRequestItem) {
   1.129 +  this._updater = aUpdater;
   1.130 +  this._item    = aPluginRequestItem;
   1.131 +}
   1.132 +
   1.133 +nsPluginXMLRDFDSObserver.prototype = 
   1.134 +{ 
   1.135 +  _updater  : null,
   1.136 +  _item     : null,
   1.137 +
   1.138 +  // nsIRDFXMLSinkObserver
   1.139 +  onBeginLoad: function(aSink) {},
   1.140 +  onInterrupt: function(aSink) {},
   1.141 +  onResume: function(aSink) {},
   1.142 +  onEndLoad: function(aSink) {
   1.143 +    aSink.removeXMLSinkObserver(this);
   1.144 +    
   1.145 +    var ds = aSink.QueryInterface(Components.interfaces.nsIRDFDataSource);
   1.146 +    this._updater.onDatasourceLoaded(ds, this._item);
   1.147 +  },
   1.148 +  
   1.149 +  onError: function(aSink, aStatus, aErrorMsg) {  
   1.150 +    aSink.removeXMLSinkObserver(this);   
   1.151 +    this._updater.onDatasourceError(this._item, aStatus.toString());
   1.152 +  }
   1.153 +};

mercurial