Adjust source maps & globals for D8.

This allows emitting a single javascript file,
which makes testing in v8 easier. Also we now 
forward all global symbols that v8 has onto window.

Change-Id: I9ce7454f8ef4fa236243827fdc7762e9896e8052
Review-Link: https://gwt-review.googlesource.com/#/c/14930/
diff --git a/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java b/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java
index 7c66a4d..a0611d3 100644
--- a/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java
@@ -25,7 +25,6 @@
 import com.google.gwt.core.ext.linker.LinkerOrder;
 import com.google.gwt.core.ext.linker.LinkerOrder.Order;
 import com.google.gwt.core.ext.linker.Shardable;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
 import com.google.gwt.core.ext.linker.Transferable;
 import com.google.gwt.core.ext.linker.impl.SelectionScriptLinker;
 import com.google.gwt.dev.About;
@@ -46,6 +45,9 @@
 @LinkerOrder(Order.PRIMARY)
 @Shardable
 public class D8ScriptLinker extends SelectionScriptLinker {
+
+  private static final char NEWLINE = '\n';
+
   @Override
   public String getDescription() {
     return "D8 Single Script";
@@ -54,10 +56,12 @@
   @Transferable
   private static class Script extends Artifact<Script> {
     private final String strongName;
+    private final String javaScript;
 
-    public Script(String strongName) {
+    public Script(String strongName, String javaScript) {
       super(D8ScriptLinker.class);
       this.strongName = strongName;
+      this.javaScript = javaScript;
     }
 
     @Override
@@ -83,6 +87,10 @@
     public String toString() {
       return "Script " + strongName;
     }
+
+    public String getJavaScript() {
+      return javaScript;
+    }
   }
 
   @Override
@@ -99,13 +107,9 @@
     }
 
     Collection<Artifact<?>> toReturn = new ArrayList<Artifact<?>>();
-    toReturn.add(new Script(result.getStrongName()));
+    toReturn.add(new Script(result.getStrongName(), js[0]));
     toReturn.addAll(emitSelectionInformation(result.getStrongName(), result));
 
-    SyntheticArtifact artifact = emitString(logger, js[0], result.getStrongName()
-        + ".js");
-    toReturn.add(artifact);
-
     return toReturn;
   }
 
@@ -126,24 +130,31 @@
 
     DefaultTextOutput out = new DefaultTextOutput(true);
 
+    StringBuilder prefixBuilder = new StringBuilder();
+
     // Emit the selection script.
     String bootstrap = generateSelectionScript(logger, context, artifacts);
     bootstrap = context.optimizeJavaScript(logger, bootstrap);
-    out.print(bootstrap);
-    out.newlineOpt();
+    prefixBuilder.append(bootstrap);
+    prefixBuilder.append(NEWLINE);
 
-    out.print("var $gwt_version = \"" + About.getGwtVersionNum() + "\";");
-    out.newlineOpt();
-    out.print("var $wnd = window;");
-    out.newlineOpt();
-    out.print("var $doc = $wnd.document;");
-    out.newlineOpt();
-    out.print("var $moduleName, $moduleBase;");
-    out.newlineOpt();
+    prefixBuilder.append("var $gwt_version = \"" + About.getGwtVersionNum() + "\";");
+    prefixBuilder.append(NEWLINE);
+    prefixBuilder.append("var $wnd = window;");
+    prefixBuilder.append(NEWLINE);
+    prefixBuilder.append("var $doc = $wnd.document;");
+    prefixBuilder.append(NEWLINE);
+    prefixBuilder.append("var $moduleName, $moduleBase;");
+    prefixBuilder.append(NEWLINE);
 
-    out.print("var $strongName = '" + result.getStrongName() + "';");
-    out.newlineOpt();
-    out.print("load($strongName + '.js');");
+    prefixBuilder.append("var $strongName = '" + result.getStrongName() + "';");
+    prefixBuilder.append(NEWLINE);
+
+    String prefix = prefixBuilder.toString();
+    out.print(prefix);
+
+    addSourceMapPrefix(artifacts, prefix);
+    out.print(result.getJavaScript());
 
     // Generate the call to tell the bootstrap code that we're ready to go.
     out.newlineOpt();
@@ -155,6 +166,25 @@
         + ".nocache.js");
   }
 
+  private void addSourceMapPrefix(
+      ArtifactSet artifacts,
+      String prefixLines) {
+    SymbolMapsLinker.ScriptFragmentEditsArtifact edArtifact = null;
+    for (SymbolMapsLinker.ScriptFragmentEditsArtifact editsArtifact :
+        artifacts.find(SymbolMapsLinker.ScriptFragmentEditsArtifact.class)) {
+      if (editsArtifact.getFragment() == 0) {
+        edArtifact = editsArtifact;
+        break;
+      }
+    }
+
+    if (edArtifact == null) {
+      edArtifact = new SymbolMapsLinker.ScriptFragmentEditsArtifact(null, 0);
+      artifacts.add(edArtifact);
+    }
+    edArtifact.prefixLines(prefixLines);
+  }
+
   /**
    * Unimplemented. Normally required by
    * {@link #doEmitCompilation(TreeLogger, LinkerContext, CompilationResult, ArtifactSet)}.
diff --git a/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js b/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js
index 23d3f98..0ce9607 100644
--- a/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js
@@ -16,7 +16,7 @@
 
 
 // ---------------- D8 GLOBALS ----------------
-window = {};
+window = this;
 // Alias self as well since it is a magic var sometimes provided
 // by the webworker linker.
 self = window;
@@ -29,11 +29,6 @@
 window.clearTimeout = function() { window.__d8warning("clearTimeout")};
 window.clearInterval = function() { window.__d8warning("clearInterval");};
 window.setInterval = function() { window.__d8warning("setInterval"); };
-window.Object = Object;
-window.Array = Array;
-window.Function = Function;
-window.String = String;
-window.Number = Number;
 navigator = {};
 navigator.userAgent = {};
 navigator.userAgent.toLowerCase = function(){ return "webkit";};