Bug 772600. Create WebappOSUtils to host platform-specific webapps code and implement native app launch. r=felipe

Windows part by Tim Abraldes and Linux part by Marco Castelluccio
This commit is contained in:
Dan Walkowski 2012-07-14 01:09:39 -07:00
parent 9551e979b8
commit 37b72d7ab0
6 changed files with 126 additions and 1 deletions

View File

@ -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 File

@ -24,6 +24,7 @@ PARALLEL_DIRS = \
obsolete \
profile \
themes \
webapps \
$(NULL)
DIRS += \

View File

@ -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

View File

@ -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
}
}

View File

@ -37,3 +37,22 @@ NS_IMETHODIMP nsMacWebAppUtils::PathForAppWithIdentifier(const nsAString& bundle
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;
}

View File

@ -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);
};