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=''>" +


Reply via email to