| // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| /// Whitebox integration/end-to-end test of Try Dart! site. |
| /// |
| /// This test opens Try Dart! in an iframe. When opened the first time, Try |
| /// Dart! will display a simple hello-world example, color tokens, compile the |
| /// example, and run the result. We've instrumented Try Dart! to use |
| /// window.parent.postMessage when the running program prints anything. So this |
| /// test just waits for a "Hello, World!" message. |
| library trydart.end_to_end_test; |
| |
| import 'dart:html'; |
| import 'dart:async'; |
| |
| // TODO(ahe): Remove this import if issue 17936 is fixed. |
| import 'dart:js' as hack; |
| |
| import 'package:async_helper/async_helper.dart'; |
| |
| void onError(String message, String filename, int lineno) { |
| if (filename != null) { |
| message = '$filename:$lineno: $message'; |
| } |
| print("Error occurred in Try Dart iframe: $message"); |
| new Future(() { |
| // Chrome seems to not call window.onerror when you throw in response to an |
| // error event. So we throw the error in a future. |
| throw 'Error from iframe: $message'; |
| }); |
| } |
| |
| void installErrorHandlerOn(IFrameElement iframe) { |
| // This method uses dart:js to install an error event handler on the content |
| // window of [iframe]. This is a workaround for http://dartbug.com/17936. |
| var iframeProxy = new hack.JsObject.fromBrowserObject(iframe); |
| var contentWindowProxy = iframeProxy['contentWindow']; |
| if (contentWindowProxy == null) { |
| print('No contentWindow in iframe'); |
| throw 'No contentWindow in iframe'; |
| } |
| contentWindowProxy.callMethod('addEventListener', ['error', (eventProxy) { |
| onError( |
| eventProxy['message'], eventProxy['filename'], eventProxy['lineno']); |
| }]); |
| contentWindowProxy['onerror'] = onError; |
| } |
| |
| void onIframeLoaded(Event event) { |
| installErrorHandlerOn(event.target); |
| } |
| |
| void main() { |
| asyncStart(); |
| window.onMessage.listen((MessageEvent e) { |
| if (e.data == 'Hello, World!\n') { |
| // Clear the DOM to work around a bug in test.dart. |
| document.body.nodes.clear(); |
| |
| // Clean up after ourselves. |
| window.localStorage.clear(); |
| |
| asyncSuccess(null); |
| } else { |
| window.console.dir(e.data); |
| } |
| }); |
| |
| // Clearing localStorage makes Try Dart! think it is opening for the first |
| // time. |
| window.localStorage.clear(); |
| |
| IFrameElement iframe = new IFrameElement() |
| ..style.width = '90vw' |
| ..style.height = '90vh' |
| ..onLoad.listen(onIframeLoaded); |
| document.body.append(iframe); |
| // Install an error handler both on the new iframe element, and when it has |
| // fired the load event. That seems to matter according to some sources on |
| // stackoverflow. |
| installErrorHandlerOn(iframe); |
| |
| iframe.src = '/root_build/try_dartlang_org/index.html'; |
| } |