Author: lindner
Date: Mon Aug 30 20:23:53 2010
New Revision: 990930

URL: http://svn.apache.org/viewvc?rev=990930&view=rev
Log:
Patch from Manyam N H Satyanarayana | Move the style related nodes to top of 
the head node instead of appending at the end

Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitor.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitorTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitor.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitor.java?rev=990930&r1=990929&r2=990930&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitor.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitor.java
 Mon Aug 30 20:23:53 2010
@@ -42,8 +42,8 @@ public class StyleAdjacencyVisitor imple
         ("style".equalsIgnoreCase(node.getNodeName()) ||
          ("link".equalsIgnoreCase(node.getNodeName()) &&
           ("stylesheet".equalsIgnoreCase(getAttrib(node, "rel")) ||
-           (getAttrib(node, "type").toLowerCase().contains("css")))))) {
-      // Reserve <style...>, <link rel="stylesheet"...>, or <link 
type="*css*"...>
+           ("text/css".equalsIgnoreCase(getAttrib(node, "type"))))))) {
+      // Reserve <style...>, <link rel="stylesheet"...>, or <link 
type="text/css"...>
       return VisitStatus.RESERVE_TREE;
     }
     
@@ -59,10 +59,19 @@ public class StyleAdjacencyVisitor imple
       // Should never occur; do for paranoia's sake.
       return false;
     }
-    
-    for (Node node : nodes) {
-      // Append all at the end of head. Relative order is maintained.
-      head.appendChild(node.getParentNode().removeChild(node));
+
+    Node firstChild = head.getFirstChild();
+    for (int i = nodes.size() - 1; i >= 0; i--) {
+      // Insert all in the top of the head. Relative order is maintained.
+      Node currentNode = nodes.get(i);
+      currentNode.getParentNode().removeChild(currentNode);
+      if (firstChild == null) {
+        head.appendChild(currentNode);
+      } else {
+        head.insertBefore(currentNode, firstChild);
+      }
+
+      firstChild = currentNode;
     }
     
     return true;

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitorTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitorTest.java?rev=990930&r1=990929&r2=990930&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitorTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/StyleAdjacencyVisitorTest.java
 Mon Aug 30 20:23:53 2010
@@ -60,7 +60,7 @@ public class StyleAdjacencyVisitorTest e
   public void visitLinkCaseInsensitive() throws Exception {
     Node node = elem("lINK", "REL", "stYlEsheet");
     assertEquals(VisitStatus.RESERVE_TREE, visit(node));
-    node = elem("LINk", "tyPe", "csS");
+    node = elem("LINk", "tyPe", "text/csS");
     assertEquals(VisitStatus.RESERVE_TREE, visit(node));
   }
   
@@ -81,7 +81,13 @@ public class StyleAdjacencyVisitorTest e
     Node node = elem("link");
     assertEquals(VisitStatus.BYPASS, visit(node));
   }
-  
+
+  @Test
+  public void bypassLinkWithWrongAttribs() throws Exception {
+    Node node = elem("link", "type", "somecss");
+    assertEquals(VisitStatus.BYPASS, visit(node));
+  }
+
   @Test
   public void bypassText() throws Exception {
     Node node = doc.createTextNode("text");
@@ -110,7 +116,7 @@ public class StyleAdjacencyVisitorTest e
     
     // Reshuffling validation.
     assertEquals(4, head.getChildNodes().getLength());
-    assertSame(style, head.getChildNodes().item(3)); // Last.
+    assertSame(style, head.getChildNodes().item(0)); // First.
   }
   
   @Test
@@ -129,10 +135,37 @@ public class StyleAdjacencyVisitorTest e
     
     // Reshuffling validation.
     assertEquals(2, head.getChildNodes().getLength());
-    assertSame(style, head.getChildNodes().item(1)); // Last.
+    assertSame(style, head.getChildNodes().item(0)); // First.
     assertEquals(3, body.getChildNodes().getLength());
   }
-  
+
+  @Test
+  public void reshuffleMultipleStyleNodesWithNoChildernInHead() throws 
Exception {
+    Node style1 = elem("style");
+    Node style2 = elem("style");
+    Node style3 = elem("style");
+
+    // Some in head, some in body.
+    Node html = htmlDoc(new Node[] {}, elem("script"), style1, elem("foo"),
+        doc.createTextNode("text1"), style2, doc.createComment("comment"), 
elem("div"),
+        style3);
+    assertTrue(revisit(style1, style2, style3));
+
+    // Document structure sanity tests.
+    assertEquals(2, html.getChildNodes().getLength());
+    Node head = html.getFirstChild();
+    assertEquals("head", head.getNodeName());
+    Node body = html.getLastChild();
+    assertEquals("body", body.getNodeName());
+
+    // Reshuffling validation.
+    assertEquals(3, head.getChildNodes().getLength());
+    assertSame(style1, head.getChildNodes().item(0));
+    assertSame(style2, head.getChildNodes().item(1));
+    assertSame(style3, head.getChildNodes().item(2));
+    assertEquals(5, body.getChildNodes().getLength());
+  }
+
   @Test
   public void reshuffleMultipleStyleNodes() throws Exception {
     Node style1 = elem("style");
@@ -154,9 +187,9 @@ public class StyleAdjacencyVisitorTest e
     
     // Reshuffling validation.
     assertEquals(5, head.getChildNodes().getLength());
-    assertSame(style1, head.getChildNodes().item(2));
-    assertSame(style2, head.getChildNodes().item(3));
-    assertSame(style3, head.getChildNodes().item(4));
+    assertSame(style1, head.getChildNodes().item(0));
+    assertSame(style2, head.getChildNodes().item(1));
+    assertSame(style3, head.getChildNodes().item(2));
     assertEquals(3, body.getChildNodes().getLength());
   }
   
@@ -167,7 +200,7 @@ public class StyleAdjacencyVisitorTest e
     Node link3 = elem("link", "rel", "stylesheet");
     
     // Some in head, some in body.
-    Node html = htmlDoc(new Node[] { elem("script"), link1, elem("foo") },
+    Node html = htmlDoc(new Node[] { link1, elem("script"), elem("foo") },
         doc.createTextNode("text1"), link2, doc.createComment("comment"), 
elem("div"),
         link3);
     assertTrue(revisit(link1, link2, link3));
@@ -181,9 +214,9 @@ public class StyleAdjacencyVisitorTest e
     
     // Reshuffling validation.
     assertEquals(5, head.getChildNodes().getLength());
-    assertSame(link1, head.getChildNodes().item(2));
-    assertSame(link2, head.getChildNodes().item(3));
-    assertSame(link3, head.getChildNodes().item(4));
+    assertSame(link1, head.getChildNodes().item(0));
+    assertSame(link2, head.getChildNodes().item(1));
+    assertSame(link3, head.getChildNodes().item(2));
     assertEquals(3, body.getChildNodes().getLength());
   }
   
@@ -211,10 +244,10 @@ public class StyleAdjacencyVisitorTest e
     
     // Reshuffling validation.
     assertEquals(8, head.getChildNodes().getLength());
-    assertSame(style1, head.getChildNodes().item(4));
-    assertSame(link1, head.getChildNodes().item(5));
-    assertSame(style2, head.getChildNodes().item(6));
-    assertSame(link2, head.getChildNodes().item(7));
+    assertSame(style1, head.getChildNodes().item(0));
+    assertSame(link1, head.getChildNodes().item(1));
+    assertSame(style2, head.getChildNodes().item(2));
+    assertSame(link2, head.getChildNodes().item(3));
     assertEquals(0, div.getChildNodes().getLength());
     assertEquals(3, body.getChildNodes().getLength());
   }


Reply via email to