Permalink
Browse files

Bug 772600. Create WebappOSUtils to host platform-specific webapps co…

…de and implement native app launch. r=felipe

Windows part by Tim Abraldes and Linux part by Marco Castelluccio
  • Loading branch information...
1 parent 3f378d4 commit 95f2aeec6169db8930d4cfff2c4254c73711f21e Dan Walkowski committed Jul 14, 2012
@@ -14,6 +14,7 @@ let EXPORTED_SYMBOLS = ["DOMApplicationRegistry", "DOMApplicationManifest"];
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/WebappOSUtils.jsm");
const WEBAPP_RUNTIME = Services.appinfo.ID == "webapprt@mozilla.org";
@@ -171,7 +172,7 @@ let DOMApplicationRegistry = {
this.uninstall(msg);
break;
case "Webapps:Launch":
- Services.obs.notifyObservers(this, "webapps-launch", JSON.stringify(msg));
+ WebappOSUtils.launch(msg);
break;
case "Webapps:GetInstalled":
this.getInstalled(msg);
View
@@ -24,6 +24,7 @@ PARALLEL_DIRS = \
obsolete \
profile \
themes \
+ webapps \
$(NULL)
DIRS += \
@@ -0,0 +1,18 @@
+# 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/.
+
+DEPTH = ../..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+include $(topsrcdir)/config/config.mk
+
+EXTRA_PP_JS_MODULES = \
+ WebappOSUtils.jsm \
+ $(NULL)
+
+include $(topsrcdir)/config/rules.mk
@@ -0,0 +1,81 @@
+/* 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/. */
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const CC = Components.Constructor;
+
+let EXPORTED_SYMBOLS = ["WebappOSUtils"];
+
+let WebappOSUtils = {
+ launch: function(aData) {
+#ifdef XP_WIN
+ let appRegKey;
+ try {
+ let open = CC("@mozilla.org/windows-registry-key;1",
+ "nsIWindowsRegKey", "open");
+ let initWithPath = CC("@mozilla.org/file/local;1",
+ "nsILocalFile", "initWithPath");
+ let initProcess = CC("@mozilla.org/process/util;1",
+ "nsIProcess", "init");
+
+ appRegKey = open(Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
+ "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" +
+ aData.origin, Ci.nsIWindowsRegKey.ACCESS_READ);
+
+ let launchTarget = initWithPath(appRegKey.readStringValue("InstallLocation"));
+ launchTarget.append(appRegKey.readStringValue("AppFilename") + ".exe");
+
+ let process = initProcess(launchTarget);
+ process.runwAsync([], 0);
+ } catch (e) {
+ return false;
+ } finally {
+ if (appRegKey) {
+ appRegKey.close();
+ }
+ }
+
+ return true;
+#elifdef XP_MACOSX
+ let mwaUtils = Cc["@mozilla.org/widget/mac-web-app-utils;1"]
+ .createInstance(Ci.nsIMacWebAppUtils);
+ let appPath;
+ try {
+ appPath = mwaUtils.pathForAppWithIdentifier(aData.origin);
+ } catch (e) {}
+
+ if (appPath) {
+ mwaUtils.launchAppWithIdentifier(aData.origin);
+ return true;
+ }
+
+ return false;
+#elifdef XP_UNIX
+ let origin = Services.io.newURI(aData.origin, null, null);
+ let installDir = "." + origin.scheme + ";" + origin.host;
+ if (origin.port != -1)
+ installDir += ";" + origin.port;
+
+ let exeFile = Services.dirsvc.get("Home", Ci.nsIFile);
+ exeFile.append(installDir);
+ exeFile.append("webapprt-stub");
+
+ try {
+ if (exeFile.exists()) {
+ let process = Cc["@mozilla.org/process/util;1"]
+ .createInstance(Ci.nsIProcess);
+ process.init(exeFile);
+ process.runAsync([], 0);
+ return true;
+ }
+ } catch (e) {}
+
+ return false;
+#else
+ Services.obs.notifyObservers(this, "webapps-launch", JSON.stringify(aData));
+ return true;
+#endif
+ }
+}
@@ -37,3 +37,22 @@
NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
}
+
+NS_IMETHODIMP nsMacWebAppUtils::LaunchAppWithIdentifier(const nsAString& bundleIdentifier) {
+ NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+
+ NSAutoreleasePool* ap = [[NSAutoreleasePool alloc] init];
+
+ // Note this might return false, meaning the app wasnt launched for some reason.
+ BOOL success = [[NSWorkspace sharedWorkspace] launchAppWithBundleIdentifier:
+ [NSString stringWithCharacters:((nsString)bundleIdentifier).get() length:((nsString)bundleIdentifier).Length()]
+ options: nil
+ additionalEventParamDescriptor: nil
+ launchIdentifier: NULL];
+
+
+ [ap release];
+ return NS_OK;
+
+ NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+}
@@ -17,4 +17,9 @@ interface nsIMacWebAppUtils : nsISupports {
*/
AString pathForAppWithIdentifier(in AString bundleIdentifier);
+ /**
+ * Launch the app with the given identifier, if it exists.
+ */
+ void launchAppWithIdentifier(in AString bundleIdentifier);
+
};

0 comments on commit 95f2aee

Please sign in to comment.