Skip to content
This repository has been archived by the owner on Apr 10, 2024. It is now read-only.

Commit

Permalink
Bug 772600. Create WebappOSUtils to host platform-specific webapps co…
Browse files Browse the repository at this point in the history
…de and implement native app launch. r=felipe

Windows part by Tim Abraldes and Linux part by Marco Castelluccio
  • Loading branch information
Dan Walkowski committed Jul 14, 2012
1 parent 3f378d4 commit 95f2aee
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 1 deletion.
3 changes: 2 additions & 1 deletion dom/apps/src/Webapps.jsm
Expand Up @@ -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";

Expand Down Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions toolkit/Makefile.in
Expand Up @@ -24,6 +24,7 @@ PARALLEL_DIRS = \
obsolete \
profile \
themes \
webapps \
$(NULL)

DIRS += \
Expand Down
18 changes: 18 additions & 0 deletions toolkit/webapps/Makefile.in
@@ -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 changes: 81 additions & 0 deletions toolkit/webapps/WebappOSUtils.jsm
@@ -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
}
}
19 changes: 19 additions & 0 deletions widget/cocoa/nsMacWebAppUtils.mm
Expand Up @@ -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;
}
5 changes: 5 additions & 0 deletions widget/nsIMacWebAppUtils.idl
Expand Up @@ -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.