Index: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
index 8f2df1e233adb462c391c1cecae3bd230049ec31..97f3fb0ea5c416fdfb15ceb5c8fbd81e78ca0b8f 100644 |
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
@@ -857,11 +857,7 @@ class CodeEmitterTask extends CompilerTask { |
return js.fun('oldIsolate', [ |
js('var isolateProperties = oldIsolate.${namer.isolatePropertiesName}'), |
- js(r'isolateProperties.$currentScript =' |
- 'typeof document == "object" ?' |
- '(document.currentScript ||' |
- 'document.scripts[document.scripts.length - 1]) :' |
- 'null'), |
+ js(r'isolateProperties.$currentScript = null'), |
js('var isolatePrototype = oldIsolate.prototype'), |
js('var str = "{\\n"'), |
@@ -2977,28 +2973,50 @@ class CodeEmitterTask extends CompilerTask { |
buffer.write( |
jsAst.prettyPrint(generateDispatchPropertyInitialization(), |
compiler)); |
- buffer.write(N); |
+ buffer.write(';$n'); |
} |
addComment('BEGIN invoke [main].', buffer); |
+ // This code finds the currently executing script by listening to the |
+ // onload event of all script tags and getting the first script which |
+ // finishes. Since onload is called immediately after execution this should |
+ // not substantially change execution order. |
buffer.write(""" |
-if (typeof document !== "undefined" && document.readyState !== "complete") { |
- document.addEventListener("readystatechange", function () { |
- if (document.readyState == "complete") { |
- if (typeof dartMainRunner === "function") { |
- dartMainRunner(function() { ${mainCall}; }); |
- } else { |
- ${mainCall}; |
- } |
+(function (callback) { |
+ if (typeof document === 'undefined') { |
+ callback(null); |
+ return; |
+ } |
+ if (document.currentScript) { |
+ callback(document.currentScript); |
+ return; |
+ } |
+ |
+ var scripts = document.scripts; |
+ function onLoad(event) { |
+ for (var i = 0; i < scripts.length; ++i) { |
+ scripts[i].removeEventListener('load', onLoad, false); |
} |
- }, false); |
-} else { |
+ callback(event.target); |
+ } |
+ for (var i = 0; i < scripts.length; ++i) { |
+ scripts[i].addEventListener('load', onLoad, false); |
+ } |
+})(function(currentScript) { |
+ ${namer.isolateName}.${namer.isolatePropertiesName}.\$currentScript = |
+ currentScript; |
+ |
+ if (typeof console !== 'undefined' && typeof document !== 'undefined' && |
+ document.readyState == "loading") { |
+ console.warn("Dart script executed synchronously, use <script src='" + |
+ currentScript.src + "' defer></scr" + "ipt> to execute after parsing " + |
+ "has completed. See also http://dartbug.com/12281."); |
+ } |
if (typeof dartMainRunner === "function") { |
dartMainRunner(function() { ${mainCall}; }); |
} else { |
${mainCall}; |
} |
-} |
-"""); |
+})$N"""); |
addComment('END invoke [main].', buffer); |
} |