| Index: lib/src/runner/browser/browser_manager.dart
|
| diff --git a/lib/src/runner/browser/browser_manager.dart b/lib/src/runner/browser/browser_manager.dart
|
| index 46a48717556fd6304e223aaea6a88892fda6c9ff..f002f329cd3af47be4cf3dbacfba2180c5c5aad1 100644
|
| --- a/lib/src/runner/browser/browser_manager.dart
|
| +++ b/lib/src/runner/browser/browser_manager.dart
|
| @@ -12,6 +12,7 @@ import 'package:pool/pool.dart';
|
|
|
| import '../../backend/metadata.dart';
|
| import '../../backend/test_platform.dart';
|
| +import '../../util/cancelable_future.dart';
|
| import '../../util/multi_channel.dart';
|
| import '../../util/remote_exception.dart';
|
| import '../../util/stack_trace_mapper.dart';
|
| @@ -52,6 +53,12 @@ class BrowserManager {
|
| /// Whether the channel to the browser has closed.
|
| bool _closed = false;
|
|
|
| + /// The completer for [_BrowserEnvironment.displayPause].
|
| + ///
|
| + /// This will be `null` as long as the browser isn't displaying a pause
|
| + /// screen.
|
| + CancelableCompleter _pauseCompleter;
|
| +
|
| /// The environment to attach to each suite.
|
| _BrowserEnvironment _environment;
|
|
|
| @@ -62,7 +69,7 @@ class BrowserManager {
|
| webSocket.map(JSON.decode),
|
| mapSink(webSocket, JSON.encode)) {
|
| _environment = new _BrowserEnvironment(this);
|
| - _channel.stream.listen(null, onDone: () => _closed = true);
|
| + _channel.stream.listen(_onMessage, onDone: _onDone);
|
| }
|
|
|
| /// Tells the browser the load a test suite from the URL [url].
|
| @@ -153,6 +160,35 @@ class BrowserManager {
|
| }), platform: browser, metadata: metadata, path: path,
|
| onClose: () => closeIframe());
|
| }
|
| +
|
| + /// An implementation of [Environment.displayPause].
|
| + CancelableFuture _displayPause() {
|
| + if (_pauseCompleter != null) return _pauseCompleter.future;
|
| +
|
| + _pauseCompleter = new CancelableCompleter(() {
|
| + _channel.sink.add({"command": "resume"});
|
| + _pauseCompleter = null;
|
| + });
|
| +
|
| + _channel.sink.add({"command": "displayPause"});
|
| + return _pauseCompleter.future.whenComplete(() {
|
| + _pauseCompleter = null;
|
| + });
|
| + }
|
| +
|
| + /// The callback for handling messages received from the host page.
|
| + void _onMessage(Map message) {
|
| + assert(message["command"] == "resume");
|
| + if (_pauseCompleter == null) return;
|
| + _pauseCompleter.complete();
|
| + }
|
| +
|
| + /// The callback called when the WebSocket is closed.
|
| + void _onDone() {
|
| + _closed = true;
|
| + if (_pauseCompleter != null) _pauseCompleter.complete();
|
| + _pauseCompleter = null;
|
| + }
|
| }
|
|
|
| /// An implementation of [Environment] for the browser.
|
| @@ -162,4 +198,6 @@ class _BrowserEnvironment implements Environment {
|
| final BrowserManager _manager;
|
|
|
| _BrowserEnvironment(this._manager);
|
| +
|
| + CancelableFuture displayPause() => _manager._displayPause();
|
| }
|
|
|