Merge pull request #1155 from steffen-kiess/json-string
[mono.git] / mcs / class / System.Web / System.Web.UI.HtmlControls / HtmlHead.cs
index 36f5c39836fa227c44283cb1b934d08aa57f3e13..a890fc10f4b80edf848071aabceea5ece6eb4b25 100644 (file)
@@ -4,7 +4,7 @@
 // Authors:
 //     Lluis Sanchez Gual (lluis@novell.com)
 //
-// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-2010 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
@@ -26,8 +26,6 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
-
 using System.ComponentModel;
 using System.Collections;
 using System.Security.Permissions;
@@ -39,8 +37,12 @@ namespace System.Web.UI.HtmlControls
        [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
        // attributes
        [ControlBuilder (typeof(HtmlHeadBuilder))]
-       public sealed class HtmlHead: HtmlGenericControl, IParserAccessor {
-
+       public sealed class HtmlHead: HtmlGenericControl, IParserAccessor
+       {
+               string descriptionText;
+               string keywordsText;
+               HtmlMeta descriptionMeta;
+               HtmlMeta keywordsMeta;
                string titleText;
                HtmlTitle title;
                //Hashtable metadata;
@@ -68,18 +70,26 @@ namespace System.Web.UI.HtmlControls
                
                protected internal override void RenderChildren (HtmlTextWriter writer)
                {
-                       EnsureTitleControl ();
-
                        base.RenderChildren (writer);
-//                     if (metadata != null) {
-//                             foreach (DictionaryEntry entry in metadata) {
-//                                     writer.AddAttribute ("name", entry.Key.ToString ());
-//                                     writer.AddAttribute ("content", entry.Value.ToString ());
-//                                     writer.RenderBeginTag (HtmlTextWriterTag.Meta);
-//                                     writer.RenderEndTag ();
-//                             }
-//                     }
-                       
+                       if (title == null) {
+                               writer.RenderBeginTag (HtmlTextWriterTag.Title);
+                               if (!String.IsNullOrEmpty (titleText))
+                                       writer.Write (titleText);
+                               writer.RenderEndTag ();
+                       }
+                       if (descriptionMeta == null && descriptionText != null) {
+                               writer.AddAttribute ("name", "description");
+                               writer.AddAttribute ("content", HttpUtility.HtmlAttributeEncode (descriptionText));
+                               writer.RenderBeginTag (HtmlTextWriterTag.Meta);
+                               writer.RenderEndTag ();
+                       }
+
+                       if (keywordsMeta == null && keywordsText != null) {
+                               writer.AddAttribute ("name", "keywords");
+                               writer.AddAttribute ("content", HttpUtility.HtmlAttributeEncode (keywordsText));
+                               writer.RenderBeginTag (HtmlTextWriterTag.Meta);
+                               writer.RenderEndTag ();
+                       }
                        if (styleSheet != null)
                                styleSheet.Render (writer);
                }
@@ -94,6 +104,13 @@ namespace System.Web.UI.HtmlControls
                                title = t;
                        }
 
+                       HtmlMeta meta = control as HtmlMeta;
+                       if (meta != null) {
+                               if (String.Compare ("keywords", meta.Name, StringComparison.OrdinalIgnoreCase) == 0)
+                                       keywordsMeta = meta;
+                               else if (String.Compare ("description", meta.Name, StringComparison.OrdinalIgnoreCase) == 0)
+                                       descriptionMeta = meta;
+                       }
                        base.AddedControl (control, index);
                }
 
@@ -102,31 +119,41 @@ namespace System.Web.UI.HtmlControls
                        if (title == control)
                                title = null;
 
+                       if (keywordsMeta == control)
+                               keywordsMeta = null;
+                       else if (descriptionMeta == control)
+                               descriptionMeta = null;
                        base.RemovedControl (control);
                }
-               
-               void EnsureTitleControl () {
-                       if (title != null)
-                               return;
-
-                       HtmlTitle t = new HtmlTitle ();
-                       t.Text = titleText;
-                       Controls.Add (t);
+               public string Description {
+                       get {
+                               if (descriptionMeta != null)
+                                       return descriptionMeta.Content;
+                               return descriptionText;
+                       }
+                       
+                       set {
+                               if (descriptionMeta != null)
+                                       descriptionMeta.Content = value;
+                               else
+                                       descriptionText = value;
+                       }
                }
 
-//             IList LinkedStyleSheets {
-//                     get {
-//                             if (styleSheets == null) styleSheets = new ArrayList ();
-//                             return styleSheets;
-//                     }
-//             } 
-//             
-//             IDictionary Metadata {
-//                     get {
-//                             if (metadata == null) metadata = new Hashtable ();
-//                             return metadata;
-//                     }
-//             }
+               public string Keywords {
+                       get {
+                               if (keywordsMeta != null)
+                                       return keywordsMeta.Content;
+                               return keywordsText;
+                       }
+                       
+                       set {
+                               if (keywordsMeta != null)
+                                       keywordsMeta.Content = value;
+                               else
+                                       keywordsText = value;
+                       }
+               }
                
                public IStyleSheet StyleSheet {
                        get {
@@ -202,4 +229,3 @@ namespace System.Web.UI.HtmlControls
        }
 }
 
-#endif