| Index: lib/src/runner/browser/chrome.dart
 | 
| diff --git a/lib/src/runner/browser/chrome.dart b/lib/src/runner/browser/chrome.dart
 | 
| index fc4e232920e60dbc875b5f29550c94aab2d4f0c5..bca71a48994976cf5dc3e268b9a8d2e95a08f318 100644
 | 
| --- a/lib/src/runner/browser/chrome.dart
 | 
| +++ b/lib/src/runner/browser/chrome.dart
 | 
| @@ -5,11 +5,15 @@
 | 
|  library test.runner.browser.chrome;
 | 
|  
 | 
|  import 'dart:async';
 | 
| +import 'dart:convert';
 | 
|  import 'dart:io';
 | 
|  
 | 
|  import 'package:path/path.dart' as p;
 | 
| +import 'package:stack_trace/stack_trace.dart';
 | 
|  
 | 
|  import '../../util/io.dart';
 | 
| +import '../../utils.dart';
 | 
| +import '../application_exception.dart';
 | 
|  import 'browser.dart';
 | 
|  
 | 
|  // TODO(nweiz): move this into its own package?
 | 
| @@ -25,12 +29,6 @@ class Chrome implements Browser {
 | 
|    /// The underlying process.
 | 
|    Process _process;
 | 
|  
 | 
| -  /// The temporary directory used as the browser's user data dir.
 | 
| -  ///
 | 
| -  /// A new data dir is created for each run to ensure that they're
 | 
| -  /// well-isolated.
 | 
| -  String _dir;
 | 
| -
 | 
|    Future get onExit => _onExitCompleter.future;
 | 
|    final _onExitCompleter = new Completer();
 | 
|  
 | 
| @@ -52,9 +50,8 @@ class Chrome implements Browser {
 | 
|      // for the process to actually start. They should just wait for the HTTP
 | 
|      // request instead.
 | 
|      withTempDir((dir) {
 | 
| -      _dir = dir;
 | 
|        return Process.start(executable, [
 | 
| -        "--user-data-dir=$_dir",
 | 
| +        "--user-data-dir=$dir",
 | 
|          url.toString(),
 | 
|          "--disable-extensions",
 | 
|          "--disable-popup-blocking",
 | 
| @@ -72,9 +69,19 @@ class Chrome implements Browser {
 | 
|          return _process.exitCode;
 | 
|        });
 | 
|      }).then((exitCode) {
 | 
| -      if (exitCode != 0) throw "Chrome failed with exit code $exitCode.";
 | 
| -    }).then(_onExitCompleter.complete)
 | 
| -        .catchError(_onExitCompleter.completeError);
 | 
| +      if (exitCode == 0) return null;
 | 
| +
 | 
| +      return UTF8.decodeStream(_process.stderr).then((error) {
 | 
| +        throw new ApplicationException(
 | 
| +            "Chrome failed with exit code $exitCode:\n$error");
 | 
| +      });
 | 
| +    }).then(_onExitCompleter.complete).catchError((error, stackTrace) {
 | 
| +      if (stackTrace == null) stackTrace = new Trace.current();
 | 
| +      _onExitCompleter.completeError(
 | 
| +          new ApplicationException(
 | 
| +              "Failed to start Chrome: ${getErrorMessage(error)}."),
 | 
| +          stackTrace);
 | 
| +    });
 | 
|    }
 | 
|  
 | 
|    Future close() {
 | 
| 
 |