summaryrefslogtreecommitdiffstats
path: root/b2g/components/Bootstraper.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'b2g/components/Bootstraper.jsm')
-rw-r--r--b2g/components/Bootstraper.jsm156
1 files changed, 156 insertions, 0 deletions
diff --git a/b2g/components/Bootstraper.jsm b/b2g/components/Bootstraper.jsm
new file mode 100644
index 000000000..3d3fb37d9
--- /dev/null
+++ b/b2g/components/Bootstraper.jsm
@@ -0,0 +1,156 @@
+/* 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");
+Cu.import("resource://gre/modules/AppsUtils.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,
+ _startupURL: 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);
+ },
+
+ installSystemApp: function(aManifest) {
+ // Get the appropriate startup url from the manifest launch_path.
+ let base = Services.io.newURI(this._manifestURL, null, null);
+ let origin = base.prePath;
+ let helper = new ManifestHelper(aManifest, origin, this._manifestURL);
+ this._startupURL = helper.fullLaunchPath();
+
+ return new Promise((aResolve, aReject) => {
+ debug("Origin is " + origin);
+ let appData = {
+ app: {
+ installOrigin: origin,
+ origin: origin,
+ manifest: aManifest,
+ manifestURL: this._manifestURL,
+ manifestHash: AppsUtils.computeHash(JSON.stringify(aManifest)),
+ appStatus: Ci.nsIPrincipal.APP_STATUS_CERTIFIED
+ },
+ appId: 1,
+ isBrowser: false,
+ isPackage: false
+ };
+
+ //DOMApplicationRegistry.confirmInstall(appData, null, aResolve);
+ });
+ },
+
+ /**
+ * 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() {
+ debug("Setting startup prefs... " + this._startupURL);
+ Services.prefs.setCharPref("b2g.system_manifest_url", this._manifestURL);
+ Services.prefs.setCharPref("b2g.system_startup_url", this._startupURL);
+ 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.installSystemApp.bind(this))
+ .then(this.configure.bind(this))
+ .then(aResolve)
+ .catch(aReject);
+ });
+ }
+};