Revision: 4291
Author: [email protected]
Date: Tue Sep 28 09:41:05 2010
Log: Preserve XMLNS declarations in the DOM Parser
http://codereview.appspot.com/2183044

http://code.google.com/p/google-caja/issues/detail?id=1115

There've been a number of bugs pointing out that we remove XMLNS declarations in the output unless
there's an element that uses them.

So
  <div xmlns:svg="..."></div>
is rendered as
  <div></div>

This doesn't seem an error to me, but this change preserves XMLNS
declarations in the DOM and allows the renderer to output them as long
as they don't mask an existing declaration.

I'm not convinced this is a good idea though.
Some have argued that they are necessary for scripts.  E.g. that
  <div xmlns:foo="bar" id="baz"></div>
will behave differently when
  document.getElementById('baz').innerHTML = '<foo:boo/>';

I don't believe this.  Does anyone have a reference to a standard or an
actual testcase that demonstrates this.

[email protected]

http://code.google.com/p/google-caja/source/detail?r=4291

Modified:
 /trunk/src/com/google/caja/parser/html/Dom.java
 /trunk/src/com/google/caja/parser/html/DomParser.java
 /trunk/src/com/google/caja/parser/html/Nodes.java
 /trunk/src/com/google/caja/plugin/BuildServiceImplementation.java
 /trunk/tests/com/google/caja/parser/html/DomParserTest.java
 /trunk/tests/com/google/caja/parser/html/NodesTest.java
 /trunk/tests/com/google/caja/plugin/HtmlCompiledPluginTest.java
 /trunk/tests/com/google/caja/plugin/stages/RewriteHtmlStageTest.java
 /trunk/tests/com/google/caja/plugin/templates/IhtmlSanityCheckerTest.java
 /trunk/tests/com/google/caja/plugin/templates/LocalizerTest.java
 /trunk/tests/com/google/caja/plugin/templates/TemplateCompilerTest.java
 /trunk/tests/com/google/caja/plugin/templates/TemplateSanitizerTest.java

=======================================
--- /trunk/src/com/google/caja/parser/html/Dom.java     Mon Feb 22 08:26:46 2010
+++ /trunk/src/com/google/caja/parser/html/Dom.java     Tue Sep 28 09:41:05 2010
@@ -19,6 +19,7 @@
 import com.google.caja.parser.html.Nodes;
 import com.google.caja.parser.js.NoChildren;
 import com.google.caja.render.Concatenator;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.MessageContext;
 import com.google.caja.reporting.RenderContext;
 import com.google.caja.util.Callback;
@@ -54,7 +55,7 @@
   public void formatSelf(MessageContext context, int depth, Appendable out)
       throws IOException {
     out.append(this.getClass().getSimpleName()).append(" : ");
-    String html = Nodes.render(n, true)
+    String html = Nodes.render(n, MarkupRenderMode.XML)
         .replace("\\", "\\\\").replace("\n", "\\n").replace("\r", "\\r");
     if (html.length() > 40) {
       html = html.substring(0, 37) + "...";
=======================================
--- /trunk/src/com/google/caja/parser/html/DomParser.java Mon Aug 16 13:03:24 2010 +++ /trunk/src/com/google/caja/parser/html/DomParser.java Tue Sep 28 09:41:05 2010
@@ -334,7 +334,6 @@
         Document doc = el.getOwnerDocument();
         // First, look at any xmlns:* attributes and add to the inScope
         // namespace.
-        boolean hasNamespaceAttrs = false;
         {
           NamedNodeMap attrs = el.getAttributes();
           for (int i = 0, n = attrs.getLength(); i < n; ++i) {
@@ -343,7 +342,6 @@
             String name = a.getName();
             if (name.startsWith(AttributeNameFixup.XMLNS_PREFIX)) {
               String qname = AttributeNameFixup.qnameFromFixupName(name);
-              hasNamespaceAttrs = true;
               String prefix = qname.substring(6);  // "xmlns:".length()
               String uri = a.getValue();
               ns = new Namespaces(ns, prefix, uri);
@@ -394,13 +392,6 @@
             {
               String name = a.getName();
if (!name.startsWith(AttributeNameFixup.PREFIX)) { continue; }
-              if (hasNamespaceAttrs
-                  && name.startsWith(AttributeNameFixup.XMLNS_PREFIX)) {
-                el.removeAttributeNode(a);
-                modifiedAttrs = true;
-                n = attrs.getLength();
-                continue;
-              }
               if (a.getNamespaceURI() != null) { continue; }
               qname = AttributeNameFixup.qnameFromFixupName(name);
             }
=======================================
--- /trunk/src/com/google/caja/parser/html/Nodes.java Tue Aug 10 14:40:28 2010 +++ /trunk/src/com/google/caja/parser/html/Nodes.java Tue Sep 28 09:41:05 2010
@@ -239,6 +239,7 @@
     return render(node, false);
   }

+  @Deprecated
   public static String render(Node node, boolean asXml) {
return render(node, asXml ? MarkupRenderMode.XML : MarkupRenderMode.HTML);
   }
@@ -318,7 +319,6 @@
         }
         NamedNodeMap attrs = el.getAttributes();
         for (int i = 0, n = attrs.getLength(); i < n; ++i) {
-          out.append(' ');
           Attr a = (Attr) attrs.item(i);
           String attrUri = a.getNamespaceURI();
           // Attributes created via setAttribute calls for ISINDEX elements
@@ -327,10 +327,14 @@
             Namespaces attrNs = ns.forUri(attrUri);
             if (attrNs == null) {
               attrNs = ns = addNamespace(ns, attrUri);
-              renderNamespace(attrNs);
               out.append(' ');
-            }
-            out.append(attrNs.prefix).append(':');
+              renderNamespace(attrNs);
+            } else if ("xmlns".equals(attrNs.prefix)) {
+              continue;
+            }
+            out.append(' ').append(attrNs.prefix).append(':');
+          } else {
+            out.append(' ');
           }
           renderAttr(a, HTML_NS.equals(attrUri));
         }
@@ -463,7 +467,7 @@
     if (localName == null) {
       localName = a.getName();
       if (localName.indexOf(':') >= 0 || localName.startsWith("xmlns")) {
-        throw new IllegalStateException();
+        throw new IllegalArgumentException(localName);
       }
     }
     localName = emitLocalName(localName, isHtml);
=======================================
--- /trunk/src/com/google/caja/plugin/BuildServiceImplementation.java Mon Jul 12 16:56:22 2010 +++ /trunk/src/com/google/caja/plugin/BuildServiceImplementation.java Tue Sep 28 09:41:05 2010
@@ -33,6 +33,7 @@
 import com.google.caja.parser.js.ObjectConstructor;
 import com.google.caja.parser.js.Parser;
 import com.google.caja.parser.js.Statement;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.Message;
 import com.google.caja.reporting.MessageContext;
 import com.google.caja.reporting.MessageLevel;
@@ -251,7 +252,8 @@

       String htmlOut = "";
       if (outputHtml != null) {
-        htmlOut = Nodes.render(outputHtml, asXml);
+        htmlOut = Nodes.render(
+ outputHtml, asXml ? MarkupRenderMode.XML : MarkupRenderMode.HTML);
       }

       String translatedCode;
@@ -261,7 +263,8 @@
         Element script = doc.createElementNS(ns, "script");
         script.setAttributeNS(ns, "type", "text/javascript");
         script.appendChild(doc.createCDATASection(jsOut.toString()));
-        translatedCode = htmlOut + Nodes.render(script, asXml);
+        translatedCode = htmlOut + Nodes.render(
+            script, asXml ? MarkupRenderMode.XML : MarkupRenderMode.HTML);
       } else {
         if (!"".equals(htmlOut)) {
           throw new RuntimeException("Can't emit HTML to " + output);
=======================================
--- /trunk/tests/com/google/caja/parser/html/DomParserTest.java Mon Aug 16 13:03:24 2010 +++ /trunk/tests/com/google/caja/parser/html/DomParserTest.java Tue Sep 28 09:41:05 2010
@@ -23,6 +23,7 @@
 import com.google.caja.lexer.ParseException;
 import com.google.caja.lexer.TokenQueue;
 import com.google.caja.reporting.DevNullMessageQueue;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.Message;
 import com.google.caja.reporting.MessageQueue;
 import com.google.caja.reporting.MessageType;
@@ -309,8 +310,6 @@
             "    Value : en 5+63-5+67",
             "  Attrib : xml:lang 5+44-5+52",
             "    Value : en 5+53-5+57",
- // xmlns declarations do not appear in output since they are not
-            // real attributes.
             "  Element : head 6+1-7+8",
             "    Text : \\n 6+7-7+1",
             "  Text : \\n 7+8-8+1",
@@ -2437,7 +2436,7 @@
         + "<![CDATA[ 1 < 2 && 3 > 4 ]]>\n"
         + "<xmp>1 &lt; 2</xmp>\n"
         + "<script> foo() &lt; bar() </script>",
-        Nodes.render(t, true));
+        Nodes.render(t, MarkupRenderMode.XML));
     // Rendered as HTML
     assertEquals(
         ""
@@ -2446,15 +2445,17 @@
         + " 1 &lt; 2 &amp;&amp; 3 &gt; 4 \n"
         + "<xmp>1 < 2</xmp>\n"
         + "<script> foo() < bar() </script>",
-        Nodes.render(t, false));
+        Nodes.render(t, MarkupRenderMode.HTML));
   }

   public final void testUnrenderableXMLTree1() throws Exception {
     DocumentFragment t = xmlFragment(
         fromString("<xmp><![CDATA[ </xmp> ]]></xmp>"));
-    assertEquals("<xmp><![CDATA[ </xmp> ]]></xmp>", Nodes.render(t, true));
+    assertEquals(
+        "<xmp><![CDATA[ </xmp> ]]></xmp>",
+        Nodes.render(t, MarkupRenderMode.XML));
     try {
-      String badness = Nodes.render(t, false);
+      String badness = Nodes.render(t, MarkupRenderMode.HTML);
       fail("Bad HTML rendered: " + badness);
     } catch (IllegalStateException ex) {
       // Cannot produce <xmp></xmp></xmp> safely in HTML.
@@ -2464,9 +2465,11 @@
   public final void testUnrenderableXMLTree2() throws Exception {
     DocumentFragment t = xmlFragment(
         fromString("<xmp><![CDATA[ </xM]]>p </xmp>"));
-    assertEquals("<xmp><![CDATA[ </xM]]>p </xmp>", Nodes.render(t, true));
+    assertEquals(
+        "<xmp><![CDATA[ </xM]]>p </xmp>",
+        Nodes.render(t, MarkupRenderMode.XML));
     try {
-      String badness = Nodes.render(t, false);
+      String badness = Nodes.render(t, MarkupRenderMode.HTML);
       fail("Bad HTML rendered: " + badness);
     } catch (IllegalStateException ex) {
       // Cannot produce <xmp> </xMp </xmp> safely in HTML.
@@ -2476,9 +2479,10 @@
   public final void testUnrenderableXMLTree3() throws Exception {
     DocumentFragment t = xmlFragment(
         fromString("<xmp> &lt;/XM<!-- -->P&gt; </xmp>"));
-    assertEquals("<xmp> &lt;/XMP&gt; </xmp>", Nodes.render(t, true));
+    assertEquals(
+ "<xmp> &lt;/XMP&gt; </xmp>", Nodes.render(t, MarkupRenderMode.XML));
     try {
-      String badness = Nodes.render(t, false);
+      String badness = Nodes.render(t, MarkupRenderMode.HTML);
       fail("Bad HTML rendered: " + badness);
     } catch (IllegalStateException ex) {
       // Cannot produce <xmp> </XMP> </xmp> safely in HTML.
@@ -2488,8 +2492,8 @@
   public final void testCommentsHidingCdataEnd() throws Exception {
     DocumentFragment t = xmlFragment(
         fromString("<xmp> <!-- </xmp> --> </xmp>"));
-    assertEquals("<xmp>  </xmp>", Nodes.render(t, true));
-    assertEquals("<xmp>  </xmp>", Nodes.render(t, false));
+    assertEquals("<xmp>  </xmp>", Nodes.render(t, MarkupRenderMode.XML));
+    assertEquals("<xmp>  </xmp>", Nodes.render(t, MarkupRenderMode.HTML));
   }

   public final void testEofMessageDueToMismatchedQuotes() {
@@ -2534,6 +2538,21 @@
         + "</script>",
         Nodes.render(f));
   }
+
+  public final void testIssue1211DefaultXmlnsOnScript() throws Exception {
+    DocumentFragment f = htmlFragment(fromString(
+        ""
+        + "<script type=\"text/os-data\"\n"
+        + "    xmlns=\"http://ns.opensocial.org/2008/markup\";>\n"
+        + "  <ViewerRequest key=\"viewer\"/>\n"
+        + "</script>"));
+    assertEquals(
+        ""
+        + "<script type=\"text/os-data\">\n"
+        + "  <ViewerRequest key=\"viewer\"/>\n"
+        + "</script>",
+        Nodes.render(f));
+  }

   public final void testIssue1211XmlnsOnDiv() throws Exception {
     DocumentFragment f = htmlFragment(fromString(
@@ -2677,13 +2696,14 @@
     }
     MoreAsserts.assertListsEqual(expectedMessages, actualMessages, 0);

+ MarkupRenderMode rm = asXml ? MarkupRenderMode.XML : MarkupRenderMode.HTML;
     MoreAsserts.assertListsEqual(
         expectedOutputHtml,
-        Arrays.asList(Nodes.render(tree, asXml).split("\n")));
+        Arrays.asList(Nodes.render(tree, rm).split("\n")));
     Node clone = tree.cloneNode(true);
     MoreAsserts.assertListsEqual(
         expectedOutputHtml,
-        Arrays.asList(Nodes.render(clone, asXml).split("\n")));
+        Arrays.asList(Nodes.render(clone, rm).split("\n")));

// Make sure that parsing with and without debug data return the same tree
     // structure.
=======================================
--- /trunk/tests/com/google/caja/parser/html/NodesTest.java Tue Aug 10 14:40:28 2010 +++ /trunk/tests/com/google/caja/parser/html/NodesTest.java Tue Sep 28 09:41:05 2010
@@ -98,12 +98,16 @@
   public final void testRenderOfEmbeddedXml() throws Exception {
     assertEquals(
         "<td width=\"10\"><svg:Rect width=\"50\"></svg:Rect></td>",
-        Nodes.render(xmlFragment(fromString(
- "<html:td width='10'><svg:Rect width='50'/></html:td>")), false));
+        Nodes.render(
+            xmlFragment(fromString(
+                "<html:td width='10'><svg:Rect width='50'/></html:td>")),
+            MarkupRenderMode.HTML));
     assertEquals(
         "<td width=\"10\"><svg:Rect width=\"50\" /></td>",
-        Nodes.render(xmlFragment(fromString(
- "<html:td width='10'><svg:Rect width='50'/></html:td>")), true));
+        Nodes.render(
+            xmlFragment(fromString(
+                "<html:td width='10'><svg:Rect width='50'/></html:td>")),
+            MarkupRenderMode.XML));
   }

public final void testRenderWithNonstandardNamespaces() throws Exception {
@@ -114,7 +118,7 @@
             + "<html:td width='10' xmlns:s='http://www.w3.org/2000/svg'>"
             + "<s:Rect width='50'/>"
             + "</html:td>")),
-            true));
+            MarkupRenderMode.XML));
   }

   public final void testRenderWithUnknownNamespace() throws Exception {
@@ -130,7 +134,7 @@
             + " xmlns:bar='http://bobs.house.of/XML&BBQ'>"
             + "<bar:baz boo='howdy' xml:lang='es'/>"
             + "</foo>")),
-            true));
+            MarkupRenderMode.XML));
   }

public final void testRenderWithMaskedInputNamespace1() throws Exception {
@@ -184,8 +188,7 @@

   public final void testNoSneakyNamespaceDecls1() throws Exception {
     Document doc = DomParser.makeDocument(null, null);
-    Element el = doc.createElementNS(
-        Namespaces.SVG_NAMESPACE_URI, "span");
+    Element el = doc.createElementNS(Namespaces.SVG_NAMESPACE_URI, "span");
     try {
       el.setAttributeNS(
Namespaces.SVG_NAMESPACE_URI, "xmlns", Namespaces.HTML_NAMESPACE_URI);
@@ -201,17 +204,16 @@
el.appendChild(doc.createElementNS(Namespaces.SVG_NAMESPACE_URI, "br"));
     String rendered;
     try {
-      rendered = Nodes.render(el);
+      rendered = Nodes.render(el, MarkupRenderMode.XML);
     } catch (RuntimeException ex) {
       return;  // Failure is an option.
     }
-    assertEquals("<svg:span><svg:br/></svg:span>", rendered);
+    assertEquals("<svg:span><svg:br /></svg:span>", rendered);
   }

   public final void testNoSneakyNamespaceDecls2() throws Exception {
     Document doc = DomParser.makeDocument(null, null);
-    Element el = doc.createElementNS(
-        Namespaces.SVG_NAMESPACE_URI, "span");
+    Element el = doc.createElementNS(Namespaces.SVG_NAMESPACE_URI, "span");
     try {
       el.setAttributeNS(
Namespaces.XMLNS_NAMESPACE_URI, "svg", Namespaces.HTML_NAMESPACE_URI);
@@ -227,17 +229,34 @@
el.appendChild(doc.createElementNS(Namespaces.SVG_NAMESPACE_URI, "br"));
     String rendered;
     try {
-      rendered = Nodes.render(el);
+      rendered = Nodes.render(el, MarkupRenderMode.XML);
     } catch (RuntimeException ex) {
       return;  // Failure is an option.
     }
-    assertEquals("<svg:span><svg:br/></svg:span>", rendered);
+    assertEquals("<svg:span><svg:br /></svg:span>", rendered);
+  }
+
+  public final void testNoSneakyNamespaceDecls3() throws Exception {
+    Document doc = DomParser.makeDocument(null, null);
+    Element el = doc.createElementNS(
+        Namespaces.SVG_NAMESPACE_URI, "span");
+    // Override a definition used elsewhere.
+    el.setAttribute("xmlns:svg", Namespaces.HTML_NAMESPACE_URI);
+
+ el.appendChild(doc.createElementNS(Namespaces.SVG_NAMESPACE_URI, "br"));
+    String rendered;
+    try {
+      rendered = Nodes.render(el, MarkupRenderMode.XML);
+    } catch (RuntimeException ex) {
+      return;  // Failure is an option.
+    }
+    assertEquals("<svg:span><svg:br /></svg:span>", rendered);
   }

   public final void testProcessingInstructions() {
     Document doc = DomParser.makeDocument(null, null);
ProcessingInstruction pi = doc.createProcessingInstruction("foo", "bar");
-    assertEquals("<?foo bar?>", Nodes.render(pi, true));
+    assertEquals("<?foo bar?>", Nodes.render(pi, MarkupRenderMode.XML));
   }

   public final void testBadProcessingInstructions() {
@@ -250,7 +269,7 @@
       try {
         ProcessingInstruction pi = doc.createProcessingInstruction(
             badPi[0], badPi[1]);
-        Nodes.render(pi, true);
+        Nodes.render(pi, MarkupRenderMode.XML);
       } catch (IllegalStateException ex) {
         continue;  // OK
       } catch (DOMException ex) {
@@ -268,9 +287,9 @@
     el.appendChild(pi);
     assertEquals(
         "<div><?foo <script>alert(1)</script>?></div>",
-        Nodes.render(el, /* XML */true));
+        Nodes.render(el, MarkupRenderMode.XML));
     try {
-      Nodes.render(el, /* HTML */false);
+      Nodes.render(el, MarkupRenderMode.HTML);
     } catch (IllegalStateException ex) {
       // OK
       return;
=======================================
--- /trunk/tests/com/google/caja/plugin/HtmlCompiledPluginTest.java Mon Jul 12 16:56:22 2010 +++ /trunk/tests/com/google/caja/plugin/HtmlCompiledPluginTest.java Tue Sep 28 09:41:05 2010
@@ -23,6 +23,7 @@
 import com.google.caja.parser.js.Block;
 import com.google.caja.parser.js.CajoledModule;
 import com.google.caja.parser.js.UncajoledModule;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.MessageLevel;
 import com.google.caja.reporting.MessageType;
 import com.google.caja.reporting.TestBuildInfo;
@@ -258,7 +259,8 @@
       fail();
     } else {
       CajoledModule jsTree = compiler.getJavascript();
-      String staticHtml = Nodes.render(compiler.getStaticHtml(), true);
+      String staticHtml = Nodes.render(
+          compiler.getStaticHtml(), MarkupRenderMode.XML);
       String js = render(jsTree);

       Block valijaOrigNode = js(fromResource(
=======================================
--- /trunk/tests/com/google/caja/plugin/stages/RewriteHtmlStageTest.java Mon Jul 12 16:56:22 2010 +++ /trunk/tests/com/google/caja/plugin/stages/RewriteHtmlStageTest.java Tue Sep 28 09:41:05 2010
@@ -27,6 +27,7 @@
 import com.google.caja.reporting.MessagePart;
 import com.google.caja.reporting.MessageType;
 import com.google.caja.util.ContentType;
+import com.google.caja.util.Join;
 import com.google.caja.util.Lists;

 import org.w3c.dom.Element;
@@ -91,28 +92,34 @@

   public final void testDataUris() throws Exception {
     assertPipeline(
- job("foo<script src='data:text/javascript,extracted();'>bar</script>baz", ContentType.HTML),
+        job("foo<script src='data:text/javascript,extracted();'>"
+            + "bar</script>baz",
+            ContentType.HTML),
         job("foo<span jobnum=\"1\"></span>baz", ContentType.HTML),
         job("{ extracted(); }", ContentType.JS)
         );
     assertNoErrors();

     assertPipeline(
- job("foo<script src='data:,extracted();'>bar</script>baz", ContentType.HTML),
+        job("foo<script src='data:,extracted();'>bar</script>baz",
+            ContentType.HTML),
         job("foo<span jobnum=\"1\"></span>baz", ContentType.HTML),
         job("{ extracted(); }", ContentType.JS)
         );
     assertNoErrors();

     assertPipeline(
- job("foo<script src='data:iso-8859-7;charset=utf-8,extracted%28%29%3B'>bar</script>baz", ContentType.HTML), + job("foo<script src='data:iso-8859-7;charset=utf-8,extracted%28%29%3B'>"
+            + "bar</script>baz", ContentType.HTML),
         job("foo<span jobnum=\"1\"></span>baz", ContentType.HTML),
         job("{ extracted(); }", ContentType.JS)
         );
     assertNoErrors();

     assertPipeline(
- job("foo<script src='data:text/javascript;charset=utf-8;base64,ZXh0cmFjdGVkKCk7'>bar</script>baz", ContentType.HTML),
+        job("foo<script src="
+ + "'data:text/javascript;charset=utf-8;base64,ZXh0cmFjdGVkKCk7'>"
+            + "bar</script>baz", ContentType.HTML),
         job("foo<span jobnum=\"1\"></span>baz", ContentType.HTML),
         job("{ extracted(); }", ContentType.JS)
         );
@@ -231,6 +238,28 @@
         job("IMPORTS___.htmlEmitter___.addBodyClasses('foo')",
             ContentType.JS));
   }
+
+  public final void testOSMLScriptElements() throws Exception {
+    assertPipeline(
+        job(Join.join(
+                "\n",
+                "Before OS Template",
+                "<script type=\"text/opensocial\"",
+                " xmlns:os=\"http://ns.opensocial.org/2008/markup\";>",
+                "  a ? Hello <os:template",
+                "  name=\"bob\"> World",
+                "  1 </os:template>/",
+                "</script>",
+                "After OS Template"),
+            ContentType.HTML),
+        // Script element removed, but not parsed as JS.
+        job("Before OS Template\n\nAfter OS Template",
+            ContentType.HTML));
+    assertMessage(
+ true, PluginMessageType.UNRECOGNIZED_CONTENT_TYPE, MessageLevel.WARNING,
+        MessagePart.Factory.valueOf("text/opensocial"));
+    assertNoWarnings();
+  }

   @Override
   protected boolean runPipeline(Jobs jobs) throws Exception {
=======================================
--- /trunk/tests/com/google/caja/plugin/templates/IhtmlSanityCheckerTest.java Tue Jun 1 16:47:13 2010 +++ /trunk/tests/com/google/caja/plugin/templates/IhtmlSanityCheckerTest.java Tue Sep 28 09:41:05 2010
@@ -20,6 +20,7 @@
 import com.google.caja.parser.html.ElKey;
 import com.google.caja.parser.html.Namespaces;
 import com.google.caja.parser.html.Nodes;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.Message;
 import com.google.caja.reporting.MessageLevel;
 import com.google.caja.reporting.MessagePart;
@@ -522,7 +523,7 @@
     }
     assertMessagesLessSevereThan(MessageLevel.WARNING);

-    String checkedIhtml = Nodes.render(ihtmlRoot, true);
+    String checkedIhtml = Nodes.render(ihtmlRoot, MarkupRenderMode.XML);
     assertEquals(goldenIhtml, checkedIhtml);
   }

=======================================
--- /trunk/tests/com/google/caja/plugin/templates/LocalizerTest.java Thu Dec 10 17:39:38 2009 +++ /trunk/tests/com/google/caja/plugin/templates/LocalizerTest.java Tue Sep 28 09:41:05 2010
@@ -23,6 +23,7 @@
 import com.google.caja.lexer.Token;
 import com.google.caja.parser.html.DomParser;
 import com.google.caja.parser.html.Nodes;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.MessageLevel;
 import com.google.caja.reporting.MessagePart;
 import com.google.caja.util.CajaTestCase;
@@ -116,7 +117,8 @@
         + "  ore-May poofs and-ay ake-may em-thay cheesy, ease-play!\n"
+ " <a href=\"bar\">inkLay2</a> ommakay <a href=\"foo\">inkLay1</a>\n"
         + "</ihtml:template>",
-        Nodes.render(ihtmlRoot, true).replaceAll("\n[ \n]*\n", "\n"));
+        Nodes.render(ihtmlRoot, MarkupRenderMode.XML)
+            .replaceAll("\n[ \n]*\n", "\n"));
     assertMessage(
         true, IhtmlMessageType.UNTRANSLATED_MESSAGE, MessageLevel.WARNING,
         FilePosition.fromLinePositions(is, 4, 3, 8, 19),
@@ -194,7 +196,7 @@
     assertEquals(
         Nodes.render(xmlFragment(fromString(
             "<ihtml:ph name=startLink />Click<ihtml:ph name=endLink />")),
-            true),
+            MarkupRenderMode.XML),
         msg.getSerializedForm());
     assertEquals(
         Nodes.render(xmlFragment(fromString(
@@ -203,7 +205,7 @@
             + " title='click me'>"
             + "Click"
             + "</button>"
-            + "<br clear='all'/>")), true),
+            + "<br clear='all'/>")), MarkupRenderMode.XML),
         Nodes.render(msg.substitute(
             DomParser.makeDocument(null, null),
             new LocalizedHtml.PlaceholderHandler() {
@@ -242,7 +244,7 @@
                   }
                 };
               }
-            }), true));
+            }), MarkupRenderMode.XML));
     assertNoErrors();
   }
 }
=======================================
--- /trunk/tests/com/google/caja/plugin/templates/TemplateCompilerTest.java Tue Aug 24 13:37:35 2010 +++ /trunk/tests/com/google/caja/plugin/templates/TemplateCompilerTest.java Tue Sep 28 09:41:05 2010
@@ -42,6 +42,7 @@
 import com.google.caja.plugin.UriFetcher;
 import com.google.caja.plugin.UriPolicy;
 import com.google.caja.plugin.UriPolicyHintKey;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.MessageLevel;
 import com.google.caja.reporting.MessagePart;
 import com.google.caja.util.CajaTestCase;
@@ -739,6 +740,15 @@
htmlFragment(fromString("<input autocomplete=\"off\" type=\"text\">")),
         new Block(), false);
   }
+
+  public final void testXmlnsAttrs() throws Exception {
+    // XMLNS attributes stripped out.
+    assertSafeHtml(
+        htmlFragment(fromString(
+ "<div xmlns:os=\"http://ns.opensocial.org/2008/markup\";></div>")),
+        htmlFragment(fromString("<div></div>")),
+        new Block(), true);
+  }

   private void assertSafeHtml(
       DocumentFragment input, DocumentFragment htmlGolden, Block jsGolden)
@@ -782,7 +792,8 @@
     assertEquals(safeContent.a.getOwnerDocument(), doc);

     assertEquals(
-        Nodes.render(htmlGolden, true), Nodes.render(safeContent.a, true));
+        Nodes.render(htmlGolden, MarkupRenderMode.XML),
+        Nodes.render(safeContent.a, MarkupRenderMode.XML));
     assertEquals(
renderProgram(jsGolden), renderProgram(consolidate(safeContent.b)));
  }
=======================================
--- /trunk/tests/com/google/caja/plugin/templates/TemplateSanitizerTest.java Tue Jul 20 20:41:35 2010 +++ /trunk/tests/com/google/caja/plugin/templates/TemplateSanitizerTest.java Tue Sep 28 09:41:05 2010
@@ -16,6 +16,7 @@

 import com.google.caja.lang.html.HtmlSchema;
 import com.google.caja.parser.html.Nodes;
+import com.google.caja.reporting.MarkupRenderMode;
 import com.google.caja.reporting.Message;
 import com.google.caja.reporting.MessageLevel;
 import com.google.caja.util.CajaTestCase;
@@ -340,7 +341,7 @@
     assertEquals(valid, validated);

     if (golden != null) {
-      assertEquals(golden, Nodes.render(input, true));
+      assertEquals(golden, Nodes.render(input, MarkupRenderMode.XML));
     }
   }
 }

Reply via email to