Author: chirag
Date: Sun Sep 19 01:59:31 2010
New Revision: 998581

URL: http://svn.apache.org/viewvc?rev=998581&view=rev
Log:
SHINDIG-1428 | DefaultHtmlSerializer#serialize() should encode entities in 
attribute nodes
Code Review: http://codereview.appspot.com/2244042/

Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializerTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentTypeCharsetRemoverRewriterTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java?rev=998581&r1=998580&r2=998581&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializer.java
 Sun Sep 19 01:59:31 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.shindig.gadgets.parse;
 
+import com.google.caja.lexer.escaping.Escaping;
 import org.cyberneko.html.HTMLElements;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
@@ -168,26 +169,11 @@ public class DefaultHtmlSerializer imple
       if (attr.getNodeValue() != null) {
         output.append("=\"");
         if (attr.getNodeValue().length() != 0) {
-          printAttributeValue(attr.getNodeValue(), output);
+          Escaping.escapeXml(attr.getNodeValue(), /* asciiOnly */ true, 
output);
         }
         output.append('"');
       }
     }
     output.append(withXmlClose ? "/>" : ">");
   }
-
-  private static void printAttributeValue(String text, Appendable output) 
throws IOException {
-    int length = text.length();
-    for (int j = 0; j < length; j++) {
-      char c = text.charAt(j);
-      // TODO: Complete all special chars 
(http://www.w3.org/TR/REC-xml/#charsets)
-      if (c == '"') {
-        output.append("&quot;");
-      } else if (c == '&') {
-        output.append("&amp;");
-      } else {
-        output.append(c);
-      }
-    }
-  }
 }

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializerTest.java?rev=998581&r1=998580&r2=998581&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/DefaultHtmlSerializerTest.java
 Sun Sep 19 01:59:31 2010
@@ -19,8 +19,11 @@
 
 package org.apache.shindig.gadgets.parse;
 
+import org.apache.shindig.gadgets.parse.nekohtml.NekoSimplifiedHtmlParser;
 import org.junit.Test;
+import org.w3c.dom.DOMImplementation;
 import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 
@@ -29,13 +32,62 @@ import static org.junit.Assert.assertEqu
 public class DefaultHtmlSerializerTest {
 
   @Test
+  public void testComplicatedSerialize() throws Exception {
+    String txt = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 
Transitional//EN\""
+            + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\";>\n"
+            + "<html xml:lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\";>"
+            + "<head><title>Apache Shindig!</title></head>"
+            + "<body class=\"composite\">\n"
+            + "    <div id=\"bodyColumn\">hello\n"
+            + "      <div id=\"contentBox\"></div> \n"
+            + "      <div class=\"clear\"><hr></div> \n"
+            + "    </div>\n"
+            +   "</body></html>";
+    NekoSimplifiedHtmlParser parser = new NekoSimplifiedHtmlParser(
+        new ParseModule.DOMImplementationProvider().get());
+
+    Document doc = parser.parseDom(txt);
+    DefaultHtmlSerializer serializer = new DefaultHtmlSerializer();
+    assertEquals("Serialized full document", txt, serializer.serialize(doc));
+  }
+
+  @Test
   public void testComments() throws Exception {
+    
     Document doc = 
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
     doc.appendChild(doc.createElement("ABC"));
     doc.appendChild(doc.createComment("XYZ"));
 
     DefaultHtmlSerializer serializer = new DefaultHtmlSerializer();
-    assertEquals("Comment is preserved", "<ABC></ABC><!--XYZ-->", 
serializer.serialize(doc));
+    assertEquals("Comment is preserved",
+        "<ABC></ABC><!--XYZ-->", serializer.serialize(doc));
+  }
+
+  @Test
+  public void testEntities() throws Exception {
+    Document doc = 
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+
+    Element element = doc.createElement("abc");
+    element.setAttribute("a", "\\x3e\">");
+    doc.appendChild(element);
+
+    DefaultHtmlSerializer serializer = new DefaultHtmlSerializer();
+    assertEquals("Entities escaped",
+        "<abc a=\"\\x3e&#34;&gt;\"></abc>", serializer.serialize(doc));
+  }
+
+  @Test
+  public void testHrefEntities() throws Exception {
+    Document doc = 
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+
+    Element element = doc.createElement("a");
+    element.setAttribute("href", "http://apache.org/?a=0&query=2+3";);
+    doc.appendChild(element);
+
+    DefaultHtmlSerializer serializer = new DefaultHtmlSerializer();
+    assertEquals("href entities escaped",
+        "<a href=\"http://apache.org/?a=0&amp;query=2+3\";></a>",
+        serializer.serialize(doc));
   }
 }
 

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentTypeCharsetRemoverRewriterTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentTypeCharsetRemoverRewriterTest.java?rev=998581&r1=998580&r2=998581&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentTypeCharsetRemoverRewriterTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentTypeCharsetRemoverRewriterTest.java
 Sun Sep 19 01:59:31 2010
@@ -100,7 +100,7 @@ public class ContentTypeCharsetRemoverRe
                   + "</head><body><a href=\"hello\">Hello</a>"
                   + "</body></html>";
     String expected = "<html><head>"
-                      + "<meta content=\"text/html ; pharset=\'hello\'; 
hello=world\" "
+                      + "<meta content=\"text/html ; pharset=&#39;hello&#39;; 
hello=world\" "
                       + "http-equiv=\"Content-TYPE\">"
                       + "</head><body><a href=\"hello\">Hello</a>\n"
                       + "</body></html>";
@@ -120,7 +120,7 @@ public class ContentTypeCharsetRemoverRe
            + "</head><body><a href=\"hello\">Hello</a>"
            + "</body></html>";
     expected = "<html><head>"
-               + "<meta content=\"text/html ; charsett='hello'; hello=world\" "
+               + "<meta content=\"text/html ; charsett=&#39;hello&#39;; 
hello=world\" "
                + "http-equiv=\"Content-TYPE\">"
                + "</head><body><a href=\"hello\">Hello</a>\n"
                + "</body></html>";


Reply via email to