| 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 21e7b5ca20fb720a8661c077e3daa58b0f9b5429..27c1add04b4797c83ae61f9e8c6366d52f70bfd2 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"'),
|
| @@ -2962,24 +2958,47 @@ class CodeEmitterTask extends CompilerTask {
|
| 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() {
|
| + 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};
|
| }
|
| -}
|
| +});
|
| """);
|
| addComment('END invoke [main].', buffer);
|
| }
|
|
|