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 92ef3ba9d3aa55822d194faccf67c79a483975c3..b433ceb36237c469d8b00182f3635decb4657b38 100644 |
--- a/lib/src/runner/browser/static/host.dart |
+++ b/lib/src/runner/browser/static/host.dart |
@@ -13,6 +13,9 @@ import 'package:stack_trace/stack_trace.dart'; |
import 'package:test/src/util/multi_channel.dart'; |
import 'package:test/src/util/stream_channel.dart'; |
+/// The iframes created for each loaded test suite, indexed by the suite id. |
+final _iframes = new Map<int, IFrameElement>(); |
+ |
// TODO(nweiz): test this once we can run browser tests. |
/// Code that runs in the browser and loads test suites at the server's behest. |
/// |
@@ -74,10 +77,14 @@ void main() { |
runZoned(() { |
var serverChannel = _connectToServer(); |
serverChannel.stream.listen((message) { |
- assert(message['command'] == 'loadSuite'); |
- var suiteChannel = serverChannel.virtualChannel(message['channel']); |
- var iframeChannel = _connectToIframe(message['url']); |
- suiteChannel.pipe(iframeChannel); |
+ if (message['command'] == 'loadSuite') { |
+ var suiteChannel = serverChannel.virtualChannel(message['channel']); |
+ var iframeChannel = _connectToIframe(message['url'], message['id']); |
+ suiteChannel.pipe(iframeChannel); |
+ } else { |
+ assert(message['command'] == 'closeSuite'); |
+ _iframes[message['id']].remove(); |
+ } |
}); |
}, onError: (error, stackTrace) { |
print("$error\n${new Trace.from(stackTrace).terse}"); |
@@ -105,8 +112,11 @@ MultiChannel _connectToServer() { |
/// Creates an iframe with `src` [url] and establishes a connection to it using |
/// `postMessage`. |
-StreamChannel _connectToIframe(String url) { |
+/// |
+/// [id] identifies the suite loaded in this iframe. |
+StreamChannel _connectToIframe(String url, int id) { |
var iframe = new IFrameElement(); |
+ _iframes[id] = iframe; |
iframe.src = url; |
document.body.children.add(iframe); |