Roll back Source Map support for GWT due to breakages seen by various teams
Review by: rdayal@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10758 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/build.xml b/dev/build.xml
index f586b2a..7318650 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -59,7 +59,6 @@
<include name="apache/ant-1.6.5.jar" />
<include name="eclipse/jdt-3.4.2.jar" />
<include name="guava/guava-r06/guava-r06-rebased-2.jar" />
- <include name="jscomp/sourcemap-rebased.jar" />
<include name="jetty/jetty-6.1.11.jar" />
<include name="icu4j/4.4.2/icu4j.jar" />
<include name="protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
@@ -112,7 +111,6 @@
<!-- htmlunit dependencies not already included: END -->
<include name="sun/swingworker/swing-worker-1.1.jar" />
<include name="guava/guava-r06/guava-r06-rebased-2.jar" />
- <include name="jscomp/sourcemap-rebased.jar" />
</fileset>
<fileset file="build.xml"/>
</sourcefiles>
@@ -125,7 +123,6 @@
<zipfileset src="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
<zipfileset src="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
<zipfileset src="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
- <zipfileset src="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
<zipfileset src="${gwt.tools.lib}/jetty/jetty-6.1.11.jar" />
<zipfileset src="${gwt.tools.lib}/icu4j/4.4.2/icu4j.jar" />
<zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
@@ -178,7 +175,6 @@
<!-- htmlunit dependencies not already included: END -->
<zipfileset src="${gwt.tools.lib}/sun/swingworker/swing-worker-1.1.jar" />
<zipfileset src="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
- <zipfileset src="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
</gwt.jar>
</sequential>
</outofdate>
@@ -220,7 +216,6 @@
<pathelement location="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
<pathelement location="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
<pathelement location="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
- <pathelement location="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
</classpath>
</gwt.javac>
</target>
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java b/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
index 4be3a85..97cd1d7 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
@@ -92,11 +92,6 @@
String getClassName();
/**
- * Returns the fragment number in which the symbol is declared (for a method).
- */
- int getFragmentNumber();
-
- /**
* Returns a JSNI-like identifier for the symbol if it a method or field,
* otherwise <code>null</code>.
*/
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
index 64fcc55..67d2cdf 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
@@ -1,12 +1,12 @@
/*
* Copyright 2008 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -27,7 +27,6 @@
import com.google.gwt.core.ext.linker.SelectionProperty;
import com.google.gwt.core.ext.linker.SoftPermutation;
import com.google.gwt.core.ext.linker.StatementRanges;
-import com.google.gwt.core.linker.SymbolMapsLinker;
import com.google.gwt.dev.util.DefaultTextOutput;
import com.google.gwt.dev.util.TextOutput;
import com.google.gwt.dev.util.Util;
@@ -47,12 +46,20 @@
import java.util.TreeMap;
/**
- * A base class for Linkers that use an external script to boostrap the GWT module. This
- * implementation injects JavaScript Snippets into a JS program defined in an external file.
+ * A base class for Linkers that use an external script to boostrap the GWT
+ * module. This implementation injects JavaScript Snippets into a JS program
+ * defined in an external file.
*/
public abstract class SelectionScriptLinker extends AbstractLinker {
+ /**
+ * TODO(bobv): Move this class into c.g.g.core.linker when HostedModeLinker
+ * goes away?
+ */
- public static final String USE_SOURCE_MAPS_PROPERTY = "compiler.useSourceMaps";
+ /**
+ * A configuration property indicating how large each script tag should be.
+ */
+ private static final String CHUNK_SIZE_PROPERTY = "iframe.linker.script.chunk.size";
/**
* File name for computeScriptBase.js.
@@ -80,45 +87,34 @@
protected static final String PROCESS_METAS_JS = "com/google/gwt/core/ext/linker/impl/processMetasOld.js";
/**
- * TODO(bobv): Move this class into c.g.g.core.linker when HostedModeLinker
- * goes away?
- */
-
- /**
- * A configuration property indicating how large each script tag should be.
- */
- private static final String CHUNK_SIZE_PROPERTY = "iframe.linker.script.chunk.size";
-
- /**
- * A configuration property that can be used to have the linker load from somewhere other than
- * {@link #FRAGMENT_SUBDIR}.
+ * A configuration property that can be used to have the linker load from
+ * somewhere other than {@link #FRAGMENT_SUBDIR}.
*/
private static final String PROP_FRAGMENT_SUBDIR_OVERRIDE = "iframe.linker.deferredjs.subdir";
+ protected static void replaceAll(StringBuffer buf, String search,
+ String replace) {
+ int len = search.length();
+ for (int pos = buf.indexOf(search); pos >= 0; pos = buf.indexOf(search,
+ pos + 1)) {
+ buf.replace(pos, pos + len, replace);
+ }
+ }
+
/**
- * Split a JavaScript string into multiple chunks, at statement boundaries. This method is made
- * default access for testing.
- *
- * @param ranges Describes where the statements are located within the JavaScript
- * code. If <code>null</code>, then return <code>js</code> unchanged.
- * @param js The JavaScript code to be split up.
- * @param charsPerChunk The number of characters to be put in each script tag.
+ * Split a JavaScript string into multiple chunks, at statement boundaries.
+ * This method is made default access for testing.
+ *
+ * @param ranges Describes where the statements are located within the
+ * JavaScript code. If <code>null</code>, then return <code>js</code>
+ * unchanged.
+ * @param js The JavaScript code to be split up.
+ * @param charsPerChunk The number of characters to be put in each script tag.
* @param scriptChunkSeparator The string to insert between chunks.
- * @param context
*/
public static String splitPrimaryJavaScript(StatementRanges ranges, String js,
- int charsPerChunk, String scriptChunkSeparator, LinkerContext context) {
- boolean useSourceMaps = false;
- for (SelectionProperty prop : context.getProperties()) {
- if (USE_SOURCE_MAPS_PROPERTY.equals(prop.getName())) {
- String str = prop.tryGetValue();
- useSourceMaps = str == null ? false : Boolean.parseBoolean(str);
- break;
- }
- }
-
- // TODO(cromwellian) enable chunking with sourcemaps
- if (charsPerChunk < 0 || ranges == null || useSourceMaps) {
+ int charsPerChunk, String scriptChunkSeparator) {
+ if (charsPerChunk < 0 || ranges == null) {
return js;
}
@@ -151,22 +147,13 @@
return sb.toString();
}
- protected static void replaceAll(StringBuffer buf, String search,
- String replace) {
- int len = search.length();
- for (int pos = buf.indexOf(search); pos >= 0; pos = buf.indexOf(search,
- pos + 1)) {
- buf.replace(pos, pos + len, replace);
- }
- }
-
private static char lastChar(StringBuilder sb) {
return sb.charAt(sb.length() - 1);
}
/**
- * This method is left in place for existing subclasses of SelectionScriptLinker that have not
- * been upgraded for the sharding API.
+ * This method is left in place for existing subclasses of
+ * SelectionScriptLinker that have not been upgraded for the sharding API.
*/
@Override
public ArtifactSet link(TreeLogger logger, LinkerContext context,
@@ -182,26 +169,15 @@
throws UnableToCompleteException {
if (onePermutation) {
ArtifactSet toReturn = new ArtifactSet(artifacts);
- ArtifactSet writableArtifacts = new ArtifactSet(artifacts);
/*
* Support having multiple compilation results because this method is also
* called from the legacy link method.
*/
for (CompilationResult compilation : toReturn.find(CompilationResult.class)) {
- // pass a writable set so that other stages can use this set for temporary storage
- toReturn.addAll(doEmitCompilation(logger, context, compilation, writableArtifacts));
+ toReturn.addAll(doEmitCompilation(logger, context, compilation, artifacts));
maybeAddHostedModeFile(logger, context, toReturn, compilation);
}
- /*
- * Find edit artifacts added during linking and add them. This is done as a way of returning
- * arbitrary extra outputs from within the linker methods without having to modify
- * their return signatures to pass extra return data around.
- */
- for (SymbolMapsLinker.ScriptFragmentEditsArtifact ea : writableArtifacts.find(
- SymbolMapsLinker.ScriptFragmentEditsArtifact.class)) {
- toReturn.add(ea);
- }
return toReturn;
} else {
permutationsUtil.setupPermutationsMap(artifacts);
@@ -222,8 +198,8 @@
}
/**
- * Extract via {@link #CHUNK_SIZE_PROPERTY} the number of characters to be included in each
- * chunk.
+ * Extract via {@link #CHUNK_SIZE_PROPERTY} the number of characters to be
+ * included in each chunk.
*/
protected int charsPerChunk(LinkerContext context, TreeLogger logger) {
SortedSet<ConfigurationProperty> configProps = context.getConfigurationProperties();
@@ -247,10 +223,9 @@
String[] js = result.getJavaScript();
byte[][] bytes = new byte[js.length][];
bytes[0] = generatePrimaryFragment(logger, context, result, js, artifacts);
-
for (int i = 1; i < js.length; i++) {
- bytes[i] = Util.getBytes(generateDeferredFragment(logger, context, i, js[i], artifacts,
- result));
+ bytes[i] = Util.getBytes(generateDeferredFragment(logger, context, i,
+ js[i]));
}
Collection<Artifact<?>> toReturn = new ArrayList<Artifact<?>>();
@@ -262,6 +237,7 @@
}
toReturn.addAll(emitSelectionInformation(result.getStrongName(), result));
+
return toReturn;
}
@@ -284,10 +260,10 @@
return emitString(logger, ss, context.getModuleName()
+ ".nocache.js", lastModified);
}
-
+
/**
- * Generate a selection script. The selection information should previously have been scanned
- * using {@link PermutationsUtil#setupPermutationsMap(ArtifactSet)}.
+ * Generate a selection script. The selection information should previously
+ * have been scanned using {@link PermutationsUtil#setupPermutationsMap(ArtifactSet)}.
*/
protected String fillSelectionScriptTemplate(StringBuffer selectionScript,
TreeLogger logger, LinkerContext context, ArtifactSet artifacts,
@@ -305,10 +281,10 @@
}
replaceAll(selectionScript, "__COMPUTE_SCRIPT_BASE__", computeScriptBase);
replaceAll(selectionScript, "__PROCESS_METAS__", processMetas);
-
+
selectionScript = ResourceInjectionUtil.injectResources(selectionScript, artifacts);
permutationsUtil.addPermutationsJs(selectionScript, logger, context);
-
+
replaceAll(selectionScript, "__MODULE_FUNC__",
context.getModuleFunctionName());
replaceAll(selectionScript, "__MODULE_NAME__", context.getModuleName());
@@ -316,98 +292,71 @@
return selectionScript.toString();
}
-
+
/**
- * @param logger a TreeLogger
- * @param context a LinkerContext
+ * @param logger a TreeLogger
+ * @param context a LinkerContext
* @param fragment the fragment number
*/
protected String generateDeferredFragment(TreeLogger logger,
- LinkerContext context, int fragment, String js, ArtifactSet artifacts,
- CompilationResult result)
- throws UnableToCompleteException {
- StringBuilder b = new StringBuilder();
- String strongName = result == null ? "" : result.getStrongName();
- String prefix = getDeferredFragmentPrefix(logger, context, fragment);
- b.append(prefix);
- b.append(js);
- b.append(getDeferredFragmentSuffix(logger, context, fragment));
- SymbolMapsLinker.ScriptFragmentEditsArtifact editsArtifact
- = new SymbolMapsLinker.ScriptFragmentEditsArtifact(strongName, fragment);
- editsArtifact.prefixLines(prefix);
- artifacts.add(editsArtifact);
- return wrapDeferredFragment(logger, context, fragment, b.toString(), artifacts);
+ LinkerContext context, int fragment, String js) {
+ return js;
}
/**
- * Generate the primary fragment. The default implementation is based on {@link
- * #getModulePrefix(TreeLogger, LinkerContext, String, int)} and {@link
- * #getModuleSuffix(TreeLogger, LinkerContext)}.
+ * Generate the primary fragment. The default implementation is based on
+ * {@link #getModulePrefix(TreeLogger, LinkerContext, String, int)} and
+ * {@link #getModuleSuffix(TreeLogger, LinkerContext)}.
*/
protected byte[] generatePrimaryFragment(TreeLogger logger,
LinkerContext context, CompilationResult result, String[] js,
ArtifactSet artifacts) throws UnableToCompleteException {
TextOutput to = new DefaultTextOutput(context.isOutputCompact());
String temp = splitPrimaryJavaScript(result.getStatementRanges()[0], js[0],
- charsPerChunk(context, logger), getScriptChunkSeparator(logger, context), context);
+ charsPerChunk(context, logger), getScriptChunkSeparator(logger, context));
to.print(generatePrimaryFragmentString(
logger, context, result, temp, js.length, artifacts));
return Util.getBytes(to.toString());
}
-
+
protected String generatePrimaryFragmentString(TreeLogger logger,
LinkerContext context, CompilationResult result, String js, int length,
- ArtifactSet artifacts)
- throws UnableToCompleteException {
+ ArtifactSet artifacts)
+ throws UnableToCompleteException {
StringBuffer b = new StringBuffer();
String strongName = result == null ? "" : result.getStrongName();
-
- String modulePrefix = getModulePrefix(logger, context, strongName, length);
- SymbolMapsLinker.ScriptFragmentEditsArtifact editsArtifact
- = new SymbolMapsLinker.ScriptFragmentEditsArtifact(strongName, 0);
- editsArtifact.prefixLines(modulePrefix);
- artifacts.add(editsArtifact);
- b.append(modulePrefix);
+ b.append(getModulePrefix(logger, context, strongName, length));
b.append(js);
b.append(getModuleSuffix(logger, context));
return wrapPrimaryFragment(logger, context, b.toString(), artifacts, result);
}
-
+
protected String generateSelectionScript(TreeLogger logger,
LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException {
return generateSelectionScript(logger, context, artifacts, null);
}
-
+
protected String generateSelectionScript(TreeLogger logger,
- LinkerContext context, ArtifactSet artifacts, CompilationResult result)
- throws UnableToCompleteException {
+ LinkerContext context, ArtifactSet artifacts, CompilationResult result)
+ throws UnableToCompleteException {
String selectionScriptText;
StringBuffer buffer = readFileToStringBuffer(
- getSelectionScriptTemplate(logger, context), logger);
+ getSelectionScriptTemplate(logger,context), logger);
selectionScriptText = fillSelectionScriptTemplate(
buffer, logger, context, artifacts, result);
selectionScriptText =
- context.optimizeJavaScript(logger, selectionScriptText);
+ context.optimizeJavaScript(logger, selectionScriptText);
return selectionScriptText;
}
-
+
protected abstract String getCompilationExtension(TreeLogger logger,
LinkerContext context) throws UnableToCompleteException;
- protected String getDeferredFragmentPrefix(TreeLogger logger, LinkerContext context,
- int fragment) {
- return "";
- }
-
- protected String getDeferredFragmentSuffix(TreeLogger logger, LinkerContext context,
- int fragment) {
- return "";
- }
-
/**
- * Returns the subdirectory name to be used by getModulPrefix when requesting a runAsync module.
- * It is specified by {@link #PROP_FRAGMENT_SUBDIR_OVERRIDE} and, aside from test cases, is always
- * {@link #FRAGMENT_SUBDIR}.
+ * Returns the subdirectory name to be used by getModulPrefix when requesting
+ * a runAsync module. It is specified by
+ * {@link #PROP_FRAGMENT_SUBDIR_OVERRIDE} and, aside from test cases, is
+ * always {@link #FRAGMENT_SUBDIR}.
*/
protected final String getFragmentSubdir(TreeLogger logger,
LinkerContext context) throws UnableToCompleteException {
@@ -426,25 +375,27 @@
return subdir;
}
-
+
protected String getHostedFilename() {
return "";
}
-
+
/**
- * Compute the beginning of a JavaScript file that will hold the main module implementation.
+ * Compute the beginning of a JavaScript file that will hold the main module
+ * implementation.
*/
protected abstract String getModulePrefix(TreeLogger logger,
LinkerContext context, String strongName)
throws UnableToCompleteException;
-
+
/**
- * Compute the beginning of a JavaScript file that will hold the main module implementation. By
- * default, calls {@link #getModulePrefix(TreeLogger, LinkerContext, String)}.
- *
- * @param strongName strong name of the module being emitted
- * @param numFragments the number of fragments for this module, including the main fragment
- * (fragment 0)
+ * Compute the beginning of a JavaScript file that will hold the main module
+ * implementation. By default, calls
+ * {@link #getModulePrefix(TreeLogger, LinkerContext, String)}.
+ *
+ * @param strongName strong name of the module being emitted
+ * @param numFragments the number of fragments for this module, including the
+ * main fragment (fragment 0)
*/
protected String getModulePrefix(TreeLogger logger, LinkerContext context,
String strongName, int numFragments) throws UnableToCompleteException {
@@ -455,9 +406,9 @@
LinkerContext context) throws UnableToCompleteException;
/**
- * Some subclasses support "chunking" of the primary fragment. If chunking will be supported, this
- * function should be overridden to return the string which should be inserted between each
- * chunk.
+ * Some subclasses support "chunking" of the primary fragment. If chunking will
+ * be supported, this function should be overridden to return the string which
+ * should be inserted between each chunk.
*/
protected String getScriptChunkSeparator(TreeLogger logger, LinkerContext context) {
return "";
@@ -465,11 +416,11 @@
protected abstract String getSelectionScriptTemplate(TreeLogger logger,
LinkerContext context) throws UnableToCompleteException;
-
+
/**
* Add the Development Mode file to the artifact set.
*/
- protected void maybeAddHostedModeFile(TreeLogger logger,
+ protected void maybeAddHostedModeFile(TreeLogger logger,
LinkerContext context, ArtifactSet artifacts, CompilationResult result)
throws UnableToCompleteException {
String hostedFilename = getHostedFilename();
@@ -528,12 +479,6 @@
return buffer;
}
- protected String wrapDeferredFragment(TreeLogger logger,
- LinkerContext context, int fragment, String script, ArtifactSet artifacts)
- throws UnableToCompleteException {
- return script;
- }
-
protected String wrapPrimaryFragment(TreeLogger logger,
LinkerContext context, String script, ArtifactSet artifacts,
CompilationResult result) throws UnableToCompleteException {
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
index d1344a6..78cfb0c 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
@@ -57,7 +57,6 @@
}
private String className;
- private int fragmentNumber = -1;
private String memberName;
private String methodSig;
private int sourceLine;
@@ -92,10 +91,6 @@
return className;
}
- public int getFragmentNumber() {
- return fragmentNumber;
- }
-
public String getJsniIdent() {
if (memberName == null) {
return null;
@@ -142,10 +137,6 @@
return methodSig != null;
}
- public void setFragmentNumber(int fragNum) {
- fragmentNumber = fragNum;
- }
-
public void setSymbolName(String symbolName) {
this.symbolName = symbolName;
}
@@ -177,7 +168,6 @@
queryId = in.readInt();
castableTypeMap = (CastableTypeMap) in.readObject();
seedId = in.readInt();
- fragmentNumber = in.readInt();
}
/**
@@ -207,7 +197,5 @@
out.writeInt(queryId);
out.writeObject(castableTypeMap);
out.writeInt(seedId);
- out.writeInt(fragmentNumber);
}
-
}
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js
index d7e56f0..2417267 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js
@@ -8,48 +8,21 @@
__WAIT_FOR_BODY_LOADED__
function installCode(code) {
- function removeScript(body, element) {
+ var docbody = getInstallLocation();
+ for (var i = 0; i < code.length; i++) {
+ var script = getInstallLocationDoc().createElement('script');
+ script.language='javascript';
+ script.text = code[i];
+ docbody.appendChild(script);
+
// Unless we're in pretty mode, remove the tags to shrink the DOM a little.
// It should have installed its code immediately after being added.
-
__START_OBFUSCATED_ONLY__
- body.removeChild(element);
+ docbody.removeChild(script);
__END_OBFUSCATED_ONLY__
}
-
- var docbody = getInstallLocation();
- var doc = getInstallLocationDoc();
- var script;
- // for sourcemaps, we inject textNodes into the script element on Chrome
- if (navigator.userAgent.indexOf("Chrome") > -1 && window.JSON) {
- var scriptFrag = doc.createDocumentFragment()
- // surround code with eval until crbug #90707
- scriptFrag.appendChild(doc.createTextNode("eval(\""));
- for (var i = 0; i < code.length; i++) {
- // escape newlines, backslashes, and quotes with JSON.stringify
- // rather than create multiple script tags which mess up line numbers, we use 1 tag, multiple text nodes
- var c = window.JSON.stringify(code[i]);
- // trim beginning/end quotes
- scriptFrag.appendChild(doc.createTextNode(c.substring(1, c.length - 1)));
- }
- // close the eval
- scriptFrag.appendChild(doc.createTextNode("\");"));
- script = doc.createElement('script');
- script.language='javascript';
- script.appendChild(scriptFrag);
- docbody.appendChild(script);
- removeScript(docbody, script);
- } else {
- for (var i = 0; i < code.length; i++) {
- script = doc.createElement('script');
- script.language='javascript';
- script.text = code[i];
- docbody.appendChild(script);
- removeScript(docbody, script);
- }
- }
}
-
+
// Set up a script tag to start downloading immediately, as well as a
// callback to install the code once it is downloaded and the body is loaded.
__MODULE_FUNC__.onScriptDownloaded = function(code) {
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js
index 52ad608..9375003 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js
@@ -7,48 +7,21 @@
__WAIT_FOR_BODY_LOADED__
function installCode(code) {
- function removeScript(body, element) {
+ var docbody = getInstallLocation();
+ for (var i = 0; i < code.length; i++) {
+ var script = getInstallLocationDoc().createElement('script');
+ script.language='javascript';
+ script.text = code[i];
+ docbody.appendChild(script);
+
// Unless we're in pretty mode, remove the tags to shrink the DOM a little.
// It should have installed its code immediately after being added.
-
__START_OBFUSCATED_ONLY__
- body.removeChild(element);
+ docbody.removeChild(script);
__END_OBFUSCATED_ONLY__
}
-
- var docbody = getInstallLocation();
- var doc = getInstallLocationDoc();
- var script;
- // for sourcemaps, we inject textNodes into the script element on Chrome
- if (navigator.userAgent.indexOf("Chrome") > -1 && window.JSON) {
- var scriptFrag = doc.createDocumentFragment()
- // surround code with eval until crbug #90707
- scriptFrag.appendChild(doc.createTextNode("eval(\""));
- for (var i = 0; i < code.length; i++) {
- // escape newlines, backslashes, and quotes with JSON.stringify
- // rather than create multiple script tags which mess up line numbers, we use 1 tag, multiple text nodes
- var c = window.JSON.stringify(code[i]);
- // trim beginning/end quotes
- scriptFrag.appendChild(doc.createTextNode(c.substring(1, c.length - 1)));
- }
- // close the eval
- scriptFrag.appendChild(doc.createTextNode("\");"));
- script = doc.createElement('script');
- script.language='javascript';
- script.appendChild(scriptFrag);
- docbody.appendChild(script);
- removeScript(docbody, script);
- } else {
- for (var i = 0; i < code.length; i++) {
- script = doc.createElement('script');
- script.language='javascript';
- script.text = code[i];
- docbody.appendChild(script);
- removeScript(docbody, script);
- }
- }
}
-
+
// Set up a script tag to start downloading immediately, as well as a
// callback to install the code once it is downloaded and the body is loaded.
__MODULE_FUNC__.onScriptDownloaded = function(code) {
diff --git a/dev/core/src/com/google/gwt/core/ext/soyc/Range.java b/dev/core/src/com/google/gwt/core/ext/soyc/Range.java
index 9239310..f98fe68 100644
--- a/dev/core/src/com/google/gwt/core/ext/soyc/Range.java
+++ b/dev/core/src/com/google/gwt/core/ext/soyc/Range.java
@@ -55,21 +55,7 @@
};
final int end;
- final int endLine;
- final int endColumn;
final int start;
- final int startLine;
- final int startColumn;
-
- /**
- * Constructor.
- *
- * @param start must be non-negative
- * @param end must be greater than or equal to <code>start</code>
- */
- public Range(int start, int end) {
- this(start, end, 0, 0, 0, 0);
- }
/**
* Constructor.
@@ -77,17 +63,11 @@
* @param start must be non-negative
* @param end must be greater than or equal to <code>start</code>
*/
- public Range(int start, int end, int startLine, int startColumn, int endLine, int endColumn) {
-
+ public Range(int start, int end) {
assert start >= 0;
assert start <= end;
-
this.start = start;
this.end = end;
- this.startLine = startLine;
- this.startColumn = startColumn;
- this.endLine = endLine;
- this.endColumn = endColumn;
}
/**
@@ -110,26 +90,10 @@
return end;
}
- public int getEndColumn() {
- return endColumn;
- }
-
- public int getEndLine() {
- return endLine;
- }
-
public int getStart() {
return start;
}
- public int getStartColumn() {
- return startColumn;
- }
-
- public int getStartLine() {
- return startLine;
- }
-
@Override
public int hashCode() {
return 37 * start + end;
diff --git a/dev/core/src/com/google/gwt/core/ext/soyc/SourceMapRecorder.java b/dev/core/src/com/google/gwt/core/ext/soyc/SourceMapRecorder.java
deleted file mode 100644
index 6251b91..0000000
--- a/dev/core/src/com/google/gwt/core/ext/soyc/SourceMapRecorder.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.core.ext.soyc;
-
-import com.google.debugging.sourcemap.FilePosition;
-import com.google.debugging.sourcemap.SourceMapFormat;
-import com.google.debugging.sourcemap.SourceMapGenerator;
-import com.google.debugging.sourcemap.SourceMapGeneratorFactory;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
-import com.google.gwt.core.linker.SymbolMapsLinker;
-import com.google.gwt.dev.jjs.InternalCompilerException;
-import com.google.gwt.dev.jjs.SourceInfo;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Creates Closure Compatible SourceMaps.
- */
-public class SourceMapRecorder {
-
- public static List<SyntheticArtifact> makeSourceMapArtifacts(
- List<Map<Range, SourceInfo>> sourceInfoMaps,
- int permutationId) {
- List<SyntheticArtifact> toReturn = new ArrayList<SyntheticArtifact>();
- recordSourceMap(sourceInfoMaps, toReturn, permutationId);
- return toReturn;
- }
-
- public static void recordSourceMap(List<Map<Range, SourceInfo>> sourceInfoMaps,
- List<SyntheticArtifact> artifacts, int permutationId) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- SourceMapGenerator generator = SourceMapGeneratorFactory.getInstance(SourceMapFormat.V3);
- OutputStreamWriter out = new OutputStreamWriter(baos);
- int fragment = 0;
- if (!sourceInfoMaps.isEmpty()) {
- for (Map<Range, SourceInfo> sourceMap : sourceInfoMaps) {
- generator.reset();
- Set<Range> rangeSet = sourceMap.keySet();
- Range[] ranges = rangeSet.toArray(new Range[rangeSet.size()]);
- Arrays.sort(ranges, Range.DEPENDENCY_ORDER_COMPARATOR);
- for (Range r : ranges) {
- SourceInfo si = sourceMap.get(r);
- if (si.getFileName() == null || si.getStartLine() < 0) {
- // skip over synthetics with no Java source
- continue;
- }
- if (r.getStartLine() == 0 || r.getEndLine() == 0) {
- // or other bogus entries that appear
- continue;
- }
- generator.addMapping(si.getFileName(), null,
- new FilePosition(si.getStartLine(), 0),
- new FilePosition(r.getStartLine(), r.getStartColumn()),
- new FilePosition(r.getEndLine(), r.getEndColumn()));
- }
- try {
- baos.reset();
- generator.appendTo(out, "sourceMap" + fragment);
- out.flush();
- artifacts.add(new SymbolMapsLinker.SourceMapArtifact(permutationId, fragment,
- baos.toByteArray()));
- fragment++;
- } catch (IOException e) {
- throw new InternalCompilerException(e.toString(), e);
- }
- }
- }
- }
-}
diff --git a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
index 1c74cf1..4635518 100644
--- a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
@@ -61,6 +61,22 @@
private static final String FAIL_IF_SCRIPT_TAG_PROPERTY = "xsiframe.failIfScriptTag";
@Override
+ protected String generateDeferredFragment(TreeLogger logger,
+ LinkerContext context, int fragment, String js) {
+ // TODO(unnurg): This assumes that the xsiframe linker is using the
+ // ScriptTagLoadingStrategy (since it is also xs compatible). However,
+ // it should be completely valid to use the XhrLoadingStrategy with this
+ // linker, in which case we would not want to wrap the deferred fragment
+ // in this way. Ideally, we should make a way for this code to be dependent
+ // on what strategy is being used. Otherwise, we should make a property which
+ // users can set to turn this wrapping off if they override the loading strategy.
+ return String.format("$wnd.%s.runAsyncCallback%d(%s)\n",
+ context.getModuleFunctionName(),
+ fragment,
+ JsToStringGenerationVisitor.javaScriptString(js));
+ }
+
+ @Override
public String getDescription() {
return "Cross-Site-Iframe";
}
@@ -87,7 +103,7 @@
// Must do permutations before providers
includeJs(ss, logger, getJsPermutations(context), "__PERMUTATIONS__");
includeJs(ss, logger, getJsProperties(context), "__PROPERTIES__");
-
+
// Order doesn't matter for the rest
includeJs(ss, logger, getJsProcessMetas(context), "__PROCESS_METAS__");
includeJs(ss, logger, getJsInstallLocation(context), "__INSTALL_LOCATION__");
@@ -173,11 +189,6 @@
return ".cache.js";
}
- protected String getDeferredFragmentSuffix(TreeLogger logger, LinkerContext context,
- int fragment) {
- return "\n//@ sourceURL=" + fragment + ".js\n";
- }
-
@Override
protected String getHostedFilename() {
return "devmode.js";
@@ -292,7 +303,7 @@
protected String getJsProperties(LinkerContext context) {
return "com/google/gwt/core/ext/linker/impl/properties.js";
}
-
+
/**
* Returns the name of the {@code JsRunAsync} script. By default,
* returns {@code "com/google/gwt/core/ext/linker/impl/runAsync.js"}.
@@ -351,7 +362,7 @@
out.newlineOpt();
out.print("function __gwtInstallCode(code) {return __gwtModuleFunction.__installRunAsyncCode(code);}");
out.newlineOpt();
-
+
// Even though we call the $sendStats function in the code written in this
// linker, some of the compilation code still needs the $stats and
// $sessionId
@@ -375,7 +386,7 @@
+ "__gwtModuleFunction.__computePropValue);");
out.newlineOpt();
out.print("$sendStats('moduleStartup', 'end');");
- out.print("\n//@ sourceURL=0.js\n");
+
return out.toString();
}
@@ -495,22 +506,6 @@
}
@Override
- protected String wrapDeferredFragment(TreeLogger logger,
- LinkerContext context, int fragment, String js, ArtifactSet artifacts) {
- // TODO(unnurg): This assumes that the xsiframe linker is using the
- // ScriptTagLoadingStrategy (since it is also xs compatible). However,
- // it should be completely valid to use the XhrLoadingStrategy with this
- // linker, in which case we would not want to wrap the deferred fragment
- // in this way. Ideally, we should make a way for this code to be dependent
- // on what strategy is being used. Otherwise, we should make a property which
- // users can set to turn this wrapping off if they override the loading strategy.
- return String.format("$wnd.%s.runAsyncCallback%d(%s)\n",
- context.getModuleFunctionName(),
- fragment,
- JsToStringGenerationVisitor.javaScriptString(js));
- }
-
- @Override
protected String wrapPrimaryFragment(TreeLogger logger, LinkerContext context, String script,
ArtifactSet artifacts, CompilationResult result) throws UnableToCompleteException {
StringBuffer out = new StringBuffer();
@@ -534,4 +529,5 @@
}
return out.toString();
}
+
}
diff --git a/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java b/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
index fae5c92..ded6042 100644
--- a/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
@@ -1,12 +1,12 @@
/*
* Copyright 2008 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -18,12 +18,15 @@
import com.google.gwt.core.ext.LinkerContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.linker.ArtifactSet;
+import com.google.gwt.core.ext.linker.CompilationResult;
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.impl.SelectionScriptLinker;
import com.google.gwt.dev.About;
import com.google.gwt.dev.util.DefaultTextOutput;
+import com.google.gwt.dev.util.Util;
/**
* Implements the canonical GWT bootstrap sequence that loads the GWT module in
@@ -43,6 +46,26 @@
return "Standard";
}
+ /*
+ * This implementation divides the code of the initial fragment into multiple
+ * script tags. These chunked script tags loads faster on Firefox even when
+ * the data is cached. Additionally, having the script tags separated means
+ * that the early ones can be evaluated before the later ones have finished
+ * downloading. As a result of this parallelism, the overall time to get the
+ * JavaScript downloaded and evaluated can lower.
+ */
+ @Override
+ protected byte[] generatePrimaryFragment(TreeLogger logger,
+ LinkerContext context, CompilationResult result, String[] js,
+ ArtifactSet artifacts) throws UnableToCompleteException {
+ StringBuffer b = new StringBuffer();
+ b.append(getModulePrefix(logger, context, result.getStrongName(), js.length));
+ b.append(splitPrimaryJavaScript(result.getStatementRanges()[0], js[0],
+ charsPerChunk(context, logger), getScriptChunkSeparator(logger, context)));
+ b.append(getModuleSuffix(logger, context));
+ return Util.getBytes(b.toString());
+ }
+
@Override
protected String getCompilationExtension(TreeLogger logger,
LinkerContext context) {
@@ -95,7 +118,7 @@
protected String getSelectionScriptTemplate(TreeLogger logger, LinkerContext context) {
return "com/google/gwt/core/linker/IFrameTemplate.js";
}
-
+
protected String modifyPrimaryJavaScript(String js) {
return js;
}
diff --git a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
index 1ea76e1..5dc937e 100644
--- a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
@@ -1,12 +1,12 @@
/*
* Copyright 2009 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,176 +15,39 @@
*/
package com.google.gwt.core.linker;
-import com.google.debugging.sourcemap.SourceMapGeneratorV3;
import com.google.gwt.core.ext.LinkerContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.linker.AbstractLinker;
-import com.google.gwt.core.ext.linker.Artifact;
import com.google.gwt.core.ext.linker.ArtifactSet;
import com.google.gwt.core.ext.linker.CompilationResult;
import com.google.gwt.core.ext.linker.EmittedArtifact;
import com.google.gwt.core.ext.linker.EmittedArtifact.Visibility;
import com.google.gwt.core.ext.linker.LinkerOrder;
-import com.google.gwt.core.ext.linker.LinkerOrder.Order;
import com.google.gwt.core.ext.linker.SelectionProperty;
import com.google.gwt.core.ext.linker.Shardable;
import com.google.gwt.core.ext.linker.SymbolData;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
-import com.google.gwt.dev.util.Util;
-import com.google.gwt.dev.util.collect.HashMap;
+import com.google.gwt.core.ext.linker.LinkerOrder.Order;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Map;
import java.util.SortedMap;
/**
- * This Linker exports the symbol maps associated with each compilation result as a private file.
- * The names of the symbol maps files are computed by appending {@value #STRONG_NAME_SUFFIX} to the
- * value returned by {@link CompilationResult#getStrongName()}.
+ * This Linker exports the symbol maps associated with each compilation result
+ * as a private file. The names of the symbol maps files are computed by
+ * appending {@value #STRONG_NAME_SUFFIX} to the value returned by
+ * {@link CompilationResult#getStrongName()}.
*/
@LinkerOrder(Order.POST)
@Shardable
public class SymbolMapsLinker extends AbstractLinker {
-
/**
- * Artifact to record insertions or deletions made to Javascript fragments.
- */
- public static class ScriptFragmentEditsArtifact extends Artifact<ScriptFragmentEditsArtifact> {
-
- /**
- * Operation type performed on script.
- */
- public enum Edit {
- PREFIX, INSERT, REMOVE;
- }
-
- private static class EditOperation {
-
- public static EditOperation insert(int lineNumber, String data) {
- return new EditOperation(Edit.INSERT, lineNumber, data);
- }
-
- public static EditOperation prefix(String data) {
- return new EditOperation(Edit.PREFIX, 0, data);
- }
-
- public static EditOperation remove(int lineNumber) {
- return new EditOperation(Edit.REMOVE, lineNumber, null);
- }
-
- Edit op;
- int lineNumber;
- int numLines;
-
- public EditOperation(
- Edit op, int lineNumber, String data) {
- this.op = op;
- this.lineNumber = lineNumber;
- this.numLines = countNewLines(data);
- }
-
- public int getLineNumber() {
- return lineNumber;
- }
-
- public int getNumLines() {
- return numLines;
- }
-
- public Edit getOp() {
- return op;
- }
-
- private int countNewLines(String chunkJs) {
- int newLineCount = 0;
- for (int j = 0; j < chunkJs.length(); j++) {
- if (chunkJs.charAt(j) == '\n') {
- newLineCount++;
- }
- }
- return newLineCount;
- }
- }
-
- private List<EditOperation> editOperations = new ArrayList<EditOperation>();
-
- private String strongName;
- private int fragment;
-
- public ScriptFragmentEditsArtifact(String strongName,
- int fragment) {
- super(SymbolMapsLinker.class);
- this.strongName = strongName;
- this.fragment = fragment;
- }
-
- public int getFragment() {
- return fragment;
- }
-
- public String getStrongName() {
- return strongName;
- }
-
- @Override
- public int hashCode() {
- return (strongName + fragment).hashCode();
- }
-
- public void insertLinesBefore(int position, String lines) {
- editOperations.add(EditOperation.insert(position, lines));
- }
-
- public void prefixLines(String lines) {
- editOperations.add(EditOperation.prefix(lines));
- }
-
- @Override
- protected int compareToComparableArtifact(SymbolMapsLinker.ScriptFragmentEditsArtifact o) {
- int result = (strongName + fragment).compareTo(strongName + fragment);
- return result;
- }
-
- @Override
- protected Class<ScriptFragmentEditsArtifact> getComparableArtifactType() {
- return ScriptFragmentEditsArtifact.class;
- }
- }
-
- /**
- * Artifact to represent a sourcemap file to be processed by SymbolMapsLinker.
- */
- public static class SourceMapArtifact extends SyntheticArtifact {
-
- private int permutationId;
- private int fragment;
- private byte[] js;
-
- public SourceMapArtifact(int permutationId, int fragment, byte[] js) {
- super(SymbolMapsLinker.class, permutationId + "/sourceMap" + fragment + ".json", js);
- this.permutationId = permutationId;
- this.fragment = fragment;
- this.js = js;
- }
-
- public int getFragment() {
- return fragment;
- }
-
- public int getPermutationId() {
- return permutationId;
- }
- }
-
- /**
- * This value is appended to the strong name of the CompilationResult to form the symbol map's
- * filename.
+ * This value is appended to the strong name of the CompilationResult to form
+ * the symbol map's filename.
*/
public static final String STRONG_NAME_SUFFIX = ".symbolMap";
@@ -235,59 +98,17 @@
throws UnableToCompleteException {
if (onePermutation) {
artifacts = new ArtifactSet(artifacts);
- Map<Integer, String> permMap = new HashMap<Integer, String>();
+
ByteArrayOutputStream out = new ByteArrayOutputStream();
for (CompilationResult result : artifacts.find(CompilationResult.class)) {
PrintWriter pw = new PrintWriter(out);
- permMap.put(result.getPermutationId(), result.getStrongName());
+
doWriteSymbolMap(logger, result, pw);
pw.close();
doEmitSymbolMap(logger, artifacts, result, out);
out.reset();
}
-
- for (SourceMapArtifact se : artifacts.find(SourceMapArtifact.class)) {
- // filename is permutation_id/sourceMap<fragmentNumber>.json
- String sourceMapString = Util.readStreamAsString(se.getContents(logger));
- String strongName = permMap.get(se.getPermutationId());
- String partialPath = strongName + "_sourceMap" + se.getFragment() + ".json";
-
- int fragment = se.getFragment();
- ScriptFragmentEditsArtifact editArtifact = null;
- for (ScriptFragmentEditsArtifact mp : artifacts.find(ScriptFragmentEditsArtifact.class)) {
- if (mp.getStrongName().equals(strongName) && mp.getFragment() == fragment) {
- editArtifact = mp;
- artifacts.remove(editArtifact);
- break;
- }
- }
-
- SyntheticArtifact emArt = null;
- // no need to adjust source map
- if (editArtifact == null) {
- emArt = emitSourceMapString(logger, sourceMapString, partialPath);
- } else {
- SourceMapGeneratorV3 sourceMapGenerator = new SourceMapGeneratorV3();
- try {
- int totalPrefixLines = 0;
- for (ScriptFragmentEditsArtifact.EditOperation op : editArtifact.editOperations) {
- if (op.getOp() == ScriptFragmentEditsArtifact.Edit.PREFIX) {
- totalPrefixLines += op.getNumLines();
- }
- }
- // TODO(cromwellian): apply insert and remove edits
- sourceMapGenerator.mergeMapSection(totalPrefixLines, 0, sourceMapString);
- StringWriter stringWriter = new StringWriter();
- sourceMapGenerator.appendTo(stringWriter, "sourceMap");
- emArt = emitSourceMapString(logger, stringWriter.toString(), partialPath);
- } catch (Exception e) {
- logger.log(TreeLogger.Type.WARN, "Can't write source map " + partialPath, e);
- }
- }
- artifacts.add(emArt);
- artifacts.remove(se);
- }
}
return artifacts;
}
@@ -307,10 +128,11 @@
/**
* Override to change the format of the symbol map.
- *
+ *
* @param logger the logger to write to
* @param result the compilation result
- * @param pw the output PrintWriter
+ * @param pw the output PrintWriter
+ *
* @throws UnableToCompleteException if an error occurs
*/
protected void doWriteSymbolMap(TreeLogger logger, CompilationResult result,
@@ -323,7 +145,7 @@
pw.println(" }");
}
- pw.println("# jsName, jsniIdent, className, memberName, sourceUri, sourceLine, fragmentNumber");
+ pw.println("# jsName, jsniIdent, className, memberName, sourceUri, sourceLine");
StringBuilder sb = new StringBuilder(1024);
char[] buf = new char[1024];
for (SymbolData symbol : result.getSymbolMap()) {
@@ -348,8 +170,6 @@
}
sb.append(',');
sb.append(symbol.getSourceLine());
- sb.append(',');
- sb.append(symbol.getFragmentNumber());
sb.append('\n');
int sbLen = sb.length();
@@ -365,11 +185,4 @@
sb.setLength(0);
}
}
-
- protected SyntheticArtifact emitSourceMapString(TreeLogger logger, String contents,
- String partialPath) throws UnableToCompleteException {
- SyntheticArtifact emArt = emitString(logger, contents, partialPath);
- emArt.setVisibility(Visibility.LegacyDeploy);
- return emArt;
- }
}
diff --git a/dev/core/src/com/google/gwt/core/linker/XSLinker.java b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
index b6b2641..1ffc1f6 100644
--- a/dev/core/src/com/google/gwt/core/linker/XSLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
@@ -1,12 +1,12 @@
/*
* Copyright 2008 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -17,10 +17,9 @@
import com.google.gwt.core.ext.LinkerContext;
import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.linker.ArtifactSet;
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.LinkerOrder.Order;
import com.google.gwt.core.ext.linker.impl.SelectionScriptLinker;
import com.google.gwt.dev.About;
import com.google.gwt.dev.js.JsToStringGenerationVisitor;
@@ -38,6 +37,19 @@
}
@Override
+ protected String generateDeferredFragment(TreeLogger logger,
+ LinkerContext context, int fragment, String js) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(context.getModuleFunctionName());
+ sb.append(".runAsyncCallback");
+ sb.append(fragment);
+ sb.append("(");
+ sb.append(JsToStringGenerationVisitor.javaScriptString(js));
+ sb.append(");\n");
+ return sb.toString();
+ }
+
+ @Override
protected String getCompilationExtension(TreeLogger logger,
LinkerContext context) {
return ".cache.js";
@@ -82,15 +94,6 @@
return "com/google/gwt/core/linker/XSTemplate.js";
}
- @Override
- protected String wrapDeferredFragment(TreeLogger logger,
- LinkerContext context, int fragment, String js, ArtifactSet artifacts) {
- return String.format("%s.runAsyncCallback%d(%s)\n",
- context.getModuleFunctionName(),
- fragment,
- JsToStringGenerationVisitor.javaScriptString(js));
- }
-
private String getModulePrefix(LinkerContext context, String strongName,
boolean supportRunAsync) {
DefaultTextOutput out = new DefaultTextOutput(context.isOutputCompact());
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index c0bf87c..db7f4f7 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -32,7 +32,6 @@
import com.google.gwt.core.ext.linker.SyntheticArtifact;
import com.google.gwt.core.ext.linker.impl.StandardSymbolData;
import com.google.gwt.core.ext.soyc.Range;
-import com.google.gwt.core.ext.soyc.SourceMapRecorder;
import com.google.gwt.core.ext.soyc.impl.DependencyRecorder;
import com.google.gwt.core.ext.soyc.impl.SizeMapRecorder;
import com.google.gwt.core.ext.soyc.impl.SplitPointRecorder;
@@ -121,11 +120,8 @@
import com.google.gwt.dev.js.JsVerboseNamer;
import com.google.gwt.dev.js.SizeBreakdown;
import com.google.gwt.dev.js.ast.JsBlock;
-import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsFunction;
import com.google.gwt.dev.js.ast.JsName;
import com.google.gwt.dev.js.ast.JsProgram;
-import com.google.gwt.dev.js.ast.JsVisitor;
import com.google.gwt.dev.util.DefaultTextOutput;
import com.google.gwt.dev.util.Empty;
import com.google.gwt.dev.util.Memory;
@@ -148,7 +144,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -356,11 +351,21 @@
}
// detect if browser is ie6 or not known
- boolean isIE6orUnknown = findBooleanProperty(propertyOracles, logger, "user.agent", "ie6",
- true, false, true);
+ boolean isIE6orUnknown = false;
+ for (PropertyOracle oracle : propertyOracles) {
+ try {
+ SelectionProperty userAgentProperty = oracle.getSelectionProperty(logger, "user.agent");
+ if ("ie6".equals(userAgentProperty.getCurrentValue())) {
+ isIE6orUnknown = true;
+ break;
+ }
+ } catch (BadPropertyValueException e) {
+ // user agent unknown; play it safe
+ isIE6orUnknown = true;
+ break;
+ }
+ }
- boolean isSourceMapsEnabled = findBooleanProperty(propertyOracles, logger,
- "compiler.useSourceMaps", "true", true, false, false);
// (10.5) Obfuscate
Map<JsName, String> obfuscateMap = Maps.create();
switch (options.getOutput()) {
@@ -381,7 +386,7 @@
}
break;
case PRETTY:
- // We don't intern strings in pretty mode to imprmakeSouove readability
+ // We don't intern strings in pretty mode to improve readability
JsPrettyNamer.exec(jsProgram);
break;
case DETAILED:
@@ -416,12 +421,13 @@
SizeBreakdown[] sizeBreakdowns =
options.isSoycEnabled() || options.isCompilerMetricsEnabled()
? new SizeBreakdown[js.length] : null;
- List<Map<Range, SourceInfo>> sourceInfoMaps = new ArrayList<Map<Range, SourceInfo>>();
+ List<Map<Range, SourceInfo>> sourceInfoMaps =
+ options.isSoycExtra() ? new ArrayList<Map<Range, SourceInfo>>() : null;
generateJavaScriptCode(options, jsProgram, jjsmap, js, ranges, sizeBreakdowns,
- sourceInfoMaps, splitBlocks, isSourceMapsEnabled);
+ sourceInfoMaps, splitBlocks);
PermutationResult toReturn =
- new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable, jsProgram), ranges);
+ new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable), ranges);
CompilationMetricsArtifact compilationMetrics = null;
if (options.isCompilerMetricsEnabled()) {
compilationMetrics = new CompilationMetricsArtifact(permutation.getId());
@@ -435,15 +441,8 @@
.getPrecompilationMetrics(), compilationMetrics));
}
toReturn.addArtifacts(makeSoycArtifacts(logger, permutationId, jprogram, js, sizeBreakdowns,
- options.isSoycExtra() ? sourceInfoMaps : null, dependencies, jjsmap, obfuscateMap,
- unifiedAst.getModuleMetrics(), unifiedAst.getPrecompilationMetrics(), compilationMetrics,
- options.isSoycHtmlDisabled()));
-
- if (isSourceMapsEnabled) {
- logger.log(TreeLogger.INFO, "Source Maps Enabled");
- toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps,
- permutationId));
- }
+ sourceInfoMaps, dependencies, jjsmap, obfuscateMap, unifiedAst.getModuleMetrics(),
+ unifiedAst.getPrecompilationMetrics(), compilationMetrics, options.isSoycHtmlDisabled()));
logTrackingStats(logger);
if (logger.isLoggable(TreeLogger.TRACE)) {
@@ -458,29 +457,6 @@
}
}
- /**
- * Look for a selection property in all property oracles.
- */
- public static boolean findBooleanProperty(PropertyOracle[] propertyOracles, TreeLogger logger,
- String name, String valueToFind, boolean valueIfFound, boolean valueIfNotFound,
- boolean valueIfError) {
- boolean toReturn = valueIfNotFound;
- for (PropertyOracle oracle : propertyOracles) {
- try {
- SelectionProperty property = oracle.getSelectionProperty(logger, name);
- if (valueToFind.equals(property.getCurrentValue())) {
- toReturn = valueIfFound;
- break;
- }
- } catch (BadPropertyValueException e) {
- // unknown value play it safe
- toReturn = valueIfError;
- break;
- }
- }
- return toReturn;
- }
-
public static UnifiedAst precompile(TreeLogger logger, ModuleDef module,
RebindPermutationOracle rpo, String[] declEntryPts, String[] additionalRootTypes,
JJSOptions options, boolean singlePermutation) throws UnableToCompleteException {
@@ -960,22 +936,19 @@
* @param options The options this compiler instance is running with
* @param jsProgram The AST to convert to source code
* @param jjsMap A map between the JavaScript AST and the Java AST it came
-* from
+ * from
* @param js An array to hold the output JavaScript
* @param ranges An array to hold the statement ranges for that JavaScript
* @param sizeBreakdowns An array to hold the size breakdowns for that
-* JavaScript
+ * JavaScript
* @param sourceInfoMaps An array to hold the source info maps for that
-* JavaScript
+ * JavaScript
* @param splitBlocks true if current permutation is for IE6 or unknown
- * @param sourceMapsEnabled
*/
- private static void generateJavaScriptCode(JJSOptions options,
- JsProgram jsProgram,
+ private static void generateJavaScriptCode(JJSOptions options, JsProgram jsProgram,
JavaToJavaScriptMap jjsMap, String[] js, StatementRanges[] ranges,
- SizeBreakdown[] sizeBreakdowns,
- List<Map<Range, SourceInfo>> sourceInfoMaps,
- boolean splitBlocks, boolean sourceMapsEnabled) {
+ SizeBreakdown[] sizeBreakdowns, List<Map<Range, SourceInfo>> sourceInfoMaps,
+ boolean splitBlocks) {
for (int i = 0; i < js.length; i++) {
DefaultTextOutput out = new DefaultTextOutput(options.getOutput().shouldMinimize());
JsSourceGenerationVisitorWithSizeBreakdown v;
@@ -1007,18 +980,15 @@
* the top level blocks into sub-blocks if they exceed 32767 statements.
*/
Event functionClusterEvent = SpeedTracerLogger.start(CompilerEventType.FUNCTION_CLUSTER);
- // TODO(cromwellian) move to the Js AST, re-enable sourcemaps + clustering
- if (!sourceMapsEnabled
- && options.isAggressivelyOptimize()
- // only cluster for obfuscated mode
- && options.getOutput() == JsOutputOption.OBFUSCATED) {
+ // only cluster for obfuscated mode
+ if (options.isAggressivelyOptimize() && options.getOutput() == JsOutputOption.OBFUSCATED) {
transformer = new JsFunctionClusterer(transformer);
transformer.exec();
}
functionClusterEvent.end();
// rewrite top-level blocks to limit the number of statements
- if (!sourceMapsEnabled && splitBlocks) {
+ if (splitBlocks) {
transformer = new JsIEBlockTextTransformer(transformer);
transformer.exec();
}
@@ -1185,31 +1155,13 @@
return amp.makeStatement();
}
- private static SymbolData[] makeSymbolMap(Map<StandardSymbolData, JsName> symbolTable,
- JsProgram jsProgram) {
-
- final Map<JsName, Integer> nameToFragment = new HashMap<JsName, Integer>();
- for (int i = 0; i < jsProgram.getFragmentCount(); i++) {
- final Integer fragId = i;
- new JsVisitor() {
- @Override
- public void endVisit(JsFunction x, JsContext ctx) {
- if (x.getName() != null) {
- nameToFragment.put(x.getName(), fragId);
- }
- }
- }.accept(jsProgram.getFragmentBlock(i));
- }
+ private static SymbolData[] makeSymbolMap(Map<StandardSymbolData, JsName> symbolTable) {
SymbolData[] result = new SymbolData[symbolTable.size()];
int i = 0;
for (Map.Entry<StandardSymbolData, JsName> entry : symbolTable.entrySet()) {
StandardSymbolData symbolData = entry.getKey();
symbolData.setSymbolName(entry.getValue().getShortIdent());
- Integer fragNum = nameToFragment.get(entry.getValue());
- if (fragNum != null) {
- symbolData.setFragmentNumber(fragNum);
- }
result[i++] = symbolData;
}
return result;
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java
index d2798ac..0a6f013 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java
@@ -30,16 +30,6 @@
this.textOutput = textOutput;
}
- @Override
- public int getColumn() {
- return textOutput.getColumn();
- }
-
- @Override
- public int getLine() {
- return textOutput.getLine();
- }
-
public int getPosition() {
return textOutput.getPosition();
}
diff --git a/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
index 5d4441b..58812b1 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
@@ -50,13 +50,10 @@
protected <T extends JsVisitable> T doAccept(T node) {
boolean addEntry = node instanceof HasSourceInfo;
int start = addEntry ? out.getPosition() : 0;
- int sLine = out.getLine();
- int sCol = out.getColumn();
T toReturn = super.doAccept(node);
if (addEntry) {
SourceInfo info = ((HasSourceInfo) node).getSourceInfo();
- sourceInfoMap.put(new Range(start, out.getPosition(),
- sLine, sCol, out.getLine(), out.getColumn()), info);
+ sourceInfoMap.put(new Range(start, out.getPosition()), info);
}
return toReturn;
}
diff --git a/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java b/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java
index a284d7d..8e9e8b3 100644
--- a/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java
+++ b/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java
@@ -29,21 +29,11 @@
private boolean justNewlined;
private PrintWriter out;
private int position = 0;
- private int line = 0;
- private int column = 0;
protected AbstractTextOutput(boolean compact) {
this.compact = compact;
}
- public int getColumn() {
- return column;
- }
-
- public int getLine() {
- return line;
- }
-
public int getPosition() {
return position;
}
@@ -73,8 +63,6 @@
out.print('\n');
}
position++;
- line++;
- column = 0;
justNewlined = true;
}
@@ -82,8 +70,6 @@
if (!compact) {
out.print('\n');
position++;
- line++;
- column = 0;
justNewlined = true;
}
}
@@ -92,7 +78,6 @@
maybeIndent();
out.print(c);
position++;
- column++;
justNewlined = false;
}
@@ -113,7 +98,6 @@
maybeIndent();
out.print(c);
position += 1;
- column++;
}
}
@@ -144,7 +128,6 @@
private void printAndCount(char[] chars) {
position += chars.length;
- column += chars.length;
out.print(chars);
}
}
diff --git a/dev/core/src/com/google/gwt/dev/util/TextOutput.java b/dev/core/src/com/google/gwt/dev/util/TextOutput.java
index f98536b..ecbf9d0 100644
--- a/dev/core/src/com/google/gwt/dev/util/TextOutput.java
+++ b/dev/core/src/com/google/gwt/dev/util/TextOutput.java
@@ -1,12 +1,12 @@
/*
* Copyright 2006 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,11 +19,6 @@
* Interface used for printing text output.
*/
public interface TextOutput {
-
- int getColumn();
-
- int getLine();
-
int getPosition();
void indentIn();
diff --git a/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java b/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java
index f5e0e6b..266935d 100644
--- a/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java
+++ b/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java
@@ -1,12 +1,12 @@
/*
* Copyright 2009 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,11 +15,6 @@
*/
package com.google.gwt.core.linker;
-import com.google.gwt.core.ext.LinkerContext;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.linker.ConfigurationProperty;
-import com.google.gwt.core.ext.linker.SelectionProperty;
import com.google.gwt.core.ext.linker.StatementRanges;
import com.google.gwt.core.ext.linker.impl.SelectionScriptLinker;
import com.google.gwt.core.ext.linker.impl.StandardStatementRanges;
@@ -27,92 +22,16 @@
import junit.framework.TestCase;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.SortedSet;
-import java.util.TreeSet;
/**
* Tests the script chunking in the {@link SelectionScriptLinker}.
*/
public class ScriptChunkingTest extends TestCase {
-
- private static class MockLinkerContext implements LinkerContext {
-
- @Override
- public SortedSet<ConfigurationProperty> getConfigurationProperties() {
- return new TreeSet<ConfigurationProperty>();
- }
-
- @Override
- public String getModuleFunctionName() {
- return "mockFunc";
- }
-
- @Override
- public long getModuleLastModified() {
- return 0;
- }
-
- @Override
- public String getModuleName() {
- return "mock";
- }
-
- @Override
- public SortedSet<SelectionProperty> getProperties() {
- SelectionProperty mockSourceMapProperty = new SelectionProperty() {
-
- @Override
- public String getName() {
- return SelectionScriptLinker.USE_SOURCE_MAPS_PROPERTY;
- }
-
- @Override
- public String getFallbackValue() {
- return "";
- }
-
- @Override
- public SortedSet<String> getPossibleValues() {
- return new TreeSet<String>(Arrays.asList("true", "false"));
- }
-
- @Override
- public String getPropertyProvider(TreeLogger logger,
- SortedSet<ConfigurationProperty> configProperties) throws UnableToCompleteException {
- return null;
- }
-
- @Override
- public boolean isDerived() {
- return false;
- }
-
- @Override
- public String tryGetValue() {
- return "false";
- }
- };
- return new TreeSet<SelectionProperty>(Arrays.asList(mockSourceMapProperty));
- }
-
- @Override
- public boolean isOutputCompact() {
- return false;
- }
-
- @Override
- public String optimizeJavaScript(TreeLogger logger, String jsProgram)
- throws UnableToCompleteException {
- return "";
- }
- }
-
/**
- * A class for building up JavaScript that has statements and non-statement code interleaved.
+ * A class for building up JavaScript that has statements and non-statement
+ * code interleaved.
*/
private static class ScriptWithRangesBuilder {
-
private final ArrayList<Integer> ends = new ArrayList<Integer>();
private final StringBuffer script = new StringBuffer();
private final ArrayList<Integer> starts = new ArrayList<Integer>();
@@ -155,12 +74,12 @@
String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
builder.getJavaScript(), stmt1.length() + stmt2.length(),
- IFrameLinker.SCRIPT_CHUNK_SEPARATOR, new MockLinkerContext());
+ IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
assertEquals(stmt1 + stmt2 + IFrameLinker.SCRIPT_CHUNK_SEPARATOR + stmt3
+ ';' + stmt4, split);
}
-
+
/**
* Test that with the default chunk separator (""), splitting is a no-op.
*/
@@ -180,10 +99,10 @@
builder.addNonStatement("}");
String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
- builder.getJavaScript(), stmt1.length() + stmt2.length(), "", new MockLinkerContext());
+ builder.getJavaScript(), stmt1.length() + stmt2.length(), "");
assertEquals(stmt1 + stmt2 + stmt3 + ';' + stmt4, split);
}
-
+
/**
* Test a chunk size large enough that no splitting happens.
*/
@@ -203,8 +122,7 @@
builder.addNonStatement("}");
String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
- builder.getJavaScript(), 10000, IFrameLinker.SCRIPT_CHUNK_SEPARATOR,
- new MockLinkerContext());
+ builder.getJavaScript(), 10000, IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
assertEquals(stmt1 + stmt2 + stmt3 + ';' + stmt4, split);
}
@@ -223,7 +141,7 @@
builder.addNonStatement("}");
String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
- builder.getJavaScript(), -1, IFrameLinker.SCRIPT_CHUNK_SEPARATOR, new MockLinkerContext());
+ builder.getJavaScript(), -1, IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
assertEquals(builder.getJavaScript(), split);
}
@@ -242,7 +160,7 @@
builder.addNonStatement("}");
String split = SelectionScriptLinker.splitPrimaryJavaScript(null,
- builder.getJavaScript(), 5, IFrameLinker.SCRIPT_CHUNK_SEPARATOR, new MockLinkerContext());
+ builder.getJavaScript(), 5, IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
assertEquals(builder.getJavaScript(), split);
}
}
diff --git a/servlet/build.xml b/servlet/build.xml
index 21a57be..f274e05 100755
--- a/servlet/build.xml
+++ b/servlet/build.xml
@@ -52,7 +52,6 @@
<!-- The following two jars satisfy RequestFactory dependencies. -->
<zipfileset src="${gwt.tools.redist}/json/r2_20080312/json-1.5.jar" />
<zipfileset src="${gwt.tools.lib}/javax/validation/validation-api-1.0.0.GA.jar" />
- <zipfileset src="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
</gwt.jar>
</target>
</project>
diff --git a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
index a3b11ef..b811b41 100644
--- a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
+++ b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
@@ -75,10 +75,4 @@
is-multi-valued="false" />
<set-configuration-property name="iframe.linker.deferredjs.subdir"
value="deferredjs" />
-
- <!--
- Specifies whether a given permutation has source map support enabled.
- -->
- <define-property name="compiler.useSourceMaps" values="true,false"/>
- <set-property name="compiler.useSourceMaps" value="false"/>
</module>
diff --git a/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml b/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml
index a829874..c4cbd6c 100644
--- a/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml
+++ b/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml
@@ -43,26 +43,4 @@
<when-type-is class="com.google.gwt.core.client.impl.StackTraceCreator.Collector" />
<when-property-is name="compiler.stackMode" value="strip" />
</replace-with>
-
- <!-- Disable source maps for non-Chrome browsers -->
- <set-property name="compiler.useSourceMaps" value="false">
- <none>
- <when-property-is name="user.agent" value="safari"/>
- </none>
- </set-property>
-
-<set-property name="compiler.useSourceMaps" value="false"/>
-
- <!-- Utility class to query if source maps are enabled, mainly for testing -->
- <replace-with class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapEnabled">
- <when-type-is class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapImpl"/>
- <when-property-is name="compiler.useSourceMaps" value="true"/>
- </replace-with>
-
- <!-- If stack trace emulation is on, we can still get accurate stack traces even if sourcemaps are off -->
- <replace-with class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapEnabled">
- <when-type-is class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapImpl"/>
- <when-property-is name="compiler.useSourceMaps" value="false"/>
- <when-property-is name="compiler.stackMode" value="emulated"/>
- </replace-with>
</module>
diff --git a/user/src/com/google/gwt/core/client/impl/SourceMapProperty.java b/user/src/com/google/gwt/core/client/impl/SourceMapProperty.java
deleted file mode 100644
index 6e79367..0000000
--- a/user/src/com/google/gwt/core/client/impl/SourceMapProperty.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.google.gwt.core.client.impl;
-
-import com.google.gwt.core.client.GWT;
-
-/**
- * Helper class to query if SourceMaps are enabled and capable of working on the current user
- * agent.
- */
-public class SourceMapProperty {
-
- static class SourceMapEnabled extends SourceMapImpl {
-
- public native boolean doesBrowserSupportSourceMaps() /*-{
- // Chrome only for now, future Firefoxes have promised support
- return navigator.userAgent.indexOf('Chrome') > -1;
- }-*/;
-
- public boolean isSourceMapGenerationOn() {
- return true;
- }
- }
-
- static class SourceMapEmulated extends SourceMapEnabled {
-
- public boolean shouldUseSourceMaps() {
- // pretend emulated stack is a sourcemap
- return true;
- }
- }
-
- /**
- * Interface to provide both the compile time and runtime <code>user.agent</code> selection
- * property value.
- */
- static class SourceMapImpl {
-
- public boolean doesBrowserSupportSourceMaps() {
- return false;
- }
-
- public boolean isSourceMapGenerationOn() {
- return false;
- }
-
- public boolean shouldUseSourceMaps() {
- return isSourceMapGenerationOn() && doesBrowserSupportSourceMaps();
- }
- }
-
- private static final SourceMapImpl IMPL = GWT.create(SourceMapImpl.class);
-
- public static boolean doesBrowserSupportSourceMaps() {
- return IMPL.doesBrowserSupportSourceMaps();
- }
-
- /**
- * True if fully accurate stack traces are possible. True for DevMode, emulated stack traces, and
- * cases where sourceMaps can work with detailed browser stack trace support.
- */
- public static boolean isDetailedDeobfuscatedStackTraceSupported() {
- return !GWT.isScript() || shouldUseSourceMaps();
- }
-
- public static boolean isSourceMapGenerationOn() {
- return IMPL.isSourceMapGenerationOn();
- }
-
- public static boolean shouldUseSourceMaps() {
- return IMPL.shouldUseSourceMaps();
- }
-}
diff --git a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
index d6f93b2..3aa6182 100644
--- a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
+++ b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
@@ -1,12 +1,12 @@
/*
* Copyright 2009 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -26,19 +26,6 @@
* Production Mode.
*/
public class StackTraceCreator {
-
- /**
- * Line number used in a stack trace when it is unknown.
- */
- public static final int LINE_NUMBER_UNKNOWN = -1;
-
- /**
- * Used to encode a (column, line) pair into a line number (since LogRecord only stores line
- * numbers). We store line, col as line + col * max_line, and use division and modulus to
- * recover on the server side.
- */
- public static final int MAX_LINE_NUMBER = 100000;
-
/**
* This class acts as a deferred-binding hook point to allow more optimal
* versions to be substituted. This base version simply crawls
@@ -120,7 +107,7 @@
/**
* Attempt to infer the stack from an unknown JavaScriptObject that had been
* thrown. The default implementation just returns an empty array.
- *
+ *
* @param e a JavaScriptObject
*/
public JsArrayString inferFrom(JavaScriptObject e) {
@@ -258,12 +245,12 @@
/**
* Chrome uses a slightly different format to Mozilla.
- *
+ *
* See http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/
* messages.js?r=2340#712 for formatting code.
- *
+ *
* Function calls can be of the four following forms:
- *
+ *
* <pre>
* at file.js:1:2
* at functionName (file.js:1:2)
@@ -272,7 +259,6 @@
* </pre>
*/
static class CollectorChrome extends CollectorMoz {
-
@Override
public JsArrayString collect() {
JsArrayString res = super.collect();
@@ -287,18 +273,6 @@
}
@Override
- public void createStackTrace(JavaScriptException e) {
- JsArrayString stack = inferFrom(e.getException());
- parseStackTrace(e, stack);
- }
-
- @Override
- public void fillInStackTrace(Throwable t) {
- JsArrayString stack = StackTraceCreator.createStackTrace();
- parseStackTrace(t, stack);
- }
-
- @Override
public JsArrayString inferFrom(JavaScriptObject e) {
JsArrayString stack = super.inferFrom(e);
if (stack.length() == 0) {
@@ -312,11 +286,8 @@
@Override
protected String extractName(String fnToString) {
- String extractedName = "anonymous";
- String location = "";
-
if (fnToString.length() == 0) {
- return extractedName;
+ return "anonymous";
}
String toReturn = fnToString.trim();
@@ -326,70 +297,34 @@
toReturn = toReturn.substring(3);
}
- // Strip square bracketed items from the end:
+ // Strip bracketed items from the end:
int index = toReturn.indexOf("[");
- if (index != -1) {
- toReturn = toReturn.substring(0, index).trim() +
- toReturn.substring(toReturn.indexOf("]", index) + 1).trim();
- }
-
- index = toReturn.indexOf("(");
if (index == -1) {
- // No bracketed items found, hence no function name available
- location = toReturn;
- toReturn = "";
+ index = toReturn.indexOf("(");
+ }
+ if (index == -1) {
+ // No bracketed items found, hence no function name available:
+ return "anonymous";
} else {
- // Bracketed items found: strip them off, parse location info
- int closeParen = toReturn.indexOf(")", index);
- location = toReturn.substring(index + 1, closeParen);
+ // Bracketed items found: strip them off.
toReturn = toReturn.substring(0, index).trim();
}
- // Strip the Type off t
+ // Strip the Type off to leave just the functionName:
index = toReturn.indexOf('.');
if (index != -1) {
toReturn = toReturn.substring(index + 1);
}
- return (toReturn.length() > 0 ? toReturn : "anonymous") + "@@" + location;
+
+ return toReturn.length() > 0 ? toReturn : "anonymous";
}
@Override
protected int toSplice() {
return 3;
}
-
- private void parseStackTrace(Throwable e, JsArrayString stack) {
- StackTraceElement[] stackTrace = new StackTraceElement[stack.length()];
- for (int i = 0, j = stackTrace.length; i < j; i++) {
- String stackElements[] = stack.get(i).split("@@");
-
- int line = LINE_NUMBER_UNKNOWN;
- int col = -1;
- String fileName = "Unknown";
- if (stackElements.length == 2 && stackElements[1] != null) {
- String location = stackElements[1];
- // colon between line and column
- int lastColon = location.lastIndexOf(':');
- // colon between file url and line number
- int endFileUrl = location.lastIndexOf(':', lastColon - 1);
- fileName = location.substring(0, endFileUrl);
-
- if (lastColon != -1 && endFileUrl != -1) {
- line = parseInt(location.substring(endFileUrl + 1, lastColon));
- col = parseInt(location.substring(lastColon + 1));
- }
- }
- stackTrace[i] = new StackTraceElement("Unknown", stackElements[0], fileName,
- line < 0 ? -1 : col * MAX_LINE_NUMBER + line);
- }
- e.setStackTrace(stackTrace);
- }
}
- private static native int parseInt(String number) /*-{
- return parseInt(number) || -1;
- }-*/;
-
/**
* Opera encodes stack trace information in the error's message.
*/
@@ -457,6 +392,8 @@
// empty, since Throwable.getStackTrace() properly handles null
}
}
+
+ private static final int LINE_NUMBER_UNKNOWN = -1;
/**
* Create a stack trace based on a JavaScriptException. This method should
@@ -524,6 +461,7 @@
}
private static native JsArrayString splice(JsArrayString arr, int length) /*-{
+ (arr.length >= length) && arr.splice(0, length);
return arr;
}-*/;
}
diff --git a/user/src/com/google/gwt/junit/JUnit.gwt.xml b/user/src/com/google/gwt/junit/JUnit.gwt.xml
index 0e30089..29cdbc4 100644
--- a/user/src/com/google/gwt/junit/JUnit.gwt.xml
+++ b/user/src/com/google/gwt/junit/JUnit.gwt.xml
@@ -34,12 +34,7 @@
<!-- We want to provide consistent stack traces across all browsers. -->
<set-configuration-property name="compiler.emulatedStack.recordFileNames" value="true" />
- <set-property name="compiler.stackMode" value="emulated">
- <none>
- <!-- Don't use stack trace emulation if source maps enabled -->
- <when-property-is name="compiler.useSourceMaps" value="true"/>
- </none>
- </set-property>
+ <set-property name="compiler.stackMode" value="emulated" />
<!-- Override the regular symbolMaps linker to put the data somewhere we can find it -->
<define-linker name="symbolMaps" class="com.google.gwt.junit.linker.JUnitSymbolMapsLinker" />
diff --git a/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java b/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java
index 4638ec0..723654c 100644
--- a/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java
+++ b/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java
@@ -21,7 +21,6 @@
import com.google.gwt.core.ext.linker.CompilationResult;
import com.google.gwt.core.ext.linker.EmittedArtifact;
import com.google.gwt.core.ext.linker.Shardable;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
import com.google.gwt.core.linker.SymbolMapsLinker;
import java.io.ByteArrayOutputStream;
@@ -32,15 +31,12 @@
*/
@Shardable
public class JUnitSymbolMapsLinker extends SymbolMapsLinker {
-
- public static final String SYMBOL_MAP_DIR = ".junit_symbolMaps/";
-
@Override
protected void doEmitSymbolMap(TreeLogger logger, ArtifactSet artifacts,
CompilationResult result, ByteArrayOutputStream out)
throws UnableToCompleteException {
// Collaborate with JUnitHostImpl.loadSymbolMap
- String partialPath = SYMBOL_MAP_DIR + result.getStrongName()
+ String partialPath = ".junit_symbolMaps/" + result.getStrongName()
+ STRONG_NAME_SUFFIX;
EmittedArtifact symbolMapArtifact = emitBytes(logger, out.toByteArray(),
@@ -49,9 +45,4 @@
artifacts.add(symbolMapArtifact);
}
- @Override
- protected SyntheticArtifact emitSourceMapString(TreeLogger logger, String contents,
- String partialPath) throws UnableToCompleteException {
- return emitString(logger, contents, SYMBOL_MAP_DIR + partialPath);
- }
}
diff --git a/user/src/com/google/gwt/junit/server/JUnitHostImpl.java b/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
index ef26877..9f79b68 100644
--- a/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
+++ b/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
@@ -233,7 +233,7 @@
if (symbolData != null) {
// jsniIdent, className, memberName, sourceUri, sourceLine
String[] parts = symbolData.split(",");
- assert parts.length == 6 : "Expected 6, have " + parts.length;
+ assert parts.length == 5 : "Expected 5, have " + parts.length;
JsniRef ref = JsniRef.parse(parts[0].substring(0,
parts[0].lastIndexOf(')') + 1));
diff --git a/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java b/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java
index adb20bc..b8f7dfd 100644
--- a/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java
+++ b/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java
@@ -71,16 +71,12 @@
Throwable cause =
throwableFromJson(t.getString("cause"));
StackTraceElement[] stackTrace = null;
- if (t.has("stackTrace")) {
- JSONArray st = t.getJSONArray("stackTrace");
- if (st.length() > 0) {
- stackTrace = new StackTraceElement[st.length()];
- for (int i = 0; i < st.length(); i++) {
- stackTrace[i] = stackTraceElementFromJson(st.getString(i));
- }
+ JSONArray st = t.getJSONArray("stackTrace");
+ if (st.length() > 0) {
+ stackTrace = new StackTraceElement[st.length()];
+ for (int i = 0; i < st.length(); i++) {
+ stackTrace[i] = stackTraceElementFromJson(st.getString(i));
}
- } else {
- stackTrace = new StackTraceElement[0];
}
Throwable thrown = new Throwable(message, cause);
thrown.setStackTrace(stackTrace);
diff --git a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
index d5b9e6c..472afaf 100644
--- a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
+++ b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
@@ -1,12 +1,12 @@
/*
* Copyright 2010 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,14 +16,6 @@
package com.google.gwt.logging.server;
-import com.google.debugging.sourcemap.SourceMapConsumerFactory;
-import com.google.debugging.sourcemap.SourceMapConsumerV3;
-import com.google.debugging.sourcemap.SourceMapping;
-import com.google.debugging.sourcemap.proto.Mapping;
-import com.google.gwt.core.client.impl.StackTraceCreator;
-
-import org.json.JSONObject;
-
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
@@ -32,70 +24,62 @@
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
-import java.util.Scanner;
import java.util.logging.LogRecord;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
- * Deobfuscates stack traces on the server side. This class requires that you have turned on
- * emulated stack traces, via <code><set-property name="compiler.stackMode" value="emulated"
- * /></code> in your <code>.gwt.xml</code> module file for non-Chrome browsers or
- * <code><set-property name="compiler.useSourceMaps" value="true"/></code> for Chrome, and
- * moved your symbol map files to a location accessible by your server sever side code. You can use
- * the GWT compiler <code>-deploy</code> command line argument to specify the location of the folder
- * into which the generated <code>symbolMaps</code> directory is written. By default, the final
- * <code>symbolMaps</code> directory is <code>war/WEB-INF/deploy/<i>yourmodulename</i>/symbolMaps/</code>.
- * Pass the resulting directory location into this class' {@link StackTraceDeobfuscator#symbolMapsDirectory}
- * constructor or {@link #setSymbolMapsDirectory(String)} setter method.
- *
+ * Deobfuscates stack traces on the server side. This class requires that you
+ * have turned on emulated stack traces, via
+ * <code><set-property name="compiler.stackMode" value="emulated" /></code>
+ * in your <code>.gwt.xml</code> module file, and moved your symbol map files to
+ * a location accessible by your server sever side code. You can use the GWT
+ * compiler <code>-deploy</code> command line argument to specify the location
+ * of the folder into which the generated <code>symbolMaps</code> directory is
+ * written. By default, the final <code>symbolMaps</code> directory is
+ * <code>war/WEB-INF/deploy/<i>yourmodulename</i>/symbolMaps/</code>. Pass the
+ * resulting directory location into this class'
+ * {@link StackTraceDeobfuscator#symbolMapsDirectory} constructor or
+ * {@link #setSymbolMapsDirectory(String)} setter method.
+ *
* TODO(unnurg): Combine this code with similar code in JUnitHostImpl
*/
public class StackTraceDeobfuscator {
-
- private static class SymbolMap extends HashMap<String, String> {
- }
-
+
+ private static class SymbolMap extends HashMap<String, String> { }
+
// From JsniRef class, which is in gwt-dev and so can't be accessed here
// TODO(unnurg) once there is a place for shared code, move this to there.
private static Pattern JsniRefPattern =
- Pattern.compile("@?([^:]+)::([^(]+)(\\((.*)\\))?");
-
- // The javadoc for StackTraceElement.getLineNumber() says it returns -1 when
+ Pattern.compile("@?([^:]+)::([^(]+)(\\((.*)\\))?");
+
+ // The javadoc for StackTraceElement.getLineNumber() says it returns -1 when
// the line number is unavailable
private static final int LINE_NUMBER_UNKNOWN = -1;
-
- Pattern fragmentIdPattern = Pattern.compile(".*(\\d+)\\.js");
-
- protected File symbolMapsDirectory;
-
- // Map of strongName + fragmentId to sourceMap
- private Map<String, SourceMapping> sourceMaps =
- new HashMap<String, SourceMapping>();
-
- private Map<String, Integer> sourceMapPrefixes = new HashMap<String, Integer>();
-
+
+ private File symbolMapsDirectory;
+
private Map<String, SymbolMap> symbolMaps =
- new HashMap<String, SymbolMap>();
+ new HashMap<String, SymbolMap>();
/**
- * Constructor, which takes a <code>symbolMaps</code> directory as its argument. Symbol maps are
- * generated into the location specified by the GWT compiler <code>-deploy</code> command line
- * argument.
- *
- * @param symbolMapsDirectory the <code>symbolMaps</code> directory with, or without trailing
- * directory separator character
+ * Constructor, which takes a <code>symbolMaps</code> directory as its
+ * argument. Symbol maps are generated into the location specified by the
+ * GWT compiler <code>-deploy</code> command line argument.
+ *
+ * @param symbolMapsDirectory the <code>symbolMaps</code> directory with, or
+ * without trailing directory separator character
*/
public StackTraceDeobfuscator(String symbolMapsDirectory) {
setSymbolMapsDirectory(symbolMapsDirectory);
}
-
+
/**
* Best effort resymbolization of a log record's stack trace.
- *
- * @param lr the log record to resymbolize
+ *
+ * @param lr the log record to resymbolize
* @param strongName the GWT permutation strong name
- * @return the best effort resymbolized log record JJSO
+ * @return the best effort resymbolized log record
*/
public LogRecord deobfuscateLogRecord(LogRecord lr, String strongName) {
if (lr.getThrown() != null && strongName != null) {
@@ -103,11 +87,12 @@
}
return lr;
}
-
+
/**
- * Convenience method which resymbolizes an entire stack trace to extent possible.
+ * Convenience method which resymbolizes an entire stack trace to extent
+ * possible.
*
- * @param st the stack trace to resymbolize
+ * @param st the stack trace to resymbolize
* @param strongName the GWT permutation strong name
* @return a best effort resymbolized stack trace
*/
@@ -119,34 +104,28 @@
}
return newSt;
}
-
+
/**
* Best effort resymbolization of a a single stack trace element.
*
- * @param ste the stack trace element to resymbolize
+ * @param ste the stack trace element to resymbolize
* @param strongName the GWT permutation strong name
* @return the best effort resymbolized stack trace element
*/
public StackTraceElement resymbolize(StackTraceElement ste,
String strongName) {
- String declaringClass = null;
- String methodName = null;
- String filename = null;
- int lineNumber = -1;
- int fragmentId = -1;
-
- String steFilename = ste.getFileName();
SymbolMap map = loadSymbolMap(strongName);
String symbolData = map == null ? null : map.get(ste.getMethodName());
- // first use symbolMap, then refine via sourceMap if possible
if (symbolData != null) {
- // jsniIdent, className, memberName, sourceUri, sourceLine, fragmentId
+ // jsniIdent, className, memberName, sourceUri, sourceLine
String[] parts = symbolData.split(",");
- if (parts.length == 6) {
+ if (parts.length == 5) {
String[] ref = parse(
parts[0].substring(0, parts[0].lastIndexOf(')') + 1));
+ String declaringClass;
+ String methodName;
if (ref != null) {
declaringClass = ref[0];
methodName = ref[1];
@@ -154,13 +133,12 @@
declaringClass = ste.getClassName();
methodName = ste.getMethodName();
}
-
+
// parts[3] contains the source file URI or "Unknown"
- filename = "Unknown".equals(parts[3]) ? null
+ String filename = "Unknown".equals(parts[3]) ? null
: parts[3].substring(parts[3].lastIndexOf('/') + 1);
-
- lineNumber = ste.getLineNumber();
-
+
+ int lineNumber = ste.getLineNumber();
/*
* When lineNumber is LINE_NUMBER_UNKNOWN, either because
* compiler.stackMode is not emulated or
@@ -170,78 +148,30 @@
if (lineNumber == LINE_NUMBER_UNKNOWN) {
lineNumber = Integer.parseInt(parts[4]);
}
-
- fragmentId = Integer.parseInt(parts[5]);
+
+ return new StackTraceElement(
+ declaringClass, methodName, filename, lineNumber);
}
}
-
- // anonymous function, try to use <fragmentNum>.js:line:col to lookup function
- if (fragmentId == -1 && steFilename != null) {
- // fragment identifier encoded in filename
- Matcher matcher = fragmentIdPattern.matcher(steFilename);
- if (matcher.matches()) {
- String fragment = matcher.group(1);
- try {
- fragmentId = Integer.parseInt(fragment);
- } catch (Exception e) {
- }
- } else if (steFilename.contains(strongName)) {
- // else it's <strongName>.cache.js which is the 0th fragment
- fragmentId = 0;
- }
- }
-
- // try to refine location via sourcemap
- if (fragmentId != -1) {
- SourceMapping sourceMapping = loadSourceMap(strongName, fragmentId);
- if (sourceMapping != null && ste.getLineNumber() > -1) {
- int column = 1;
- int jsLineNumber = ste.getLineNumber();
- if (jsLineNumber > StackTraceCreator.MAX_LINE_NUMBER) {
- column = jsLineNumber / StackTraceCreator.MAX_LINE_NUMBER;
- jsLineNumber = jsLineNumber % StackTraceCreator.MAX_LINE_NUMBER;
- }
- Mapping.OriginalMapping mappingForLine = sourceMapping
- .getMappingForLine(jsLineNumber, column);
- if (mappingForLine != null) {
-
- if (declaringClass == null || declaringClass.equals(ste.getClassName())) {
- declaringClass = mappingForLine.getOriginalFile();
- methodName = mappingForLine.getIdentifier();
- }
- filename = mappingForLine.getOriginalFile();
- lineNumber = mappingForLine.getLineNumber() - 1;
- }
- }
- }
-
- if (declaringClass != null) {
- return new StackTraceElement(declaringClass, methodName, filename, lineNumber);
- }
-
// If anything goes wrong, just return the unobfuscated element
return ste;
}
-
+
public void setSymbolMapsDirectory(String symbolMapsDirectory) {
// permutations are unique, no need to clear the symbolMaps hash map
this.symbolMapsDirectory = new File(symbolMapsDirectory);
}
- protected InputStream getSourceMapInputStream(String permutationStrongName, int fragmentNumber)
- throws IOException {
- String filename = symbolMapsDirectory.getCanonicalPath()
- + File.separatorChar + permutationStrongName + "_sourceMap" + fragmentNumber + ".json";
- return new FileInputStream(filename);
- }
-
/**
- * Retrieves a new {@link InputStream} for the given permutation strong name. This implementation,
- * which subclasses may override, returns a {@link InputStream} for the <code>
- * <i>permutation-strong-name</i>.symbolMap</code> file in the <code>symbolMaps</code> directory.
+ * Retrieves a new {@link InputStream} for the given permutation strong name.
+ * This implementation, which subclasses may override, returns a
+ * {@link InputStream} for the <code>
+ * <i>permutation-strong-name</i>.symbolMap</code> file in the
+ * <code>symbolMaps</code> directory.
*
* @param permutationStrongName the GWT permutation strong name
* @return a new {@link InputStream}
+ * @throws IOException
*/
protected InputStream getSymbolMapInputStream(String permutationStrongName)
throws IOException {
@@ -249,7 +179,7 @@
+ File.separatorChar + permutationStrongName + ".symbolMap";
return new FileInputStream(filename);
}
-
+
private Throwable deobfuscateThrowable(Throwable old, String strongName) {
Throwable t = new Throwable(old.getMessage());
if (old.getStackTrace() != null) {
@@ -262,27 +192,7 @@
}
return t;
}
-
- private SourceMapping loadSourceMap(String permutationStrongName, int fragmentId) {
- SourceMapping toReturn = sourceMaps.get(permutationStrongName + fragmentId);
- if (toReturn == null) {
- try {
- SourceMapConsumerV3 consumer = new SourceMapConsumerV3();
- String sourceMapString = loadStreamAsString(
- getSourceMapInputStream(permutationStrongName, fragmentId));
- JSONObject obj = new JSONObject(sourceMapString);
- toReturn = SourceMapConsumerFactory.parse(sourceMapString);
- sourceMaps.put(permutationStrongName + fragmentId, toReturn);
- } catch (Exception e) {
- }
- }
- return toReturn;
- }
-
- private String loadStreamAsString(InputStream stream) {
- return new Scanner(stream).useDelimiter("\\A").next();
- }
-
+
private SymbolMap loadSymbolMap(
String strongName) {
SymbolMap toReturn = symbolMaps.get(strongName);
@@ -302,7 +212,7 @@
}
int idx = line.indexOf(',');
toReturn.put(new String(line.substring(0, idx)),
- line.substring(idx + 1));
+ line.substring(idx + 1));
}
} finally {
bin.close();
@@ -317,13 +227,13 @@
}
/**
- * Extracts the declaring class and method name from a JSNI ref, or null if the information cannot
- * be extracted.
+ * Extracts the declaring class and method name from a JSNI ref, or null if
+ * the information cannot be extracted.
*
- * @param refString symbol map reference string
- * @return a string array contains the declaring class and method name, or null when the regex
- * match fails
* @see com.google.gwt.dev.util.JsniRef
+ * @param refString symbol map reference string
+ * @return a string array contains the declaring class and method name, or
+ * null when the regex match fails
*/
private String[] parse(String refString) {
Matcher matcher = JsniRefPattern.matcher(refString);
@@ -332,7 +242,7 @@
}
String className = matcher.group(1);
String memberName = matcher.group(2);
- String[] toReturn = new String[]{className, memberName};
+ String[] toReturn = new String[] {className, memberName};
return toReturn;
}
}
diff --git a/user/src/com/google/gwt/user/tools/QuerySourceMap.java b/user/src/com/google/gwt/user/tools/QuerySourceMap.java
deleted file mode 100644
index 5c271e5..0000000
--- a/user/src/com/google/gwt/user/tools/QuerySourceMap.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.tools;
-
-import com.google.debugging.sourcemap.SourceMapConsumerFactory;
-import com.google.debugging.sourcemap.SourceMapping;
-import com.google.gwt.dev.util.Util;
-
-import java.io.File;
-
-/**
- * Command-line utility for querying source maps.
- */
-public class QuerySourceMap {
-
- public static void main(String[] args) throws Exception {
- String filename = args[0];
- int line = Integer.valueOf(args[1]);
- int col = Integer.valueOf(args[2]);
-
- SourceMapping consumer = SourceMapConsumerFactory.parse(Util.readFileAsString(new File(filename)));
- System.out.println(consumer.getMappingForLine(line, col));
- }
-}
diff --git a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
index cd7e41d..e57776a 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
@@ -185,12 +185,12 @@
public void testChromeExtractName() {
CollectorChrome c = new CollectorChrome();
- assertEquals("anonymous@@file.js:1:2", c.extractName(" at file.js:1:2"));
- assertEquals("functionName@@file.js:1:2",
+ assertEquals("anonymous", c.extractName(" at file.js:1:2"));
+ assertEquals("functionName",
c.extractName(" at functionName (file.js:1:2)"));
- assertEquals("functionName@@file.js:1:2",
+ assertEquals("functionName",
c.extractName(" at Type.functionName (file.js:1:2)"));
- assertEquals("functionName@@file.js:1:2",
+ assertEquals("functionName",
c.extractName(" at Type.functionName [as methodName] (file.js:1:2)"));
}
}
diff --git a/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml b/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml
index d8f2109..6f589f6 100644
--- a/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml
+++ b/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml
@@ -21,32 +21,5 @@
<servlet path='/loggingrpc'
class='com.google.gwt.user.server.rpc.LoggingRPCTestServiceImpl' />
- <servlet path="/remote_logging" class="com.google.gwt.logging.server.RemoteLoggingServiceImpl"/>
-
- <set-property name="gwt.logging.logLevel" value="WARNING"/>
- <set-property name="gwt.logging.enabled" value="TRUE"/>
- <set-property name="gwt.logging.consoleHandler" value="ENABLED"/>
- <set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
-
-
- <set-property name="compiler.useSourceMaps" value="true"/>
-
-
- <!-- Turn off emulation to test non-sourcemap mode -->
- <set-property name="compiler.stackMode" value="native"/>
- <!-- when Chrome is enabled, turn off stack trace emulation -->
- <set-property name="compiler.stackMode" value="strip">
- <when-property-is name="user.agent" value="safari"/>
- </set-property>
-
- <!-- when stack trace stripping is enabled, we need to replace the Null collector
- with one that does something for Chrome -->
- <replace-with class="com.google.gwt.core.client.impl.StackTraceCreator.CollectorChrome">
- <when-type-is class="com.google.gwt.core.client.impl.StackTraceCreator.Collector" />
- <!-- For now, only Chrome provides Error.stack support, so we hijack the
- entire WebKit permutation -->
- <when-property-is name="user.agent" value="safari" />
- <when-property-is name="compiler.useSourceMaps" value="true" />
- </replace-with>
</module>
diff --git a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
index 8991ffa..365ce4a 100644
--- a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
@@ -18,34 +18,21 @@
import com.google.gwt.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
-import com.google.gwt.core.client.impl.SourceMapProperty;
import java.util.logging.Level;
import java.util.logging.LogRecord;
/**
* Test cases for Generic Collections in GWT RPC.
+ *
*/
public class LoggingRPCTest extends GWTTestCase {
- /**
- * WARNING! WARNING! If you edit this method or insert any lines of code above this method,you
- * must re-edit the line number constants below;
- */
- private static final int METHOD_START_LINE = 39;
-
- private static final int METHOD_EXCEPTION_LINE = 41;
-
- private void throwException(String arg) {
- // prevent inlining by double referencing arg
- throw new RuntimeException(arg.charAt(0) + arg.substring(1));
- }
-
@Override
public String getModuleName() {
return "com.google.gwt.user.LoggingRPCSuite";
}
-
+
private static final LogRecord expectedLogRecord = createLogRecord();
public static boolean isValid(LogRecord value) {
@@ -77,7 +64,7 @@
}
// Do not compare trace as it is not stable across RPC.
-
+
expectedCause = expectedCause.getCause();
valueCause = valueCause.getCause();
}
@@ -103,18 +90,6 @@
return result;
}
- private static LogRecord createLogRealRecord(Throwable thrown) {
- LogRecord result = new LogRecord(Level.INFO, "Test Log Record");
-
- // Only set serialized fields.
- result.setLoggerName("Test Logger Name");
- result.setMillis(1234567);
-
- result.setThrown(thrown);
-
- return result;
- }
-
private LoggingRPCTestServiceAsync loggingRPCTestService;
public void testLogRecord() {
@@ -134,65 +109,10 @@
});
}
- public void testStackMapDeobfuscation() {
- final LoggingRPCTestServiceAsync service = getServiceAsync();
- delayTestFinish(500000);
- GWT.runAsync(LoggingRPCTest.class, new com.google.gwt.core.client.RunAsyncCallback() {
-
- @Override
- public void onFailure(Throwable reason) {
- }
-
- @Override
- public void onSuccess() {
- try {
- throwException("Runtime Exception");
- } catch (Exception e) {
- service.deobfuscateLogRecord(createLogRealRecord(e), new AsyncCallback<LogRecord>() {
-
- public void onFailure(Throwable caught) {
- assertTrue(false);
- TestSetValidator.rethrowException(caught);
- }
-
- public void onSuccess(LogRecord record) {
- Throwable thrown = record.getThrown();
- boolean found = false;
- for (StackTraceElement e : thrown.getStackTrace()) {
- if (e.getFileName().contains("LoggingRPCTest")) {
- // if DevMode or SourceMaps enabled and Chrome is the browser, check for exact line
- if (SourceMapProperty.isDetailedDeobfuscatedStackTraceSupported()) {
- assertEquals(METHOD_EXCEPTION_LINE, e.getLineNumber());
- } else {
- // else fallback to line number of method itself
- assertEquals(METHOD_START_LINE, e.getLineNumber());
- }
- String methodName = "throwException";
- assertTrue("Method name mismatch, expected = " + methodName
- + " vs actual = " + e.getMethodName(),
- e.getMethodName().contains(methodName));
- String className = "com.google.gwt.user.client.rpc.LoggingRPCTest";
- assertTrue("Class name mismatch, expected = " + className
- + " actual = " + e.getClassName(), className.contains(e.getClassName()));
- found = true;
- break;
- }
- }
- assertTrue(found);
- finishTest();
- }
- });
- }
- }
- });
- }
-
private LoggingRPCTestServiceAsync getServiceAsync() {
if (loggingRPCTestService == null) {
loggingRPCTestService = (LoggingRPCTestServiceAsync) GWT.create(LoggingRPCTestService.class);
}
return loggingRPCTestService;
}
-
-
}
diff --git a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java
index 1cc4842..f597cd2 100644
--- a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java
+++ b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java
@@ -1,12 +1,12 @@
/*
* Copyright 2011 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -34,7 +34,6 @@
super(msg);
}
}
- LogRecord deobfuscateLogRecord(LogRecord value) throws LoggingRPCTestServiceException;
LogRecord echoLogRecord(LogRecord value) throws LoggingRPCTestServiceException;
}
diff --git a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java
index 0460667..6e680a0 100644
--- a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java
@@ -1,12 +1,12 @@
/*
* Copyright 2011 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,8 +23,6 @@
* Async interface for serialization of GWT core.java emulations.
*/
public interface LoggingRPCTestServiceAsync {
- void deobfuscateLogRecord(LogRecord value, AsyncCallback<LogRecord> callback);
void echoLogRecord(LogRecord value, AsyncCallback<LogRecord> callback);
-
}
diff --git a/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java b/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
index 691139a..cb61242 100644
--- a/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
+++ b/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
@@ -1,12 +1,12 @@
/*
* Copyright 2011 Google Inc.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,80 +16,18 @@
package com.google.gwt.user.server.rpc;
-import static com.google.gwt.user.client.rpc.RpcRequestBuilder.MODULE_BASE_HEADER;
-
-import com.google.gwt.junit.linker.JUnitSymbolMapsLinker;
-import com.google.gwt.logging.server.StackTraceDeobfuscator;
import com.google.gwt.user.client.rpc.LoggingRPCTest;
import com.google.gwt.user.client.rpc.LoggingRPCTestService;
-import com.google.gwt.user.client.rpc.RpcRequestBuilder;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-import javax.servlet.http.HttpServletRequest;
/**
- * Remote service implementation for serialization of GWT core.java.util.logging emulations.
+ * Remote service implementation for serialization of GWT core.java.util.logging
+ * emulations.
*/
public class LoggingRPCTestServiceImpl extends HybridServiceServlet implements
LoggingRPCTestService {
- @Override
- public LogRecord deobfuscateLogRecord(LogRecord value)
- throws LoggingRPCTestServiceException {
- // don't deobfuscate DevMode, there's no symbol map
- if ("HostedMode".equals(getPermutationStrongName())) {
- return value;
- }
-
- StackTraceDeobfuscator deobf = new StackTraceDeobfuscator(getSymbolMapsDir()) {
- @Override
- protected InputStream getSourceMapInputStream(String permutationStrongName,
- int fragmentNumber)
- throws IOException {
- if (symbolMapsDirectory.exists()) {
- return super.getSourceMapInputStream(permutationStrongName,
- fragmentNumber);
- } else {
- return getServletContext().getResourceAsStream(
- getModule() + File.separatorChar + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR
- + permutationStrongName
- + "_sourceMap" + fragmentNumber + ".json");
- }
- }
-
- @Override
- protected InputStream getSymbolMapInputStream(String permutationStrongName)
- throws IOException {
- if (symbolMapsDirectory.exists()) {
- return super.getSymbolMapInputStream(permutationStrongName);
- } else {
- String name =
- getModule() + File.separatorChar + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR
- + permutationStrongName
- + ".symbolMap";
- return getServletContext().getResourceAsStream(name);
- }
- }
- };
-
- HttpServletRequest threadLocalRequest = getThreadLocalRequest();
- String strongName = null;
- if (threadLocalRequest != null) {
- // can be null during tests
- strongName = threadLocalRequest.getHeader(RpcRequestBuilder.STRONG_NAME_HEADER);
- }
- LogRecord newRecord = deobf.deobfuscateLogRecord(value, strongName);
- Logger.getLogger(value.getLoggerName()).log(newRecord);
- return newRecord;
- }
-
public LogRecord echoLogRecord(LogRecord value) throws LoggingRPCTestServiceException {
/*
* Don't check the stack trace on the server side, because the expected
@@ -103,34 +41,4 @@
return value;
}
-
- private String getModule() {
- try {
- String header = getThreadLocalRequest().getHeader(MODULE_BASE_HEADER);
- if (header == null) {
- return null;
- }
- String path = new URL(header).getPath();
- String contextPath = getThreadLocalRequest().getContextPath();
- if (!path.startsWith(contextPath)) {
- return null;
- }
- path = path.substring(contextPath.length());
- if (path.endsWith("/")) {
- path = path.substring(0, path.length() - 1);
- }
- return path;
- } catch (MalformedURLException e) {
- return null;
- }
- }
-
- private String getSymbolMapsDir() {
- String path = getModule();
- if (path == null) {
- return null;
- }
- return "war" + File.separatorChar + getModule() + File.separatorChar
- + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR;
- }
}