diff --git a/lib/src/runner/browser/chrome.dart b/lib/src/runner/browser/chrome.dart index 2a198a15fc669925a1603f4478b86ff1f4aa4c7c..8b155c11a24dd1f9f719126444f51ec25b7487b9 100644 --- a/lib/src/runner/browser/chrome.dart +++ b/lib/src/runner/browser/chrome.dart @@ -7,6 +7,8 @@ library unittest.runner.browser.chrome; import 'dart:async'; import 'dart:io'; +import 'package:path/path.dart' as p; + import '../../util/io.dart'; // TODO(nweiz): move this into its own package? @@ -45,9 +47,9 @@ class Chrome { /// [Uri] or a [String]. /// /// If [executable] is passed, it's used as the Chrome executable. Otherwise - /// `"google-chrome"` will be looked up on the system PATH. + /// the default executable name for the current OS will be used. Chrome(url, {String executable}) { - if (executable == null) executable = "google-chrome"; + if (executable == null) executable = _defaultExecutable(); // Don't return a Future here because there's no need for the caller to wait // for the process to actually start. They should just wait for the HTTP @@ -60,7 +62,10 @@ class Chrome { "--disable-extensions", "--disable-popup-blocking", "--bwsi", - "--no-first-run" + "--no-first-run", + "--no-default-browser-check", + "--disable-default-apps", + "--disable-translate" ]).then((process) { _process = process; _onProcessStartedCompleter.complete(); @@ -85,4 +90,32 @@ class Chrome { // Swallow exceptions. The user should explicitly use [onExit] for these. return onExit.catchError((_) {}); } + + /// Return the default executable for the current operating system. + String _defaultExecutable() { + if (Platform.isMacOS) { + return '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'; + } + if (!Platform.isWindows) return 'google-chrome'; + + // Chrome could be installed in several places on Windows. The only way to + // find it is to check. + var prefixes = [ + Platform.environment['LOCALAPPDATA'], + Platform.environment['PROGRAMFILES'], + Platform.environment['PROGRAMFILES(X86)'] + ]; + var suffix = r'Google\Chrome\Application\chrome.exe'; + + for (var prefix in prefixes) { + if (prefix == null) continue; + + var path = p.join(prefix, suffix); + if (new File(p.join(prefix, suffix)).existsSync()) return path; + } + + // Fall back on looking it up on the path. This probably won't work, but at + // least it will fail with a useful error message. + return "chrome.exe"; + } }