Use DOM manipulation to inject stylesheets referenced from gwt.xml files.
Fixes issue 2235.

Patch by: bobv
Review by: knorton, scottb


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2891 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
index a4d9394..6c76a97 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/HostedModeTemplate.js
@@ -337,6 +337,9 @@
   function onBodyDone() {
     if (!bodyDone) {
       bodyDone = true;
+// __MODULE_STYLES_BEGIN__
+     // Style resources are injected here to prevent operation aborted errors on ie
+// __MODULE_STYLES_END__
       maybeStartModule();
 
       if ($doc.removeEventListener) {
@@ -385,9 +388,9 @@
     }
   }, 50);
 
-// __MODULE_DEPS_BEGIN__
-  // Module dependencies, such as scripts and css
-// __MODULE_DEPS_END__
+// __MODULE_SCRIPTS_BEGIN__
+  // Script resources are injected here
+// __MODULE_SCRIPTS_END__
   $doc.write('<script>__MODULE_FUNC__.onInjectionDone(\'__MODULE_NAME__\')</script>');
 }
 
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 9fc76f7..71d941b 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
@@ -189,14 +189,17 @@
     int startPos;
 
     // Add external dependencies
-    startPos = selectionScript.indexOf("// __MODULE_DEPS_END__");
+    startPos = selectionScript.indexOf("// __MODULE_STYLES_END__");
     if (startPos != -1) {
       for (StylesheetReference resource : artifacts.find(StylesheetReference.class)) {
         String text = generateStylesheetInjector(resource.getSrc());
         selectionScript.insert(startPos, text);
         startPos += text.length();
       }
+    }
 
+    startPos = selectionScript.indexOf("// __MODULE_SCRIPTS_END__");
+    if (startPos != -1) {
       for (ScriptReference resource : artifacts.find(ScriptReference.class)) {
         String text = generateScriptInjector(resource.getSrc());
         selectionScript.insert(startPos, text);
@@ -276,22 +279,32 @@
     return selectionScript.toString();
   }
 
+  /**
+   * Generate a snippit of JavaScript to inject an external stylesheet.
+   * 
+   * <pre>
+   * if (!__gwt_stylesLoaded['URL']) {
+   *   var l = $doc.createElement('link');
+   *   __gwt_styleLoaded['URL'] = l;
+   *   l.setAttribute('rel', 'stylesheet');
+   *   l.setAttribute('href', HREF_EXPR);
+   *   $doc.getElementsByTagName('head')[0].appendChild(l);
+   * }
+   * </pre>
+   */
   protected String generateStylesheetInjector(String stylesheetUrl) {
+    String hrefExpr = "'" + stylesheetUrl + "'";
     if (isRelativeURL(stylesheetUrl)) {
-      return "  if (!__gwt_stylesLoaded['"
-          + stylesheetUrl
-          + "']) {\n"
-          + "    __gwt_stylesLoaded['"
-          + stylesheetUrl
-          + "'] = true;\n"
-          + "    document.write('<link rel=\\\"stylesheet\\\" href=\\\"'+base+'"
-          + stylesheetUrl + "\\\">');\n" + "  }\n";
-    } else {
-      return "  if (!__gwt_stylesLoaded['" + stylesheetUrl + "']) {\n"
-          + "    __gwt_stylesLoaded['" + stylesheetUrl + "'] = true;\n"
-          + "    document.write('<link rel=\\\"stylesheet\\\" href=\\\""
-          + stylesheetUrl + "\\\">');\n" + "  }\n";
+      hrefExpr = "base + " + hrefExpr;
     }
+
+    return "if (!__gwt_stylesLoaded['" + stylesheetUrl + "']) {\n           "
+        + "  var l = $doc.createElement('link');\n                          "
+        + "  __gwt_stylesLoaded['" + stylesheetUrl + "'] = l;\n             "
+        + "  l.setAttribute('rel', 'stylesheet');\n                         "
+        + "  l.setAttribute('href', " + hrefExpr + ");\n                    "
+        + "  $doc.getElementsByTagName('head')[0].appendChild(l);\n         "
+        + "}\n";
   }
 
   protected abstract String getCompilationExtension(TreeLogger logger,
diff --git a/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js b/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
index 8596941..496f3ee 100644
--- a/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
@@ -305,6 +305,9 @@
   function onBodyDone() {
     if (!bodyDone) {
       bodyDone = true;
+// __MODULE_STYLES_BEGIN__
+     // Style resources are injected here to prevent operation aborted errors on ie
+// __MODULE_STYLES_END__
       maybeStartModule();
 
       if ($doc.removeEventListener) {
@@ -353,9 +356,9 @@
     }
   }, 50);
 
-// __MODULE_DEPS_BEGIN__
-  // Module dependencies, such as scripts and css
-// __MODULE_DEPS_END__
+// __MODULE_SCRIPTS_BEGIN__
+  // Script resources are injected here
+// __MODULE_SCRIPTS_END__
   $doc.write('<script>__MODULE_FUNC__.onInjectionDone(\'__MODULE_NAME__\')</script>');
 }
 
diff --git a/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js b/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js
index 4b27ee7..179d0ba 100644
--- a/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/SingleScriptTemplate.js
@@ -221,6 +221,9 @@
   function onBodyDone() {
     if (!bodyDone) {
       bodyDone = true;
+// __MODULE_STYLES_BEGIN__
+     // Style resources are injected here to prevent operation aborted errors on ie
+// __MODULE_STYLES_END__
       maybeStartModule();
 
       if ($doc.removeEventListener) {
@@ -244,9 +247,9 @@
     }
   }, 50);
 
-// __MODULE_DEPS_BEGIN__
-  // Module dependencies, such as scripts and css
-// __MODULE_DEPS_END__
+// __MODULE_SCRIPTS_BEGIN__
+  // Script resources are injected here
+// __MODULE_SCRIPTS_END__
 }
 
 // Called from compiled code to hook the window's resize & load events (the
diff --git a/dev/core/src/com/google/gwt/core/linker/XSTemplate.js b/dev/core/src/com/google/gwt/core/linker/XSTemplate.js
index 5cc6ca4..24bcb8a 100644
--- a/dev/core/src/com/google/gwt/core/linker/XSTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/XSTemplate.js
@@ -278,6 +278,9 @@
   function onBodyDone() {
     if (!bodyDone) {
       bodyDone = true;
+// __MODULE_STYLES_BEGIN__
+     // Style resources are injected here to prevent operation aborted errors on ie
+// __MODULE_STYLES_END__
       maybeStartModule();
 
       if ($doc.removeEventListener) {
@@ -316,9 +319,9 @@
     // intentionally silent on property failure
     return;
   }  
-// __MODULE_DEPS_BEGIN__
-  // Module dependencies, such as scripts and css
-// __MODULE_DEPS_END__
+// __MODULE_SCRIPTS_BEGIN__
+  // Script resources are injected here
+// __MODULE_SCRIPTS_END__
   $doc.write('<script src="' + base + strongName + '"></script>');
   $stats && $stats('__MODULE_NAME__', 'startup', 'moduleRequested', {millis:(new Date()).getTime()});
 }