| 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:convert'; | 6 import 'dart:convert'; |
| 7 import 'dart:html'; | 7 import 'dart:html'; |
| 8 import 'dart:js' as js; | 8 import 'dart:js' as js; |
| 9 | 9 |
| 10 import 'package:stack_trace/stack_trace.dart'; | 10 import 'package:stack_trace/stack_trace.dart'; |
| 11 import 'package:stream_channel/stream_channel.dart'; | 11 import 'package:stream_channel/stream_channel.dart'; |
| 12 | 12 |
| 13 /// The iframes created for each loaded test suite, indexed by the suite id. | 13 /// The iframes created for each loaded test suite, indexed by the suite id. |
| 14 final _iframes = new Map<int, IFrameElement>(); | 14 final _iframes = new Map<int, IFrameElement>(); |
| 15 | 15 |
| 16 // TODO(nweiz): test this once we can run browser tests. | |
| 17 /// Code that runs in the browser and loads test suites at the server's behest. | 16 /// Code that runs in the browser and loads test suites at the server's behest. |
| 18 /// | 17 /// |
| 19 /// One instance of this runs for each browser. When the server tells it to load | 18 /// One instance of this runs for each browser. When the server tells it to load |
| 20 /// a test, it starts an iframe pointing at that test's code; from then on, it | 19 /// a test, it starts an iframe pointing at that test's code; from then on, it |
| 21 /// just relays messages between the two. | 20 /// just relays messages between the two. |
| 22 /// | 21 /// |
| 23 /// The browser uses two layers of [MultiChannel]s when communicating with the | 22 /// The browser uses two layers of [MultiChannel]s when communicating with the |
| 24 /// server: | 23 /// server: |
| 25 /// | 24 /// |
| 26 /// server | 25 /// server |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 if (message.data["ready"] == true) { | 156 if (message.data["ready"] == true) { |
| 158 readyCompleter.complete(); | 157 readyCompleter.complete(); |
| 159 } else { | 158 } else { |
| 160 controller.local.sink.add(message.data["data"]); | 159 controller.local.sink.add(message.data["data"]); |
| 161 } | 160 } |
| 162 }); | 161 }); |
| 163 | 162 |
| 164 controller.local.stream.listen((message) async { | 163 controller.local.stream.listen((message) async { |
| 165 await readyCompleter.future; | 164 await readyCompleter.future; |
| 166 | 165 |
| 167 // JSON-encode the message to work around sdk#25636, which caused the | 166 iframe.contentWindow.postMessage(message, window.location.origin); |
| 168 // structured clone algorithm to be broken with Window.postMessage in | |
| 169 // 1.14.{0,1,2}. Once we no longer care about these Dartiums, stop encoding. | |
| 170 iframe.contentWindow.postMessage( | |
| 171 JSON.encode(message), window.location.origin); | |
| 172 }); | 167 }); |
| 173 | 168 |
| 174 return controller.foreign; | 169 return controller.foreign; |
| 175 } | 170 } |
| OLD | NEW |