Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(816)

Unified Diff: lib/src/runner/browser/server.dart

Issue 1224423002: Properly report load errors caused by browsers. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: Code review changes Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « CHANGELOG.md ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/src/runner/browser/server.dart
diff --git a/lib/src/runner/browser/server.dart b/lib/src/runner/browser/server.dart
index 8c9bcf92ce0210222eaa26e2398d80ef314fcc98..0740990ddce6742771733b4d207230c54c5f5906 100644
--- a/lib/src/runner/browser/server.dart
+++ b/lib/src/runner/browser/server.dart
@@ -8,6 +8,7 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';
+import 'package:async/async.dart';
import 'package:http_multi_server/http_multi_server.dart';
import 'package:path/path.dart' as p;
import 'package:pool/pool.dart';
@@ -134,10 +135,12 @@ class BrowserServer {
final _browsers = new Map<TestPlatform, Browser>();
/// A map from browser identifiers to futures that will complete to the
- /// [BrowserManager]s for those browsers.
+ /// [BrowserManager]s for those browsers, or the errors that occurred when
+ /// trying to load those managers.
///
/// This should only be accessed through [_browserManagerFor].
- final _browserManagers = new Map<TestPlatform, Future<BrowserManager>>();
+ final _browserManagers =
+ new Map<TestPlatform, Future<Result<BrowserManager>>>();
/// A map from test suite paths to Futures that will complete once those
/// suites are finished compiling.
@@ -408,13 +411,16 @@ void main() {
/// If no browser manager is running yet, starts one.
Future<BrowserManager> _browserManagerFor(TestPlatform platform) {
var manager = _browserManagers[platform];
- if (manager != null) return manager;
+ if (manager != null) return Result.release(manager);
var completer = new Completer();
- // Swallow errors, since they're already being surfaced through the return
- // value and [browser.onError].
- _browserManagers[platform] = completer.future.catchError((_) {});
+ // Capture errors and release them later to avoid Zone issues. This call to
+ // [_browserManagerFor] is running in a different [LoadSuite] than future
+ // calls, which means they're also running in different error zones so
+ // errors can't be freely passed between them. Storing the error or value as
+ // an explicit [Result] fixes that.
+ _browserManagers[platform] = Result.capture(completer.future);
var path = _webSocketHandler.create(webSocketHandler((webSocket) {
completer.complete(new BrowserManager(platform, webSocket));
}));
« no previous file with comments | « CHANGELOG.md ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698