mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-23 21:01:08 +00:00
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:
parent
9a38000564
commit
ece4335f8f
@ -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);
|
||||
|
@ -24,6 +24,7 @@ PARALLEL_DIRS = \
|
||||
obsolete \
|
||||
profile \
|
||||
themes \
|
||||
webapps \
|
||||
$(NULL)
|
||||
|
||||
DIRS += \
|
||||
|
18
toolkit/webapps/Makefile.in
Normal file
18
toolkit/webapps/Makefile.in
Normal 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
|
81
toolkit/webapps/WebappOSUtils.jsm
Normal file
81
toolkit/webapps/WebappOSUtils.jsm
Normal 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
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user