gecko-dev/b2g/components/Bootstraper.jsm
2016-11-17 12:08:13 -05:00

126 lines
3.7 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
this.EXPORTED_SYMBOLS = ["Bootstraper"];
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const CC = Components.Constructor;
Cu.import("resource://gre/modules/Services.jsm");
function debug(aMsg) {
//dump("-*- Bootstraper: " + aMsg + "\n");
}
/**
* This module loads the manifest for app from the --start-url enpoint and
* ensures that it's installed as the system app.
*/
this.Bootstraper = {
_manifestURL: null,
bailout: function(aMsg) {
dump("************************************************************\n");
dump("* /!\\ " + aMsg + "\n");
dump("************************************************************\n");
let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"]
.getService(Ci.nsIAppStartup);
appStartup.quit(appStartup.eForceQuit);
},
/**
* Resolves to a json manifest.
*/
loadManifest: function() {
return new Promise((aResolve, aReject) => {
debug("Loading manifest " + this._manifestURL);
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Ci.nsIXMLHttpRequest);
xhr.mozBackgroundRequest = true;
xhr.open("GET", this._manifestURL);
xhr.responseType = "json";
xhr.addEventListener("load", () => {
if (xhr.status >= 200 && xhr.status < 400) {
debug("Success loading " + this._manifestURL);
aResolve(xhr.response);
} else {
aReject("Error loading " + this._manifestURL);
}
});
xhr.addEventListener("error", () => {
aReject("Error loading " + this._manifestURL);
});
xhr.send(null);
});
},
configure: function() {
Services.prefs.setCharPref("b2g.system_manifest_url", this._manifestURL);
Services.prefs.setCharPref("b2g.system_startup_url", "");
return Promise.resolve();
},
/**
* If a system app is already installed, uninstall it so that we can
* cleanly replace it by the current one.
*/
uninstallPreviousSystemApp: function() {
// TODO: FIXME
return Promise.resolve();
let oldManifestURL;
try{
oldManifestURL = Services.prefs.getCharPref("b2g.system_manifest_url");
} catch(e) {
// No preference set, so nothing to uninstall.
return Promise.resolve();
}
let id = DOMApplicationRegistry.getAppLocalIdByManifestURL(oldManifestURL);
if (id == Ci.nsIScriptSecurityManager.NO_APP_ID) {
return Promise.resolve();
}
debug("Uninstalling " + oldManifestURL);
return DOMApplicationRegistry.uninstall(oldManifestURL);
},
/**
* Check if we are already configured to run from this manifest url.
*/
isInstallRequired: function(aManifestURL) {
try {
if (Services.prefs.getCharPref("b2g.system_manifest_url") == aManifestURL) {
return false;
}
} catch(e) { }
return true;
},
/**
* Resolves once we have installed the app.
*/
ensureSystemAppInstall: function(aManifestURL) {
this._manifestURL = aManifestURL;
debug("Installing app from " + this._manifestURL);
if (!this.isInstallRequired(this._manifestURL)) {
debug("Already configured for " + this._manifestURL);
return Promise.resolve();
}
return new Promise((aResolve, aReject) => {
this.uninstallPreviousSystemApp.bind(this)
.then(this.loadManifest.bind(this))
.then(this.configure.bind(this))
.then(aResolve)
.catch(aReject);
});
}
};