X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Web%2FSystem.Web.UI.HtmlControls%2FHtmlContainerControl.cs;h=66d1881d64104da93c1c90871c6d34618689e9fb;hb=2d23bfcbce7a3f7e54dcd5911adb88b244baca35;hp=6f063a5110231d7a3c781d58617cce3b6855d522;hpb=f1b29831f994a09249fb041c9894d5caabe1fdf5;p=mono.git diff --git a/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlContainerControl.cs b/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlContainerControl.cs index 6f063a51102..66d1881d641 100644 --- a/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlContainerControl.cs +++ b/mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlContainerControl.cs @@ -1,21 +1,42 @@ // // System.Web.UI.HtmlControls.HtmlContainerControl.cs // -// Author -// Bob Smith +// Authors: +// Bob Smith +// Gonzalo Paniagua Javier (gonzalo@ximian.com) // // (C) Bob Smith +// (c) 2002 Ximian, Inc. (http://www.ximian.com) +// Copyright (C) 2005-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 +// "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. // -using System; -using System.Web; -using System.Web.UI; +using System.ComponentModel; +using System.Security.Permissions; +using System.Text; //LAMESPEC: The dox talk about HttpException but are very ambigious. //TODO: Check to see if Render really is overridden instead of a LiteralControl being added. It apears that this is the //case due to testing. Anything inside the block is overwritten by the content of this control, so it doesnt apear //to do anything with children. -// a doc references this. add? protected override ControlCollection CreateControlCollection(); //TODO: If Test.InnerText = Test.InnerHtml without ever assigning anything into InnerHtml, you get this: // Exception Details: System.Web.HttpException: Cannot get inner content of Message because the contents are not literal. @@ -31,53 +52,68 @@ using System.Web.UI; namespace System.Web.UI.HtmlControls { - public abstract class HtmlContainerControl : HtmlControl{ - - private string _innerHtml = String.Empty; - private string _innerText = String.Empty; - private bool _doText = false; - private bool _doChildren = true; - - public HtmlContainerControl() : base(){} - - public HtmlContainerControl(string tag) : base(tag) {} + // CAS + [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] + [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] + public abstract class HtmlContainerControl : HtmlControl + { + protected HtmlContainerControl () : this ("span") + {} + public HtmlContainerControl (string tag) : base(tag) + {} + + [HtmlControlPersistable (false)] + [BrowsableAttribute(false)] + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public virtual string InnerHtml { - get - { - return _innerHtml; + get { + if (Controls.Count == 0) + return String.Empty; + + if (Controls.Count == 1) { + Control ctrl = Controls [0]; + LiteralControl lc = ctrl as LiteralControl; + if (lc != null) + return lc.Text; + + DataBoundLiteralControl dblc = ctrl as DataBoundLiteralControl; + if (dblc != null) + return dblc.Text; + } + + throw new HttpException ("There is no literal content!"); } - set - { - _innerHtml = value; - _doText = false; - _doChildren = false; + + set { + Controls.Clear (); + Controls.Add (new LiteralControl (value)); + if (value == null) + ViewState.Remove ("innerhtml"); + else + ViewState ["innerhtml"] = value; } } - + + [HtmlControlPersistable (false)] + [BrowsableAttribute(false)] + [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public virtual string InnerText { - get - { - return _innerText; + get { + return HttpUtility.HtmlDecode (InnerHtml); } - set - { - _innerText = value; - _doText = true; - _doChildren = false; + + set { + InnerHtml = HttpUtility.HtmlEncode (value); } } - protected override void Render(HtmlTextWriter writer) + protected internal override void Render (HtmlTextWriter writer) { - writer.WriteBeginTag (TagName); - RenderAttributes (writer); - writer.Write ('>'); - if(_doChildren) RenderChildren(writer); - else if(_doText) Page.Server.HtmlEncode(_innerText, writer); - else writer.Write(_innerHtml); + RenderBeginTag (writer); + RenderChildren (writer); RenderEndTag (writer); } @@ -85,5 +121,29 @@ namespace System.Web.UI.HtmlControls { writer.WriteEndTag (TagName); } + + protected override void RenderAttributes (HtmlTextWriter writer) + { + ViewState.Remove ("innerhtml"); + base.RenderAttributes (writer); + } + + /* we need to override this because our base class + * (HtmlControl) returns an instance of + * EmptyControlCollection. */ + protected override ControlCollection CreateControlCollection () + { + return new ControlCollection (this); + } + + protected override void LoadViewState (object savedState) + { + if (savedState != null) { + base.LoadViewState (savedState); + string inner = ViewState ["innerhtml"] as string; + if (inner != null) + InnerHtml = inner; + } + } } }