Index: sdk/lib/_internal/compiler/js_lib/preambles/d8.js |
diff --git a/sdk/lib/_internal/compiler/js_lib/preambles/d8.js b/sdk/lib/_internal/compiler/js_lib/preambles/d8.js |
index a48f918cf704bde5d69786c81e3453b10fdffad2..18823e15d9dbaa7953d439d40a6415c493b289c7 100644 |
--- a/sdk/lib/_internal/compiler/js_lib/preambles/d8.js |
+++ b/sdk/lib/_internal/compiler/js_lib/preambles/d8.js |
@@ -281,6 +281,43 @@ if (typeof global != "undefined") self = global; // Node.js. |
self.clearInterval = cancelTimer; |
self.scheduleImmediate = addTask; |
+ function computeCurrentScript() { |
+ try { |
+ throw new Error(); |
+ } catch(e) { |
+ var stack = e.stack; |
+ // The V8 stack looks like: |
+ // at computeCurrentScript (preambles/d8.js:286:13) |
+ // at Object.currentScript (preambles/d8.js:308:31) |
+ // at init.currentScript (/tmp/foo.js:308:19) |
+ // at /tmp/foo.js:320:7 |
+ // at /tmp/foo.js:331:4 |
+ var re = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "mg"); |
+ var lastMatch = null; |
+ do { |
+ var match = re.exec(stack); |
+ if (match != null) lastMatch = match; |
+ } while (match != null); |
+ return lastMatch[1]; |
+ } |
+ } |
+ |
+ // Adding a 'document' is dangerous since it invalidates the 'typeof document' |
+ // test to see if we are running in the browser. It means that the runtime |
+ // needs to do more precise checks. |
+ // Note that we can't run "currentScript" right away, since that would give |
+ // us the location of the preamble file. Instead we wait for the first access |
+ // which should happen just before invoking main. At this point we are in |
+ // the main file and setting the currentScript property is correct. |
+ var cachedCurrentScript = null; |
+ self.document = { get currentScript() { |
+ if (cachedCurrentScript == null) { |
+ cachedCurrentScript = {src: computeCurrentScript()}; |
+ } |
+ return cachedCurrentScript; |
+ } |
+ }; |
+ |
// Support for deferred loading. |
self.dartDeferredLibraryLoader = function(uri, successCallback, errorCallback) { |
try { |