Wed, 31 Dec 2014 06:09:35 +0100
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 const PFS_NS = "http://www.mozilla.org/2004/pfs-rdf#";
7 function nsRDFItemUpdater(aClientOS, aChromeLocale) {
8 this._rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
9 .getService(Components.interfaces.nsIRDFService);
10 this._os = Components.classes["@mozilla.org/observer-service;1"]
11 .getService(Components.interfaces.nsIObserverService);
13 var app = Components.classes["@mozilla.org/xre/app-info;1"]
14 .getService(Components.interfaces.nsIXULAppInfo);
15 this.appID = app.ID;
16 this.buildID = app.platformBuildID;
17 this.appRelease = app.version;
19 this.clientOS = aClientOS;
20 this.chromeLocale = aChromeLocale;
22 var prefBranch = Components.classes["@mozilla.org/preferences-service;1"]
23 .getService(Components.interfaces.nsIPrefBranch);
24 this.dsURI = prefBranch.getCharPref("pfs.datasource.url");
25 }
27 nsRDFItemUpdater.prototype = {
28 checkForPlugin: function (aPluginRequestItem) {
29 var dsURI = this.dsURI;
30 // escape the mimetype as mimetypes can contain '+', which will break pfs.
31 dsURI = dsURI.replace(/%PLUGIN_MIMETYPE%/g, encodeURIComponent(aPluginRequestItem.mimetype));
32 dsURI = dsURI.replace(/%APP_ID%/g, this.appID);
33 dsURI = dsURI.replace(/%APP_VERSION%/g, this.buildID);
34 dsURI = dsURI.replace(/%APP_RELEASE%/g, this.appRelease);
35 dsURI = dsURI.replace(/%CLIENT_OS%/g, this.clientOS);
36 dsURI = dsURI.replace(/%CHROME_LOCALE%/g, this.chromeLocale);
38 var ds = this._rdfService.GetDataSource(dsURI);
39 var rds = ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource)
40 if (rds.loaded)
41 this.onDatasourceLoaded(ds, aPluginRequestItem);
42 else {
43 var sink = ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
44 sink.addXMLSinkObserver(new nsPluginXMLRDFDSObserver(this, aPluginRequestItem));
45 }
46 },
48 onDatasourceLoaded: function pfs_onDatasourceLoaded (aDatasource, aPluginRequestItem) {
49 var container = Components.classes["@mozilla.org/rdf/container;1"]
50 .createInstance(Components.interfaces.nsIRDFContainer);
51 var resultRes = this._rdfService.GetResource("urn:mozilla:plugin-results:" + aPluginRequestItem.mimetype);
52 var pluginList = aDatasource.GetTarget(resultRes, this._rdfService.GetResource(PFS_NS+"plugins"), true);
54 var pluginInfo = null;
56 try {
57 container.Init(aDatasource, pluginList);
59 var children = container.GetElements();
60 var target;
62 // get the first item
63 var child = children.getNext();
64 if (child instanceof Components.interfaces.nsIRDFResource) {
65 var name = this._rdfService.GetResource("http://www.mozilla.org/2004/pfs-rdf#updates");
66 target = aDatasource.GetTarget(child, name, true);
67 }
69 try {
70 container.Init(aDatasource, target);
71 target = null;
72 children = container.GetElements();
74 var child = children.getNext();
75 if (child instanceof Components.interfaces.nsIRDFResource) {
76 target = child;
77 }
79 var rdfs = this._rdfService;
81 function getPFSValueFromRDF(aValue) {
82 var rv = null;
84 var myTarget = aDatasource.GetTarget(target, rdfs.GetResource(PFS_NS + aValue), true);
85 if (myTarget)
86 rv = myTarget.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
88 return rv;
89 }
91 pluginInfo = {
92 name: getPFSValueFromRDF("name"),
93 pid: getPFSValueFromRDF("guid"),
94 version: getPFSValueFromRDF("version"),
95 IconUrl: getPFSValueFromRDF("IconUrl"),
96 InstallerLocation: getPFSValueFromRDF("InstallerLocation"),
97 InstallerHash: getPFSValueFromRDF("InstallerHash"),
98 XPILocation: getPFSValueFromRDF("XPILocation"),
99 XPIHash: getPFSValueFromRDF("XPIHash"),
100 InstallerShowsUI: getPFSValueFromRDF("InstallerShowsUI"),
101 manualInstallationURL: getPFSValueFromRDF("manualInstallationURL"),
102 requestedMimetype: getPFSValueFromRDF("requestedMimetype"),
103 licenseURL: getPFSValueFromRDF("licenseURL"),
104 needsRestart: getPFSValueFromRDF("needsRestart")
105 };
106 }
107 catch (ex) {
108 Components.utils.reportError(ex);
109 }
110 }
111 catch (ex) {
112 Components.utils.reportError(ex);
113 }
115 gPluginInstaller.pluginInfoReceived(aPluginRequestItem, pluginInfo);
116 },
118 onDatasourceError: function pfs_onDatasourceError (aPluginRequestItem, aError) {
119 this._os.notifyObservers(aPluginRequestItem, "error", aError);
120 Components.utils.reportError(aError);
121 gPluginInstaller.pluginInfoReceived(aPluginRequestItem, null);
122 }
123 };
125 function nsPluginXMLRDFDSObserver(aUpdater, aPluginRequestItem) {
126 this._updater = aUpdater;
127 this._item = aPluginRequestItem;
128 }
130 nsPluginXMLRDFDSObserver.prototype =
131 {
132 _updater : null,
133 _item : null,
135 // nsIRDFXMLSinkObserver
136 onBeginLoad: function(aSink) {},
137 onInterrupt: function(aSink) {},
138 onResume: function(aSink) {},
139 onEndLoad: function(aSink) {
140 aSink.removeXMLSinkObserver(this);
142 var ds = aSink.QueryInterface(Components.interfaces.nsIRDFDataSource);
143 this._updater.onDatasourceLoaded(ds, this._item);
144 },
146 onError: function(aSink, aStatus, aErrorMsg) {
147 aSink.removeXMLSinkObserver(this);
148 this._updater.onDatasourceError(this._item, aStatus.toString());
149 }
150 };