Index: lib/src/runner/browser/static/host.dart |
diff --git a/lib/src/runner/browser/static/host.dart b/lib/src/runner/browser/static/host.dart |
index 3a72b2150b495a14ab533e0be268efb741638999..fcb33a0311f4dbd8689da33e4d0dac8bb11d4ee9 100644 |
--- a/lib/src/runner/browser/static/host.dart |
+++ b/lib/src/runner/browser/static/host.dart |
@@ -88,6 +88,11 @@ void main() { |
} |
}); |
+ // Send periodic pings to the test runner so it can know when the browser is |
+ // paused for debugging. |
+ new Timer.periodic(new Duration(seconds: 1), |
kevmoo
2016/02/17 16:22:48
const Duration?
|
+ (_) => serverChannel.sink.add({"command": "ping"})); |
+ |
var play = document.querySelector("#play"); |
play.onClick.listen((_) { |
document.body.classes.remove('paused'); |
@@ -106,17 +111,15 @@ MultiChannel _connectToServer() { |
var currentUrl = Uri.parse(window.location.href); |
var webSocket = new WebSocket(currentUrl.queryParameters['managerUrl']); |
- var inputController = new StreamController(sync: true); |
+ var controller = new StreamChannelController(sync: true); |
webSocket.onMessage.listen((message) { |
- inputController.add(JSON.decode(message.data)); |
+ controller.local.sink.add(JSON.decode(message.data)); |
}); |
- var outputController = new StreamController(sync: true); |
- outputController.stream.listen( |
+ controller.local.stream.listen( |
(message) => webSocket.send(JSON.encode(message))); |
- return new MultiChannel( |
- new StreamChannel(inputController.stream, outputController.sink)); |
+ return new MultiChannel(controller.foreign); |
} |
/// Creates an iframe with `src` [url] and establishes a connection to it using |
@@ -129,8 +132,7 @@ StreamChannel _connectToIframe(String url, int id) { |
iframe.src = url; |
document.body.children.add(iframe); |
- var inputController = new StreamController(sync: true); |
- var outputController = new StreamController(sync: true); |
+ var controller = new StreamChannelController(sync: true); |
// Use this to avoid sending a message to the iframe before it's sent a |
// message to us. This ensures that no messages get dropped on the floor. |
@@ -150,14 +152,24 @@ StreamChannel _connectToIframe(String url, int id) { |
if (message.data["href"] != iframe.src) return; |
message.stopPropagation(); |
- inputController.add(message.data["data"]); |
- if (!readyCompleter.isCompleted) readyCompleter.complete(); |
+ |
+ // This message indicates that the iframe is actively listening for events. |
+ if (message.data["ready"] == true) { |
+ readyCompleter.complete(); |
+ } else { |
+ controller.local.sink.add(message.data["data"]); |
+ } |
}); |
- outputController.stream.listen((message) async { |
+ controller.local.stream.listen((message) async { |
await readyCompleter.future; |
- iframe.contentWindow.postMessage(message, window.location.origin); |
+ |
+ // JSON-encode the message to work around sdk#25636, which caused the |
+ // structured clone algorithm to be broken with Window.postMessage in |
+ // 1.14.{0,1,2}. Once we no longer care about these Dartiums, stop encoding. |
+ iframe.contentWindow.postMessage( |
+ JSON.encode(message), window.location.origin); |
}); |
- return new StreamChannel(inputController.stream, outputController.sink); |
+ return controller.foreign; |
} |