You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ti...@apache.org on 2015/10/21 17:26:34 UTC
cordova-lib git commit: On Windows,
verify browsers installed before launching.
Repository: cordova-lib
Updated Branches:
refs/heads/master d077f056e -> b89a50f1d
On Windows, verify browsers installed before launching.
Do this to avoid dialog that pops up if browser is not installed.
Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/b89a50f1
Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/b89a50f1
Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/b89a50f1
Branch: refs/heads/master
Commit: b89a50f1d0330b54186526846d732455858082ad
Parents: d077f05
Author: Tim Barham <ti...@microsoft.com>
Authored: Fri Oct 16 19:17:03 2015 -0700
Committer: Tim Barham <ti...@microsoft.com>
Committed: Wed Oct 21 08:08:09 2015 -0700
----------------------------------------------------------------------
cordova-serve/package.json | 3 +-
cordova-serve/src/browser.js | 101 +++++++++++++++++++++++++++++++++++---
2 files changed, 96 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/b89a50f1/cordova-serve/package.json
----------------------------------------------------------------------
diff --git a/cordova-serve/package.json b/cordova-serve/package.json
index 1bfccb1..7c9f2ce 100644
--- a/cordova-serve/package.json
+++ b/cordova-serve/package.json
@@ -22,7 +22,8 @@
"chalk": "^1.1.1",
"compression": "^1.6.0",
"express": "^4.13.3",
- "q": "^1.4.1"
+ "q": "^1.4.1",
+ "shelljs": "^0.5.3"
},
"devDependencies": {
"jshint": "^2.8.0"
http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/b89a50f1/cordova-serve/src/browser.js
----------------------------------------------------------------------
diff --git a/cordova-serve/src/browser.js b/cordova-serve/src/browser.js
index c701ca0..274d20e 100644
--- a/cordova-serve/src/browser.js
+++ b/cordova-serve/src/browser.js
@@ -17,9 +17,15 @@
under the License.
*/
-var exec = require('./exec'),
+var child_process = require('child_process'),
+ exec = require('./exec'),
+ fs = require('fs'),
+ path = require('path'),
Q = require('q');
+var NOT_INSTALLED = 'The browser target is not installed: %target%';
+var NOT_SUPPORTED = 'The browser target is not supported: %target%';
+
/**
* Launches the specified browser with the given URL.
* Based on https://github.com/domenic/opener
@@ -33,6 +39,7 @@ module.exports = function (opts) {
var target = opts.target || 'chrome';
var url = opts.url || '';
+ target = target.toLowerCase();
return getBrowser(target, opts.dataDir).then(function (browser) {
var args;
@@ -72,7 +79,10 @@ module.exports = function (opts) {
args.push(url);
}
var command = args.join(' ');
- return exec(command);
+ return exec(command).catch(function (error) {
+ // Assume any error means that the browser is not installed and display that as a more friendly error.
+ throw new Error(NOT_INSTALLED.replace('%target%', target));
+ });
});
};
@@ -95,16 +105,93 @@ function getBrowser(target, dataDir) {
'firefox': 'firefox',
'opera': 'opera'
},
- 'linux' : {
- 'chrome': 'google-chrome' + chromeArgs ,
+ 'linux': {
+ 'chrome': 'google-chrome' + chromeArgs,
'chromium': 'chromium-browser' + chromeArgs,
'firefox': 'firefox',
'opera': 'opera'
}
};
- target = target.toLowerCase();
if (target in browsers[process.platform]) {
- return Q(browsers[process.platform][target]);
+ var browser = browsers[process.platform][target];
+ if (process.platform === 'win32') {
+ // Windows displays a dialog if the browser is not installed. We'd prefer to avoid that.
+ return checkBrowserExistsWindows(browser, target).then(function () {
+ return browser;
+ });
+ } else {
+ return Q(browser);
+ }
}
- return Q.reject('Browser target not supported: ' + target);
+ return Q.reject(NOT_SUPPORTED.replace('%target%', target));
+}
+
+function checkBrowserExistsWindows(browser, target) {
+ var promise = target === 'edge' ? edgeSupported() : browserInstalled(browser);
+ return promise.catch(function (error) {
+ return Q.reject((error && error.toString() || NOT_INSTALLED).replace('%target%', target));
+ });
+}
+
+function edgeSupported() {
+ var d = Q.defer();
+
+ child_process.exec('ver', function (err, stdout, stderr) {
+ if (err || stderr) {
+ d.reject(err || stderr);
+ } else {
+ var windowsVersion = stdout.match(/([0-9.])+/g)[0];
+ if (parseInt(windowsVersion) < 10) {
+ d.reject('The browser target is not supported on this version of Windows: %target%');
+ } else {
+ d.resolve();
+ }
+ }
+ });
+ return d.promise;
+}
+
+var regItemPattern = /\s*\(Default\)\s+(REG_SZ)\s+([^\s].*)\s*/;
+function browserInstalled(browser) {
+ // On Windows, the 'start' command searches the path then 'App Paths' in the registry. We do the same here. Note
+ // that the start command uses the PATHEXT environment variable for the list of extensions to use if no extension is
+ // provided. We simplify that to just '.EXE' since that is what all the supported browsers use.
+
+ // Check path (simple but usually won't get a hit)
+ if (require('shelljs').which(browser)) {
+ return Q.resolve();
+ }
+
+ var d = Q.defer();
+
+ child_process.exec('reg QUERY "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\' + browser.split(' ')[0] + '.EXE" /v ""', function (err, stdout, stderr) {
+ if (err || stderr) {
+ // The registry key does not exist, which just means the app is not installed.
+ d.reject();
+ } else {
+ var result = regItemPattern.exec(stdout);
+ if (!result) {
+ // The registry key exists, but has no default value, which means the app is not installed (note that we
+ // don't expect to hit this, since we'll just get a default value of '(value not set)', but that will
+ // fail the fs.exists() test below to give us the expected result).
+ d.reject();
+ } else {
+ fs.exists(trimRegPath(result[2]), function (exists) {
+ if (exists) {
+ d.resolve();
+ } else {
+ // The default value is not a file that exists, which means the app is not installed.
+ d.reject();
+ }
+ });
+ }
+ }
+ });
+
+ return d.promise;
+}
+
+function trimRegPath(path) {
+ // Trim quotes and whitespace
+ return path.replace(/^[\s"]+|[\s"]+$/g, '');
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org