2006-02-22 Cesar Lopez Nataren <cnataren@novell.com>
authorCésar Natarén <cesar@mono-cvs.ximian.com>
Wed, 22 Feb 2006 23:39:12 +0000 (23:39 -0000)
committerCésar Natarén <cesar@mono-cvs.ximian.com>
Wed, 22 Feb 2006 23:39:12 +0000 (23:39 -0000)
* System.Web.dll.sources: Added System.Web.UI/ChtmlTextWriter.cs
* System.Web_test.dll.sources: Added System.Web.UI/ChtmlTextWriterTest.cs

svn path=/trunk/mcs/; revision=57184

mcs/class/System.Web/ChangeLog
mcs/class/System.Web/System.Web.UI/ChtmlTextWriter.cs [new file with mode: 0644]
mcs/class/System.Web/System.Web_test.dll.sources
mcs/class/System.Web/Test/System.Web.UI/ChtmlTextWriterTest.cs [new file with mode: 0644]

index 523ffdb1214ca2153e7e0aa6490a38875d6cff8c..b53318952ede74ce941edbb62bd93f1a5e284382 100644 (file)
@@ -1,3 +1,8 @@
+2006-02-22  Cesar Lopez Nataren  <cnataren@novell.com>
+
+       * System.Web.dll.sources: Added System.Web.UI/ChtmlTextWriter.cs
+       * System.Web_test.dll.sources: Added System.Web.UI/ChtmlTextWriterTest.cs
+
 2006-02-14 Gonzalo Paniagua Javier <gonzalo@ximian.com>
 
        * System.Web.dll.sources: added new files.
diff --git a/mcs/class/System.Web/System.Web.UI/ChtmlTextWriter.cs b/mcs/class/System.Web/System.Web.UI/ChtmlTextWriter.cs
new file mode 100644 (file)
index 0000000..6bcdf65
--- /dev/null
@@ -0,0 +1,184 @@
+//
+// ChtmlTextWriter.cs: Compact HTML
+//
+// Author:
+//     Cesar Lopez Nataren <cnataren@novell.com>
+//
+
+//
+// Copyright (C) 2006 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.IO;
+using System.Collections;
+
+namespace System.Web.UI {
+
+       public class ChtmlTextWriter : Html32TextWriter
+       {
+               static Hashtable global_suppressed_attrs;
+
+               static string [] global_suppressed_attributes = {
+                       "onclick", "ondblclick", "onmousedown", "onmouseup",
+                       "onmouseover", "onmousemove", "onmouseout",
+                       "onkeypress", "onkeydown", "onkeyup"
+               };
+
+               static string [] recognized_attributes = {"div", "span"};
+
+               Hashtable recognized_attrs = new Hashtable (recognized_attributes.Length);
+               Hashtable suppressed_attrs = new Hashtable (recognized_attributes.Length);
+
+               static ChtmlTextWriter ()
+               {
+                       SetupGlobalSuppressedAttrs (global_suppressed_attributes);
+               }
+
+               static void SetupGlobalSuppressedAttrs (string [] attrs)
+               {
+                       global_suppressed_attrs = new Hashtable ();
+                       PopulateHash (global_suppressed_attrs, global_suppressed_attributes);
+               }
+
+               static void PopulateHash (Hashtable hash, string [] keys)
+               {
+                       foreach (string key in keys)
+                               hash.Add (key, true);
+               }
+
+               public ChtmlTextWriter (TextWriter writer)
+                       : this (writer, DefaultTabString)
+               {
+               }
+
+               public ChtmlTextWriter (TextWriter writer, string tabString)
+                       : base (writer, tabString)
+               {
+                       //
+                       // setup the recognized attrs
+                       //
+                       foreach (string key in recognized_attributes)
+                               recognized_attrs.Add (key, new Hashtable ());
+
+                       SetupSuppressedAttrs ();
+               }
+
+
+               void SetupSuppressedAttrs ()
+               {
+                       //
+                       // we don't make these static because they are not read-only
+                       //
+                       string [] div_suppressed_attributes = {
+                               "accesskey", "cellspacing", "cellpadding",
+                               "gridlines", "rules"
+                       };
+
+                       string [] span_suppressed_attributes = {
+                               "cellspacing", "cellpadding",
+                               "gridlines", "rules"
+                       };
+
+                       Init ("div", div_suppressed_attributes, suppressed_attrs);
+                       Init ("span", span_suppressed_attributes, suppressed_attrs);
+               }
+
+               static void Init (string key, string [] attrs, Hashtable container)
+               {
+                       Hashtable attrs_hash = new Hashtable (attrs.Length);
+                       PopulateHash (attrs_hash, attrs);
+                       container.Add (key, attrs_hash);
+               }
+
+               protected Hashtable GlobalSuppressedAttributes {
+                       get { return global_suppressed_attrs; }
+               }
+
+               protected Hashtable RecognizedAttributes {
+                       get { return recognized_attrs; }
+               }
+
+               protected Hashtable SuppressedAttributes {
+                       get { return suppressed_attrs; }
+               }
+
+               public virtual void AddRecognizedAttribute (string elementName, string attributeName)
+               {
+                       Hashtable elem_attrs = (Hashtable) recognized_attrs [elementName];
+
+                       if (elem_attrs == null) {
+                               elem_attrs = new Hashtable ();
+                               elem_attrs.Add (attributeName, true);
+                               recognized_attrs.Add (elementName, elem_attrs);
+                       } else
+                               elem_attrs.Add (attributeName, true);
+               }
+
+               public virtual void RemoveRecognizedAttribute (string elementName, string attributeName)
+               {
+                       Hashtable elem_attrs = (Hashtable) recognized_attrs [elementName];
+
+                       if (elem_attrs != null)
+                               elem_attrs.Remove (attributeName);
+               }
+
+               //
+               // writes <br>
+               //
+               public override void WriteBreak ()
+               {
+                       string br = GetTagName (HtmlTextWriterTag.Br);
+                       WriteBeginTag (br);
+                       Write (TagRightChar);
+               }
+
+               public override void WriteEncodedText (string text)
+               {
+                       base.WriteEncodedText (text);
+               }
+
+               Hashtable attr_render = new Hashtable ();
+
+               [MonoTODO]
+               protected override bool OnAttributeRender (string name, string value, HtmlTextWriterAttribute key)
+               {
+                       // I checked every possible HtmlTextWriterAttribute key
+                       // and always throws ArgumentNullException.
+                       return (bool) attr_render [null];
+               }
+
+               protected override bool OnStyleAttributeRender (string styleAttrName, string value, HtmlTextWriterStyle key)
+               {
+                       return key == HtmlTextWriterStyle.Display;
+               }
+
+               protected override bool OnTagRender (string name, HtmlTextWriterTag tag)
+               {
+                       return tag != HtmlTextWriterTag.Span;
+               }
+       }
+}
+
+#endif
index 5617e6c4f7fab31023480e4e84bea222e967da53..985e0cbd14d40e0572ab59bd533f2942f70f2d9e 100644 (file)
@@ -45,6 +45,7 @@ System.Web.Security/MembershipUserCollectionTest.cs
 System.Web.Security/RolePrincipalTest.cs
 System.Web.Security/RolesTest.cs
 System.Web.UI/AttributeCollectionTest.cs
+System.Web.UI/ChtmlTextWriterTest.cs
 System.Web.UI/CleanHtmlTextWriter.cs
 System.Web.UI/ControlTest.cs
 System.Web.UI/ControlCollectionTest.cs
diff --git a/mcs/class/System.Web/Test/System.Web.UI/ChtmlTextWriterTest.cs b/mcs/class/System.Web/Test/System.Web.UI/ChtmlTextWriterTest.cs
new file mode 100644 (file)
index 0000000..8e19457
--- /dev/null
@@ -0,0 +1,193 @@
+//
+// ChtmlTextWriterTest.cs: Unit tests for System.Web.UI.ChtmlTextWriter
+//
+// Author:
+//     Cesar Lopez Nataren <cnataren@novell.com>
+//
+// Copyright (C) 2006 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.IO;
+using System.Web.UI;
+using NUnit.Framework;
+using System.Collections;
+
+namespace MonoTests.System.Web.UI {
+
+       public class ChtmlTextWriterTester : ChtmlTextWriter {
+
+               public ChtmlTextWriterTester (TextWriter writer)
+                       : this (writer, DefaultTabString)
+               {
+               }
+
+               public ChtmlTextWriterTester (TextWriter writer, string tabString)
+                       : base (writer, tabString)
+               {
+               }
+
+               public bool IsRecognizedAttribute (string elementName, string attributeName)
+               {
+                       Hashtable elem_attrs = (Hashtable) RecognizedAttributes [elementName];
+
+                       if (elem_attrs == null)
+                               return false;
+                       return elem_attrs [attributeName] != null;
+               }
+
+               public string PublicGetAttributeName (HtmlTextWriterAttribute attrKey)
+               {
+                       return GetAttributeName (attrKey);
+               }
+
+               public bool PublicOnAttributeRender (string name, string value, HtmlTextWriterAttribute attr)
+               {
+                       return OnAttributeRender (name, value, attr);
+               }
+
+               public bool PublicOnStyleAttributeRender (string name, string value, HtmlTextWriterStyle key)
+               {
+                       return OnStyleAttributeRender (name, value, key);
+               }
+
+               public bool PublicOnTagRender (string name, HtmlTextWriterTag tag)
+               {
+                       return OnTagRender (name, tag);
+               }
+
+               public Hashtable PublicGlobalSuppressedAttributes {
+                       get { return GlobalSuppressedAttributes; }
+               }
+
+               public Hashtable PublicSuppressedAttributes {
+                       get { return SuppressedAttributes; }
+               }
+       }
+
+       [TestFixture]
+       public class ChtmlTextWriterTest {
+
+               ChtmlTextWriterTester chtml;
+               StringWriter writer;
+
+               string absent_element = "absent-elem";
+               string absent_attr = "absent-attr";
+
+               [SetUp]
+               public void SetupTests ()
+               {
+                       writer = new StringWriter ();
+                       chtml = new ChtmlTextWriterTester (writer);
+               }
+
+               [Test]
+               public void AddRecognizedAttributeTest ()
+               {
+                       chtml.AddRecognizedAttribute (absent_element, absent_attr);
+                       Assertion.AssertEquals ("#A01", true, chtml.IsRecognizedAttribute (absent_element, absent_attr));
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentException))]
+               public void AddRecognizedAttribute2 ()
+               {
+                       AddRecognizedAttributeTest ();
+                       AddRecognizedAttributeTest ();
+               }
+
+               [Test]
+               public void RemoveRecognizedAttributeTest ()
+               {
+                       AddRecognizedAttributeTest ();
+
+                       chtml.RemoveRecognizedAttribute (absent_element, absent_attr);
+                       Assertion.AssertEquals ("#B01", false, chtml.IsRecognizedAttribute (absent_element, absent_attr));
+
+                       string version_two = "v2";
+                       chtml.RemoveRecognizedAttribute (absent_element + version_two, absent_attr + version_two);
+               }
+
+               [Test]
+               public void WriteBreakTest ()
+               {
+                       string br = "<br>";
+                       chtml.WriteBreak ();
+                       Assertion.AssertEquals ("#C01", true, br == writer.ToString ());
+               }
+
+               [Test]
+               public void WriteEncodedTest ()
+               {
+                       string encoded_text = "<custID> & <invoice#>";
+                       string unencoded_text = "&lt;custID&gt; &amp; &lt;invoice#&gt;";
+                       chtml.WriteEncodedText (encoded_text);
+
+                       Assertion.AssertEquals ("#D01", true, unencoded_text == writer.ToString ());
+               }
+
+               [Test]
+               public void OnAttributeRenderTest ()
+               {
+                       HtmlTextWriterAttribute [] enum_values = (HtmlTextWriterAttribute []) Enum.GetValues (typeof (HtmlTextWriterAttribute));
+                       int i = 0;
+
+                       foreach (HtmlTextWriterAttribute attr in enum_values) {
+                               try {
+                                       chtml.PublicOnAttributeRender (chtml.PublicGetAttributeName (attr), "accesskey", attr);
+                               } catch (ArgumentNullException e) {
+                                       i++;
+                               }
+                       }
+                       Assertion.AssertEquals ("#E01", enum_values.Length, i);
+               }
+
+               [Test]
+               public void OnStyleAttributeRenderTest ()
+               {
+                       bool expected;
+                       int i = 0;
+
+                       foreach (HtmlTextWriterStyle tag in Enum.GetValues (typeof (HtmlTextWriterStyle))) {
+                               expected = (tag == HtmlTextWriterStyle.Display);
+                               Assertion.AssertEquals ("#F0" + i++, expected, chtml.PublicOnStyleAttributeRender ("foo", "foo", tag));
+                       }
+               }
+
+
+               [Test]
+               public void OnTagRenderTest ()
+               {
+                       int i = 0;
+                       bool expected;
+
+                       foreach (HtmlTextWriterTag tag in Enum.GetValues (typeof (HtmlTextWriterTag))) {
+                               expected = (tag != HtmlTextWriterTag.Span);
+                               Assertion.AssertEquals ("#G0" + i++, expected, chtml.PublicOnTagRender ("foo", tag));
+                       }
+               }
+       }
+}
+
+#endif