| 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 4b6673b13eefe5cb5c8609dd4a1942f180ef3ab2..8f6d6154e4feca2d73d63b5fc238564895760618 100644
|
| --- a/lib/src/runner/browser/static/host.dart
|
| +++ b/lib/src/runner/browser/static/host.dart
|
| @@ -106,31 +106,31 @@ StreamChannel _connectToIframe(String url) {
|
|
|
| var inputController = new StreamController(sync: true);
|
| var outputController = new StreamController(sync: true);
|
| - iframe.onLoad.first.then((_) {
|
| - // TODO(nweiz): use MessageChannel once Firefox supports it
|
| - // (http://caniuse.com/#search=MessageChannel).
|
| -
|
| - // Send an initial command to give the iframe something to reply to.
|
| - iframe.contentWindow.postMessage(
|
| - {"command": "connect"},
|
| - window.location.origin);
|
| -
|
| - window.onMessage.listen((message) {
|
| - // A message on the Window can theoretically come from any website. It's
|
| - // very unlikely that a malicious site would care about hacking someone's
|
| - // unit tests, let alone be able to find the test server while it's
|
| - // running, but it's good practice to check the origin anyway.
|
| - if (message.origin != window.location.origin) return;
|
| -
|
| - // TODO(nweiz): Stop manually checking href here once issue 22554 is
|
| - // fixed.
|
| - if (message.data["href"] != iframe.src) return;
|
| -
|
| - message.stopPropagation();
|
| - inputController.add(message.data["data"]);
|
| - });
|
|
|
| - outputController.stream.listen((message) =>
|
| + // 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.
|
| + var readyCompleter = new Completer();
|
| +
|
| + // TODO(nweiz): use MessageChannel once Firefox supports it
|
| + // (http://caniuse.com/#search=MessageChannel).
|
| + window.onMessage.listen((message) {
|
| + // A message on the Window can theoretically come from any website. It's
|
| + // very unlikely that a malicious site would care about hacking someone's
|
| + // unit tests, let alone be able to find the test server while it's
|
| + // running, but it's good practice to check the origin anyway.
|
| + if (message.origin != window.location.origin) return;
|
| +
|
| + // TODO(nweiz): Stop manually checking href here once issue 22554 is
|
| + // fixed.
|
| + if (message.data["href"] != iframe.src) return;
|
| +
|
| + message.stopPropagation();
|
| + inputController.add(message.data["data"]);
|
| + readyCompleter.complete();
|
| + });
|
| +
|
| + outputController.stream.listen((message) {
|
| + readyCompleter.future.then((_) =>
|
| iframe.contentWindow.postMessage(message, window.location.origin));
|
| });
|
|
|
|
|