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