diff -r 000000000000 -r 6474c204b198 webapprt/WebappManager.jsm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webapprt/WebappManager.jsm Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,100 @@ +/* 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 = ["WebappManager"]; + +let Cc = Components.classes; +let Ci = Components.interfaces; +let Cu = Components.utils; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/Webapps.jsm"); +Cu.import("resource://gre/modules/AppsUtils.jsm"); +Cu.import("resource://gre/modules/NativeApp.jsm"); +Cu.import("resource://gre/modules/WebappOSUtils.jsm"); +Cu.import("resource://webapprt/modules/WebappRT.jsm"); + +this.WebappManager = { + observe: function(subject, topic, data) { + data = JSON.parse(data); + data.mm = subject; + + switch (topic) { + case "webapps-ask-install": + let chromeWin = Services.wm.getOuterWindowWithId(data.oid); + if (chromeWin) + this.doInstall(data, chromeWin); + break; + case "webapps-launch": + WebappOSUtils.launch(data); + break; + case "webapps-uninstall": + WebappOSUtils.uninstall(data); + break; + } + }, + + update: function(aApp, aManifest, aZipPath) { + let nativeApp = new NativeApp(aApp, aManifest, + WebappRT.config.app.categories, + WebappRT.config.registryDir); + nativeApp.prepareUpdate(aManifest, aZipPath); + }, + + doInstall: function(data, window) { + let jsonManifest = data.isPackage ? data.app.updateManifest : data.app.manifest; + let manifest = new ManifestHelper(jsonManifest, data.app.origin); + let name = manifest.name; + let bundle = Services.strings.createBundle("chrome://webapprt/locale/webapp.properties"); + + let choice = Services.prompt.confirmEx( + window, + bundle.formatStringFromName("webapps.install.title", [name], 1), + bundle.formatStringFromName("webapps.install.description", [name], 1), + // Set both buttons to strings with the cancel button being default + Ci.nsIPromptService.BUTTON_POS_1_DEFAULT | + Ci.nsIPromptService.BUTTON_TITLE_IS_STRING * Ci.nsIPromptService.BUTTON_POS_0 | + Ci.nsIPromptService.BUTTON_TITLE_IS_STRING * Ci.nsIPromptService.BUTTON_POS_1, + bundle.GetStringFromName("webapps.install.install"), + bundle.GetStringFromName("webapps.install.dontinstall"), + null, + null, + {}); + + // Perform the install if the user allows it + if (choice == 0) { + let nativeApp = new NativeApp(data.app, jsonManifest, + WebappRT.config.app.categories, + WebappRT.config.registryDir); + let localDir; + try { + localDir = nativeApp.createProfile(); + } catch (ex) { + DOMApplicationRegistry.denyInstall(aData); + return; + } + + DOMApplicationRegistry.confirmInstall(data, localDir, + function (aManifest, aZipPath) { + nativeApp.install(aManifest, aZipPath); + } + ); + } else { + DOMApplicationRegistry.denyInstall(data); + } + }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, + Ci.nsISupportsWeakReference]) +}; + +Services.obs.addObserver(WebappManager, "webapps-ask-install", false); +Services.obs.addObserver(WebappManager, "webapps-launch", false); +Services.obs.addObserver(WebappManager, "webapps-uninstall", false); +Services.obs.addObserver(WebappManager, "webapps-update", false); + +DOMApplicationRegistry.registerUpdateHandler(WebappManager.update);