| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test.runner.browser.host; | 5 library test.runner.browser.host; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:html'; | 9 import 'dart:html'; |
| 10 import 'dart:js' as js; |
| 10 | 11 |
| 11 import 'package:stack_trace/stack_trace.dart'; | 12 import 'package:stack_trace/stack_trace.dart'; |
| 12 import 'package:test/src/util/multi_channel.dart'; | 13 import 'package:test/src/util/multi_channel.dart'; |
| 13 import 'package:test/src/util/stream_channel.dart'; | 14 import 'package:test/src/util/stream_channel.dart'; |
| 14 | 15 |
| 15 // TODO(nweiz): test this once we can run browser tests. | 16 // TODO(nweiz): test this once we can run browser tests. |
| 16 /// Code that runs in the browser and loads test suites at the server's behest. | 17 /// Code that runs in the browser and loads test suites at the server's behest. |
| 17 /// | 18 /// |
| 18 /// One instance of this runs for each browser. When the server tells it to load | 19 /// One instance of this runs for each browser. When the server tells it to load |
| 19 /// a test, it starts an iframe pointing at that test's code; from then on, it | 20 /// a test, it starts an iframe pointing at that test's code; from then on, it |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 /// running". A new connection is also created whenever a test begins running to | 59 /// running". A new connection is also created whenever a test begins running to |
| 59 /// send status messages about its progress. | 60 /// send status messages about its progress. |
| 60 /// | 61 /// |
| 61 /// It's of particular note that the suite's [MultiChannel] connection uses the | 62 /// It's of particular note that the suite's [MultiChannel] connection uses the |
| 62 /// host's purely as a transport layer; neither is aware that the other is also | 63 /// host's purely as a transport layer; neither is aware that the other is also |
| 63 /// using [MultiChannel]. This is necessary, since the host doesn't share memory | 64 /// using [MultiChannel]. This is necessary, since the host doesn't share memory |
| 64 /// with the suites and thus can't share its [MultiChannel] with them, but it | 65 /// with the suites and thus can't share its [MultiChannel] with them, but it |
| 65 /// does mean that the server needs to be sure to nest its [MultiChannel]s at | 66 /// does mean that the server needs to be sure to nest its [MultiChannel]s at |
| 66 /// the same place the client does. | 67 /// the same place the client does. |
| 67 void main() { | 68 void main() { |
| 69 // This tells content_shell not to close immediately after the page has |
| 70 // rendered. |
| 71 var testRunner = js.context['testRunner']; |
| 72 if (testRunner != null) testRunner.callMethod('waitUntilDone', []); |
| 73 |
| 68 runZoned(() { | 74 runZoned(() { |
| 69 var serverChannel = _connectToServer(); | 75 var serverChannel = _connectToServer(); |
| 70 serverChannel.stream.listen((message) { | 76 serverChannel.stream.listen((message) { |
| 71 assert(message['command'] == 'loadSuite'); | 77 assert(message['command'] == 'loadSuite'); |
| 72 var suiteChannel = serverChannel.virtualChannel(message['channel']); | 78 var suiteChannel = serverChannel.virtualChannel(message['channel']); |
| 73 var iframeChannel = _connectToIframe(message['url']); | 79 var iframeChannel = _connectToIframe(message['url']); |
| 74 suiteChannel.pipe(iframeChannel); | 80 suiteChannel.pipe(iframeChannel); |
| 75 }); | 81 }); |
| 76 }, onError: (error, stackTrace) { | 82 }, onError: (error, stackTrace) { |
| 77 print("$error\n${new Trace.from(stackTrace).terse}"); | 83 print("$error\n${new Trace.from(stackTrace).terse}"); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 readyCompleter.complete(); | 135 readyCompleter.complete(); |
| 130 }); | 136 }); |
| 131 | 137 |
| 132 outputController.stream.listen((message) { | 138 outputController.stream.listen((message) { |
| 133 readyCompleter.future.then((_) => | 139 readyCompleter.future.then((_) => |
| 134 iframe.contentWindow.postMessage(message, window.location.origin)); | 140 iframe.contentWindow.postMessage(message, window.location.origin)); |
| 135 }); | 141 }); |
| 136 | 142 |
| 137 return new StreamChannel(inputController.stream, outputController.sink); | 143 return new StreamChannel(inputController.stream, outputController.sink); |
| 138 } | 144 } |
| OLD | NEW |