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()});
}