New tests.
[mono.git] / mcs / class / System.Web / System.Web.UI.HtmlControls / HtmlHead.cs
index 2680ab09fb191f4ad2a304fac87f7c713d9b96b0..6f80e8a23aa8cccfeed0796d0963ee797fb845e0 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,11 +37,17 @@ namespace System.Web.UI.HtmlControls
        [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
        // attributes
        [ControlBuilder (typeof(HtmlHeadBuilder))]
-       public sealed class HtmlHead: HtmlGenericControl, IPageHeader, IParserAccessor
+       public sealed class HtmlHead: HtmlGenericControl, IParserAccessor
        {
+#if NET_4_0
+               string descriptionText;
+               string keywordsText;
+               HtmlMeta descriptionMeta;
+               HtmlMeta keywordsMeta;
+#endif
+               string titleText;
                HtmlTitle title;
-               Hashtable metadata;
-               ArrayList styleSheets;
+               //Hashtable metadata;
                StyleSheetBag styleSheet;
                
                public HtmlHead(): base("head") {}
@@ -54,20 +58,31 @@ namespace System.Web.UI.HtmlControls
                
                protected internal override void OnInit (EventArgs e)
                {
-                       Page.SetHeader (this);
+                       base.OnInit (e);
+                       Page page = Page;
+                       
+                       if (page == null)
+                               throw new HttpException ("The <head runat=\"server\"> control requires a page.");
+                       
+                       //You can only have one <head runat="server"> control on a page.
+                       if(page.Header != null)
+                               throw new HttpException ("You can only have one <head runat=\"server\"> control on a page.");
+                       page.SetHeader (this);
                }
                
                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 (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 (styleSheet != null)
                                styleSheet.Render (writer);
@@ -75,9 +90,23 @@ namespace System.Web.UI.HtmlControls
                
                protected internal override void AddedControl (Control control, int index)
                {
-                       if (control is HtmlTitle)
-                               title = (HtmlTitle) control;
+                       //You can only have one <title> element within the <head> element.
+                       HtmlTitle t = control as HtmlTitle;
+                       if (t != null) {
+                               if (title != null)
+                                       throw new HttpException ("You can only have one <title> element within the <head> element.");
+                               title = t;
+                       }
 
+#if NET_4_0
+                       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;
+                       }
+#endif
                        base.AddedControl (control, index);
                }
 
@@ -86,33 +115,90 @@ namespace System.Web.UI.HtmlControls
                        if (title == control)
                                title = null;
 
+#if NET_4_0
+                       if (keywordsMeta == control)
+                               keywordsMeta = null;
+                       else if (descriptionMeta == control)
+                               descriptionMeta = null;
+#endif
                        base.RemovedControl (control);
                }
                
-               IList IPageHeader.LinkedStyleSheets {
+               void EnsureTitleControl () {
+                       if (title != null)
+                               return;
+
+                       HtmlTitle t = new HtmlTitle ();
+                       t.Text = titleText;
+                       Controls.Add (t);
+               }
+
+//             IList LinkedStyleSheets {
+//                     get {
+//                             if (styleSheets == null) styleSheets = new ArrayList ();
+//                             return styleSheets;
+//                     }
+//             } 
+//             
+//             IDictionary Metadata {
+//                     get {
+//                             if (metadata == null) metadata = new Hashtable ();
+//                             return metadata;
+//                     }
+//             }
+               
+#if NET_4_0
+               public string Description {
                        get {
-                               if (styleSheets == null) styleSheets = new ArrayList ();
-                               return styleSheets;
+                               if (descriptionMeta != null)
+                                       return descriptionMeta.Content;
+                               return descriptionText;
                        }
-               } 
-               
-               IDictionary IPageHeader.Metadata {
+                       
+                       set {
+                               if (descriptionMeta != null)
+                                       descriptionMeta.Content = value;
+                               else
+                                       descriptionText = value;
+                       }
+               }
+
+               public string Keywords {
                        get {
-                               if (metadata == null) metadata = new Hashtable ();
-                               return metadata;
+                               if (keywordsMeta != null)
+                                       return keywordsMeta.Content;
+                               return keywordsText;
+                       }
+                       
+                       set {
+                               if (keywordsMeta != null)
+                                       keywordsMeta.Content = value;
+                               else
+                                       keywordsText = value;
                        }
                }
+#endif
                
-               IStyleSheet IPageHeader.StyleSheet {
+               public IStyleSheet StyleSheet {
                        get {
                                if (styleSheet == null) styleSheet = new StyleSheetBag ();
                                return styleSheet;
                        }
                }
                
-               string IPageHeader.Title {
-                       get { return title.Text; }
-                       set { title.Text = value; }
+               public string Title {
+                       get {
+                               if (title != null)
+                                       return title.Text;
+                               else
+                                       return titleText;
+                       }
+                       set {
+                               if (title != null)
+                                       title.Text = value;
+                               else
+                                       titleText = value;
+                       }
                }
        }
        
@@ -131,7 +217,7 @@ namespace System.Web.UI.HtmlControls
                {
                }
                
-               public void CreateStyleRule (Style style, string selection, IUrlResolutionService urlResolver)
+               public void CreateStyleRule (Style style, IUrlResolutionService urlResolver, string selection)
                {
                        StyleEntry entry = new StyleEntry ();
                        entry.Style = style;
@@ -149,12 +235,12 @@ namespace System.Web.UI.HtmlControls
                        
                        string name = "aspnet_" + entries.Count;
                        style.SetRegisteredCssClass (name);
-                       CreateStyleRule (style, "." + name, urlResolver);
+                       CreateStyleRule (style, urlResolver, "." + name);
                }
                
                public void Render (HtmlTextWriter writer)
                {
-                       writer.AddAttribute ("type", "text/css");
+                       writer.AddAttribute ("type", "text/css", false);
                        writer.RenderBeginTag (HtmlTextWriterTag.Style);
 
                        foreach (StyleEntry entry in entries) {
@@ -167,4 +253,3 @@ namespace System.Web.UI.HtmlControls
        }
 }
 
-#endif