Bug 796198 - Use the right cookie jar when downloading package and minimanifest for packaged apps - Part 1: move the xhr to Webapps.jsm [r=sicking]

This commit is contained in:
Fabrice Desré 2012-12-10 15:48:59 -08:00
Родитель bfc2a71ade
Коммит c3dabcbd2b
2 изменённых файлов: 153 добавлений и 128 удалений

Просмотреть файл

@ -34,14 +34,6 @@ function WebappsRegistry() {
WebappsRegistry.prototype = {
__proto__: DOMRequestIpcHelper.prototype,
// Hosted apps can't be trusted or certified, so just check that the
// manifest doesn't ask for those.
checkAppStatus: function(aManifest) {
let manifestStatus = aManifest.type || "web";
return (Services.prefs.getBoolPref("dom.mozApps.dev_mode") ||
manifestStatus === "web");
},
receiveMessage: function(aMessage) {
let msg = aMessage.json;
if (msg.oid != this._id)
@ -96,66 +88,27 @@ WebappsRegistry.prototype = {
this._validateScheme(aURL);
let installURL = this._window.location.href;
let installOrigin = this._getOrigin(installURL);
let request = this.createRequest();
let requestID = this.getRequestId(request);
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
xhr.open("GET", aURL, true);
xhr.channel.loadFlags |= Ci.nsIRequest.VALIDATE_ALWAYS;
let receipts = (aParams && aParams.receipts &&
Array.isArray(aParams.receipts)) ? aParams.receipts
: [];
let categories = (aParams && aParams.categories &&
Array.isArray(aParams.categories)) ? aParams.categories
: [];
xhr.addEventListener("load", (function() {
if (xhr.status == 200) {
if (!AppsUtils.checkManifestContentType(installOrigin, this._getOrigin(aURL),
xhr.getResponseHeader("content-type"))) {
Services.DOMRequest.fireError(request, "INVALID_MANIFEST");
return;
}
let manifest;
try {
manifest = JSON.parse(xhr.responseText, installOrigin);
} catch (e) {
Services.DOMRequest.fireError(request, "MANIFEST_PARSE_ERROR");
Cu.reportError("Error installing app from: " + installOrigin + ": " + "MANIFEST_PARSE_ERROR");
return;
}
if (!AppsUtils.checkManifest(manifest)) {
Services.DOMRequest.fireError(request, "INVALID_MANIFEST");
Cu.reportError("Error installing app from: " + installOrigin + ": " + "INVALID_MANIFEST");
} else if (!AppsUtils.checkInstallAllowed(manifest, installOrigin)) {
Services.DOMRequest.fireError(request, "INSTALL_FROM_DENIED");
Cu.reportError("Error installing app from: " + installOrigin + ": " + "INSTALL_FROM_DENIED");
} else if (!this.checkAppStatus(manifest)) {
Services.DOMRequest.fireError(request, "INVALID_SECURITY_LEVEL");
Cu.reportError("Error installing app, '" + manifest.name + "': " + "INVALID_SECURITY_LEVEL");
} else {
let receipts = (aParams && aParams.receipts && Array.isArray(aParams.receipts)) ? aParams.receipts : [];
let categories = (aParams && aParams.categories && Array.isArray(aParams.categories)) ? aParams.categories : [];
let etag = xhr.getResponseHeader("Etag");
cpmm.sendAsyncMessage("Webapps:Install", { app: { installOrigin: installOrigin,
origin: this._getOrigin(aURL),
manifestURL: aURL,
manifest: manifest,
etag: etag,
receipts: receipts,
categories: categories },
from: installURL,
oid: this._id,
requestID: requestID });
}
} else {
Services.DOMRequest.fireError(request, "MANIFEST_URL_ERROR");
Cu.reportError("Error installing app from: " + installOrigin + ": " + "MANIFEST_URL_ERROR");
}
}).bind(this), false);
xhr.addEventListener("error", (function() {
Services.DOMRequest.fireError(request, "NETWORK_ERROR");
Cu.reportError("Error installing app from: " + installOrigin + ": " + "NETWORK_ERROR");
}).bind(this), false);
xhr.send(null);
cpmm.sendAsyncMessage("Webapps:Install",
{ app: {
installOrigin: this._getOrigin(installURL),
origin: this._getOrigin(aURL),
manifestURL: aURL,
receipts: receipts,
categories: categories
},
from: installURL,
oid: this._id,
requestID: requestID
});
return request;
},
@ -203,73 +156,31 @@ WebappsRegistry.prototype = {
// mozIDOMApplicationRegistry2 implementation
installPackage: function(aURL, aParams) {
let installURL = this._window.location.href;
let installOrigin = this._getOrigin(installURL);
this._validateScheme(aURL);
let installURL = this._window.location.href;
let request = this.createRequest();
let requestID = this.getRequestId(request);
let receipts = (aParams && aParams.receipts &&
Array.isArray(aParams.receipts)) ? aParams.receipts : [];
Array.isArray(aParams.receipts)) ? aParams.receipts
: [];
let categories = (aParams && aParams.categories &&
Array.isArray(aParams.categories)) ? aParams.categories : [];
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
xhr.open("GET", aURL, true);
xhr.channel.loadFlags |= Ci.nsIRequest.VALIDATE_ALWAYS;
Array.isArray(aParams.categories)) ? aParams.categories
: [];
xhr.addEventListener("load", (function() {
if (xhr.status == 200) {
if (!AppsUtils.checkManifestContentType(installOrigin, this._getOrigin(aURL),
xhr.getResponseHeader("content-type"))) {
Services.DOMRequest.fireError(request, "INVALID_MANIFEST");
return;
}
let manifest;
try {
manifest = JSON.parse(xhr.responseText, installOrigin);
} catch(e) {
Services.DOMRequest.fireError(request, "MANIFEST_PARSE_ERROR");
return;
}
if (!(AppsUtils.checkManifest(manifest) &&
manifest.package_path)) {
Services.DOMRequest.fireError(request, "INVALID_MANIFEST");
} else if (!AppsUtils.checkInstallAllowed(manifest, installOrigin)) {
Services.DOMRequest.fireError(request, "INSTALL_FROM_DENIED");
} else {
if (!this.checkAppStatus(manifest)) {
Services.DOMRequest.fireError(request, "INVALID_SECURITY_LEVEL");
} else {
let receipts = (aParams && aParams.receipts && Array.isArray(aParams.receipts)) ? aParams.receipts : [];
let categories = (aParams && aParams.categories && Array.isArray(aParams.categories)) ? aParams.categories : [];
let etag = xhr.getResponseHeader("Etag");
cpmm.sendAsyncMessage("Webapps:InstallPackage", { app: {
installOrigin: installOrigin,
origin: this._getOrigin(aURL),
manifestURL: aURL,
updateManifest: manifest,
etag: etag,
receipts: receipts,
categories: categories },
from: installURL,
oid: this._id,
requestID: requestID,
isPackage: true });
}
}
}
else {
Services.DOMRequest.fireError(request, "MANIFEST_URL_ERROR");
}
}).bind(this), false);
xhr.addEventListener("error", (function() {
Services.DOMRequest.fireError(request, "NETWORK_ERROR");
}).bind(this), false);
xhr.send(null);
cpmm.sendAsyncMessage("Webapps:InstallPackage",
{ app: {
installOrigin: this._getOrigin(installURL),
origin: this._getOrigin(aURL),
manifestURL: aURL,
receipts: receipts,
categories: categories
},
from: installURL,
oid: this._id,
requestID: requestID,
isPackage: true
});
return request;
},

Просмотреть файл

@ -734,7 +734,8 @@ this.DOMApplicationRegistry = {
switch (aMessage.name) {
case "Webapps:Install":
// always ask for UI to install
Services.obs.notifyObservers(mm, "webapps-ask-install", JSON.stringify(msg));
this.doInstall(msg, mm);
//Services.obs.notifyObservers(mm, "webapps-ask-install", JSON.stringify(msg));
break;
case "Webapps:GetSelf":
this.getSelf(msg, mm);
@ -761,8 +762,7 @@ this.DOMApplicationRegistry = {
mm.sendAsyncMessage("Webapps:GetAll:Return:KO", msg);
break;
case "Webapps:InstallPackage":
// always ask for UI to install
Services.obs.notifyObservers(mm, "webapps-ask-install", JSON.stringify(msg));
this.doInstallPackage(msg, mm);
break;
case "Webapps:GetBasePath":
return this.webapps[msg.id].basePath;
@ -1205,6 +1205,120 @@ this.DOMApplicationRegistry = {
xhr.send(null);
},
// Downloads the manifest and run checks, then eventually triggers the
// installation UI.
doInstall: function doInstall(aData, aMm) {
let sendError = function sendError(aError) {
aData.error = aError;
aMm.sendAsyncMessage("Webapps:Install:Return:KO", aData);
Cu.reportError("Error installing app from: " + app.installOrigin +
": " + aError);
}.bind(this);
// Hosted apps can't be trusted or certified, so just check that the
// manifest doesn't ask for those.
function checkAppStatus(aManifest) {
let manifestStatus = aManifest.type || "web";
return (Services.prefs.getBoolPref("dom.mozApps.dev_mode") ||
manifestStatus === "web");
}
let app = aData.app;
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Ci.nsIXMLHttpRequest);
xhr.open("GET", app.manifestURL, true);
xhr.channel.loadFlags |= Ci.nsIRequest.VALIDATE_ALWAYS;
xhr.responseType = "json";
xhr.addEventListener("load", (function() {
if (xhr.status == 200) {
if (!AppsUtils.checkManifestContentType(app.installOrigin, app.origin,
xhr.getResponseHeader("content-type"))) {
sendError("INVALID_MANIFEST");
return;
}
app.manifest = xhr.response;
if (!app.manifest) {
sendError("MANIFEST_PARSE_ERROR");
return;
}
if (!AppsUtils.checkManifest(app.manifest)) {
sendError("INVALID_MANIFEST");
} else if (!AppsUtils.checkInstallAllowed(app.manifest, app.installOrigin)) {
sendError("INSTALL_FROM_DENIED");
} else if (!checkAppStatus(app.manifest)) {
sendError("INVALID_SECURITY_LEVEL");
} else {
app.etag = xhr.getResponseHeader("Etag");
Services.obs.notifyObservers(aMm, "webapps-ask-install",
JSON.stringify(aData));
}
} else {
sendError("MANIFEST_URL_ERROR");
}
}).bind(this), false);
xhr.addEventListener("error", (function() {
sendError("NETWORK_ERROR");
}).bind(this), false);
xhr.send(null);
},
doInstallPackage: function doInstallPackage(aData, aMm) {
let sendError = function sendError(aError) {
aData.error = aError;
aMm.sendAsyncMessage("Webapps:Install:Return:KO", aData);
Cu.reportError("Error installing packaged app from: " +
app.installOrigin + ": " + aError);
}.bind(this);
let app = aData.app;
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Ci.nsIXMLHttpRequest);
xhr.open("GET", app.manifestURL, true);
xhr.channel.loadFlags |= Ci.nsIRequest.VALIDATE_ALWAYS;
xhr.responseType = "json";
xhr.addEventListener("load", (function() {
if (xhr.status == 200) {
if (!AppsUtils.checkManifestContentType(app.installOrigin, app.origin,
xhr.getResponseHeader("content-type"))) {
sendError("INVALID_MANIFEST");
return;
}
let manifest = app.updateManifest = xhr.response;
if (!manifest) {
sendError("MANIFEST_PARSE_ERROR");
return;
}
if (!(AppsUtils.checkManifest(manifest) &&
manifest.package_path)) {
sendError("INVALID_MANIFEST");
} else if (!AppsUtils.checkInstallAllowed(manifest, app.installOrigin)) {
sendError("INSTALL_FROM_DENIED");
} else {
app.etag = xhr.getResponseHeader("Etag");
Services.obs.notifyObservers(aMm, "webapps-ask-install",
JSON.stringify(aData));
}
}
else {
sendError("MANIFEST_URL_ERROR");
}
}).bind(this), false);
xhr.addEventListener("error", (function() {
sendError("NETWORK_ERROR");
}).bind(this), false);
xhr.send(null);
},
denyInstall: function(aData) {
let packageId = aData.app.packageId;
if (packageId) {