Index: site/try/src/compilation.dart |
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart |
deleted file mode 100644 |
index b234a2a6d70faf31faa4ed6bb9b3a5c30928f49e..0000000000000000000000000000000000000000 |
--- a/site/try/src/compilation.dart |
+++ /dev/null |
@@ -1,269 +0,0 @@ |
-// Copyright (c) 2013, 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. |
- |
-library trydart.compilation; |
- |
-import 'dart:html' show |
- Blob, |
- Element, |
- ErrorEvent, |
- IFrameElement, |
- MessageEvent, |
- Url, |
- Worker, |
- window; |
- |
-import 'dart:isolate' show |
- ReceivePort, |
- SendPort; |
- |
-import 'editor.dart' show |
- addDiagnostic, |
- isMalformedInput; |
- |
-import 'run.dart' show |
- makeOutputFrame; |
- |
-import 'ui.dart' show |
- buildButton, |
- interaction, |
- outputDiv, |
- outputFrame; |
- |
-import 'settings.dart' show |
- alwaysRunInWorker, |
- alwaysRunInIframe, |
- communicateViaBlobs, |
- incrementalCompilation, |
- minified, |
- onlyAnalyze, |
- verboseCompiler; |
- |
-import 'iframe_error_handler.dart' show |
- errorStream; |
- |
-/** |
- * Scheme for recognizing files stored in memory. |
- * |
- * From http://tools.ietf.org/html/bcp35#section-2.8: |
- * |
- * Organizations that desire a private name space for URI scheme names |
- * are encouraged to use a prefix based on their domain name, expressed |
- * in reverse order. For example, a URI scheme name of com-example-info |
- * might be registered by the vendor that owns the example.com domain |
- * name. |
- */ |
-const String PRIVATE_SCHEME = 'org-trydart'; |
- |
-SendPort compilerPort; |
- |
-// TODO(ahe): Remove this. |
-String get currentSource => window.localStorage['currentSource']; |
- |
-void set currentSource(String text) { |
- window.localStorage['currentSource'] = text; |
-} |
- |
-bool startCompilation() { |
- if (!CompilationProcess.shouldStartCompilation()) return false; |
- new CompilationProcess(currentSource, outputDiv).start(); |
- return true; |
-} |
- |
-class CompilationProcess { |
- final String source; |
- final Element console; |
- final ReceivePort receivePort = new ReceivePort(); |
- final Set<String> seenMessages = new Set<String>(); |
- bool isDone = false; |
- bool usesDartHtml = false; |
- Worker worker; |
- List<String> objectUrls = <String>[]; |
- String firstError; |
- |
- static CompilationProcess current; |
- |
- CompilationProcess(this.source, this.console); |
- |
- static bool shouldStartCompilation() { |
- if (compilerPort == null) return false; |
- if (isMalformedInput) return false; |
- if (current != null) return current.isDone; |
- return true; |
- } |
- |
- void start() { |
- if (!shouldStartCompilation()) { |
- receivePort.close(); |
- return; |
- } |
- if (current != null) current.dispose(); |
- current = this; |
- var options = [ |
- '--analyze-main', |
- '--no-source-maps', |
- ]; |
- if (verboseCompiler) options.add('--verbose'); |
- if (minified) options.add('--minify'); |
- if (onlyAnalyze) options.add('--analyze-only'); |
- if (incrementalCompilation.value) { |
- options.addAll(['--incremental-support', '--disable-type-inference']); |
- } |
- interaction.compilationStarting(); |
- compilerPort.send([['options', options], receivePort.sendPort]); |
- compilerPort.send([['communicateViaBlobs', communicateViaBlobs.value], |
- receivePort.sendPort]); |
- receivePort.listen(onMessage); |
- compilerPort.send([source, receivePort.sendPort]); |
- } |
- |
- void dispose() { |
- if (worker != null) worker.terminate(); |
- objectUrls.forEach(Url.revokeObjectUrl); |
- } |
- |
- onMessage(message) { |
- String kind = message is String ? message : message[0]; |
- var data = (message is List && message.length == 2) ? message[1] : null; |
- switch (kind) { |
- case 'done': return onDone(data); |
- case 'url': return onUrl(data); |
- case 'code': return onCode(data); |
- case 'diagnostic': return onDiagnostic(data); |
- case 'crash': return onCrash(data); |
- case 'failed': return onFail(data); |
- case 'dart:html': return onDartHtml(data); |
- default: |
- throw ['Unknown message kind', message]; |
- } |
- } |
- |
- onDartHtml(_) { |
- usesDartHtml = true; |
- } |
- |
- onFail(_) { |
- interaction.onCompilationFailed(firstError); |
- } |
- |
- onDone(_) { |
- interaction.onCompilationDone(); |
- isDone = true; |
- receivePort.close(); |
- } |
- |
- // This is called in browsers that support creating Object URLs in a |
- // web worker. For example, Chrome and Firefox 21. |
- onUrl(String url) { |
- objectUrls.add(url); |
- String wrapper = ''' |
-// Fool isolate_helper.dart so it does not think this is an isolate. |
-var window = self; |
-function dartPrint(msg) { |
- self.postMessage(msg); |
-}; |
-self.importScripts("$url"); |
-'''; |
- var wrapperUrl = |
- Url.createObjectUrl(new Blob([wrapper], 'application/javascript')); |
- objectUrls.add(wrapperUrl); |
- |
- run(wrapperUrl, () => makeOutputFrame(url)); |
- } |
- |
- // This is called in browsers that do not support creating Object |
- // URLs in a web worker. For example, Safari and Firefox < 21. |
- onCode(String code) { |
- IFrameElement makeIframe() { |
- // The obvious thing would be to call [makeOutputFrame], but |
- // Safari doesn't support access to Object URLs in an iframe. |
- |
- IFrameElement frame = new IFrameElement() |
- ..src = 'iframe.html' |
- ..style.width = '100%' |
- ..style.height = '0px'; |
- frame.onLoad.listen((_) { |
- frame.contentWindow.postMessage(['source', code], '*'); |
- }); |
- return frame; |
- } |
- |
- String codeWithPrint = |
- '$code\n' |
- 'function dartPrint(msg) { postMessage(msg); }\n'; |
- var url = |
- Url.createObjectUrl( |
- new Blob([codeWithPrint], 'application/javascript')); |
- objectUrls.add(url); |
- |
- run(url, makeIframe); |
- } |
- |
- void run(String url, IFrameElement makeIframe()) { |
- void retryInIframe() { |
- interaction.aboutToRun(); |
- var frame = makeIframe(); |
- frame.style |
- ..visibility = 'hidden' |
- ..position = 'absolute'; |
- outputFrame.parent.insertBefore(frame, outputFrame); |
- outputFrame = frame; |
- errorStream(frame).listen(interaction.onIframeError); |
- } |
- void onError(String errorMessage) { |
- interaction.consolePrintLine(errorMessage); |
- console |
- ..append(buildButton('Try in iframe', (_) => retryInIframe())) |
- ..appendText('\n'); |
- } |
- interaction.aboutToRun(); |
- if (alwaysRunInIframe.value || |
- usesDartHtml && !alwaysRunInWorker) { |
- retryInIframe(); |
- } else { |
- runInWorker(url, onError); |
- } |
- } |
- |
- void runInWorker(String url, void onError(String errorMessage)) { |
- worker = new Worker(url) |
- ..onMessage.listen((MessageEvent event) { |
- interaction.consolePrintLine(event.data); |
- }) |
- ..onError.listen((ErrorEvent event) { |
- worker.terminate(); |
- worker = null; |
- onError(event.message); |
- }); |
- } |
- |
- onDiagnostic(Map<String, dynamic> diagnostic) { |
- if (currentSource != source) return; |
- String kind = diagnostic['kind']; |
- String message = diagnostic['message']; |
- if (kind == 'verbose info') { |
- interaction.verboseCompilerMessage(message); |
- return; |
- } |
- if (kind == 'error' && firstError == null) { |
- firstError = message; |
- } |
- String uri = diagnostic['uri']; |
- if (uri != '${PRIVATE_SCHEME}:/main.dart') { |
- interaction.consolePrintLine('$uri: [$kind] $message'); |
- return; |
- } |
- int begin = diagnostic['begin']; |
- int end = diagnostic['end']; |
- if (begin == null) return; |
- if (seenMessages.add('$begin:$end: [$kind] $message')) { |
- // Guard against duplicated messages. |
- addDiagnostic(kind, message, begin, end); |
- } |
- } |
- |
- onCrash(data) { |
- interaction.onCompilerCrash(data); |
- } |
-} |