Modifies the IFrame linker so that any deferred-loaded JavaScript
files needed by runAsync are placed into subdirectories of the
main output directory.

Review by: bobv



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@4265 8db76d5a-ed1c-0410-87a9-c151d255dfc7
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 d13c0218..db5fddd 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
@@ -28,6 +28,7 @@
 import com.google.gwt.dev.util.Util;
 import com.google.gwt.util.tools.Utility;
 
+import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -55,6 +56,11 @@
   protected static final String FRAGMENT_EXTENSION = ".cache.js";
 
   /**
+   * A subdirectory to hold all the generated fragments.
+   */
+  protected static final String FRAGMENT_SUBDIR = "deferredjs";
+
+  /**
    * Determines whether or not the URL is relative.
    * 
    * @param src the test url
@@ -111,7 +117,8 @@
       throws UnableToCompleteException {
     String[] js = result.getJavaScript();
     byte[][] bytes = new byte[js.length][];
-    bytes[0] = generatePrimaryFragment(logger, context, js[0], result.getStrongName());
+    bytes[0] = generatePrimaryFragment(logger, context, js[0],
+        result.getStrongName());
     for (int i = 1; i < js.length; i++) {
       bytes[i] = Util.getBytes(js[i]);
     }
@@ -120,8 +127,8 @@
     toReturn.add(emitBytes(logger, bytes[0], result.getStrongName()
         + getCompilationExtension(logger, context)));
     for (int i = 1; i < js.length; i++) {
-      toReturn.add(emitBytes(logger, bytes[i], result.getStrongName() + "-" + i
-          + FRAGMENT_EXTENSION));
+      toReturn.add(emitBytes(logger, bytes[i], FRAGMENT_SUBDIR + File.separator
+          + result.getStrongName() + File.separator + i + FRAGMENT_EXTENSION));
     }
 
     compilationStrongNames.put(result, result.getStrongName());
@@ -336,7 +343,8 @@
   }
 
   protected abstract String getModulePrefix(TreeLogger logger,
-      LinkerContext context, String strongName) throws UnableToCompleteException;
+      LinkerContext context, String strongName)
+      throws UnableToCompleteException;
 
   protected abstract String getModuleSuffix(TreeLogger logger,
       LinkerContext context) throws UnableToCompleteException;
@@ -345,7 +353,8 @@
       LinkerContext context) throws UnableToCompleteException;
 
   private byte[] generatePrimaryFragment(TreeLogger logger,
-      LinkerContext context, String js, String strongName) throws UnableToCompleteException {
+      LinkerContext context, String js, String strongName)
+      throws UnableToCompleteException {
     StringBuffer b = new StringBuffer();
     b.append(getModulePrefix(logger, context, strongName));
     b.append(js);
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 c165152..9f50c76 100644
--- a/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
@@ -87,7 +87,7 @@
     out.indentIn();
     out.print("  var script = document.createElement('script');");
     out.newlineOpt();
-    out.print("  script.src = '" + strongName + "-' + frag + '" + FRAGMENT_EXTENSION + "';");
+    out.print("  script.src = '" + FRAGMENT_SUBDIR + "/" + strongName + "/' + frag + '" + FRAGMENT_EXTENSION + "';");
     out.print("  document.getElementsByTagName('head').item(0).appendChild(script);");
     out.indentOut();
     out.newlineOpt();