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(""");
- } else if (c == '&') {
- output.append("&");
- } 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">\"></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&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='hello';
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='hello';
hello=world\" "
+ "http-equiv=\"Content-TYPE\">"
+ "</head><body><a href=\"hello\">Hello</a>\n"
+ "</body></html>";