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";};