Author: etnu
Date: Mon Nov 24 13:35:32 2008
New Revision: 720297
URL: http://svn.apache.org/viewvc?rev=720297&view=rev
Log:
Fixed ordering problem in javascript output.
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java?rev=720297&r1=720296&r2=720297&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/RenderingContentRewriter.java
Mon Nov 24 13:35:32 2008
@@ -47,6 +47,7 @@
import org.apache.shindig.gadgets.spec.UserPref;
import org.apache.shindig.gadgets.spec.View;
+import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.inject.Inject;
@@ -55,11 +56,13 @@
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
@@ -122,6 +125,18 @@
Element head =
(Element)DomUtil.getFirstNamedChildNode(document.getDocumentElement(), "head");
+ // Remove all the elements currently in head and add them back after we
inject content
+ NodeList children = head.getChildNodes();
+ List<Node> existingHeadContent =
Lists.newArrayListWithCapacity(children.getLength());
+ for (int i = 0; i < children.getLength(); i++) {
+ existingHeadContent.add(children.item(i));
+ }
+
+ for (Node n : existingHeadContent) {
+ head.removeChild(n);
+ }
+
+
// Only inject default styles if no doctype was specified.
if (document.getDoctype() == null) {
Element defaultStyle = document.createElement("style");
@@ -141,7 +156,7 @@
injectPreloads(gadget, mainScriptTag);
// We need to inject our script before any developer scripts.
- head.insertBefore(mainScriptTag, DomUtil.getFirstNamedChildNode(head,
"script"));
+ head.appendChild(mainScriptTag);
Element body =
(Element)DomUtil.getFirstNamedChildNode(document.getDocumentElement(), "body");
@@ -150,6 +165,11 @@
body.setAttribute("dir", localeSpec.getLanguageDirection());
}
+ // re append head content
+ for (Node node : existingHeadContent) {
+ head.appendChild(node);
+ }
+
injectOnLoadHandlers(body);
mutableContent.documentChanged();
Modified:
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
URL:
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java?rev=720297&r1=720296&r2=720297&view=diff
==============================================================================
---
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
(original)
+++
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java
Mon Nov 24 13:35:32 2008
@@ -340,6 +340,36 @@
}
@Test
+ public void featuresDeclaredBeforeUsed() throws Exception {
+ String gadgetXml =
+ "<Module><ModulePrefs title=''>" +
+ " <Require feature='foo'/>" +
+ "</ModulePrefs>" +
+ "<Content type='html'/>" +
+ "</Module>";
+
+ Gadget gadget = makeGadgetWithSpec(gadgetXml);
+
+ featureRegistry.addInline("foo", "gadgets.Prefs.setMessages_ =
function(){};");
+ control.replay();
+
+ String rewritten = rewrite(gadget, BODY_CONTENT);
+
+ Matcher matcher = DOCUMENT_SPLIT_PATTERN.matcher(rewritten);
+ assertTrue("Output is not valid HTML.", matcher.matches());
+
+ String headContent = matcher.group(HEAD_GROUP);
+
+ // Locate user script.
+ int declaredPosition = headContent.indexOf("foo_content();");
+
+ // Anything else here, we added.
+ int usedPosition = headContent.indexOf("gadgets.Prefs.setMessages_");
+
+ assertTrue("Inline JS needs to exist before it is used.", declaredPosition
< usedPosition);
+ }
+
+ @Test
public void urlFeaturesForcedExternal() throws Exception {
String gadgetXml =
"<Module><ModulePrefs title=''>" +