2009-12-22 Marek Habersack <mhabersack@novell.com>
authorMarek Habersack <grendel@twistedcode.net>
Tue, 22 Dec 2009 12:24:19 +0000 (12:24 -0000)
committerMarek Habersack <grendel@twistedcode.net>
Tue, 22 Dec 2009 12:24:19 +0000 (12:24 -0000)
* HtmlForm.cs: RenderChildren is slightly more efficient now.

2009-12-22  Marek Habersack  <mhabersack@novell.com>

* Page.cs: form javascript declaration block is rendered only if
necessary. Fixes bug #566541

* ClientScriptManager.cs: added internal property ScriptsPresent
used to determine if it is necessary to render form javascript
declaration block.
Hidden fields block is output without indenting the controls and
without rendering trailing empty line.
Made Write{Begin,End}ScriptBlock slightly faster.

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

mcs/class/System.Web/System.Web.UI.HtmlControls/ChangeLog
mcs/class/System.Web/System.Web.UI.HtmlControls/HtmlForm.cs
mcs/class/System.Web/System.Web.UI/ChangeLog
mcs/class/System.Web/System.Web.UI/ClientScriptManager.cs
mcs/class/System.Web/System.Web.UI/Page.cs

index 8599ca18265eda793d826b98014916e1f3baf260..3b3073158da4e964770a41b697810292fef15a4b 100644 (file)
@@ -1,3 +1,7 @@
+2009-12-22  Marek Habersack  <mhabersack@novell.com>
+
+       * HtmlForm.cs: RenderChildren is slightly more efficient now.
+
 2009-11-13  Marek Habersack  <mhabersack@novell.com>
 
        * HtmlForm.cs: reverted part of the previous patch - action is not
index b78619f09deb1a351b0981047777906a4c32a554..0cfe963259375232766483559500cf85c397d9fc 100644 (file)
@@ -406,15 +406,19 @@ namespace System.Web.UI.HtmlControls
 #endif         
                override void RenderChildren (HtmlTextWriter w)
                {
-                       if (!inited) {
-                               Page.RegisterViewStateHandler ();
+                       Page page = Page;
+                       
+                       if (!inited && page != null) {
+                               page.RegisterViewStateHandler ();
 #if NET_2_0
-                               Page.RegisterForm (this);
+                               page.RegisterForm (this);
 #endif
                        }
-                       Page.OnFormRender (w, ClientID);
+                       if (page != null)
+                               page.OnFormRender (w, ClientID);
                        base.RenderChildren (w);
-                       Page.OnFormPostRender (w, ClientID);
+                       if (page != null)
+                               page.OnFormPostRender (w, ClientID);
                }
 
 #if NET_2_0
index bbf6eb5e55dc113489b035716d798fdf2eeb3d43..76fd19e6b35b20c1224c9e47e26dc74873409971 100644 (file)
@@ -1,3 +1,15 @@
+2009-12-22  Marek Habersack  <mhabersack@novell.com>
+
+       * Page.cs: form javascript declaration block is rendered only if
+       necessary. Fixes bug #566541
+
+       * ClientScriptManager.cs: added internal property ScriptsPresent
+       used to determine if it is necessary to render form javascript
+       declaration block.
+       Hidden fields block is output without indenting the controls and
+       without rendering trailing empty line.
+       Made Write{Begin,End}ScriptBlock slightly faster.
+
 2009-12-18  Marek Habersack  <mhabersack@novell.com>
 
        * ObjectStateFormatter.cs: ObjectFormatter.WriteObject checks
index e7d4a7c5bc12721545715d00c44ca9357bb69893..07caf43744cbf8dddced4e9d028bc83d9655fc6d 100644 (file)
@@ -66,6 +66,21 @@ namespace System.Web.UI
                bool _hasRegisteredForEventValidationOnCallback;
                bool _pageInRender;
                bool _initCallBackRegistered;
+               bool _webFormClientScriptRendered;
+               bool _webFormClientScriptRequired;
+               
+               internal bool ScriptsPresent {
+                       get {
+                               return _webFormClientScriptRequired ||
+                                       _initCallBackRegistered ||
+                                       _hasRegisteredForEventValidationOnCallback ||
+                                       clientScriptBlocks != null ||
+                                       startupScriptBlocks != null ||
+                                       submitStatements != null ||
+                                       registeredArrayDeclares != null ||
+                                       expandoAttributes != null;
+                       }
+               }
 #endif
                
                internal ClientScriptManager (Page page)
@@ -181,9 +196,6 @@ namespace System.Web.UI
                        _webFormClientScriptRequired = true;
                }
 
-               bool _webFormClientScriptRendered;
-               bool _webFormClientScriptRequired;
-
                internal void WriteWebFormClientScript (HtmlTextWriter writer) {
                        if (!_webFormClientScriptRendered && _webFormClientScriptRequired) {
                                writer.WriteLine ();
@@ -309,6 +321,7 @@ namespace System.Web.UI
                                registeredArrayDeclares.Add (arrayName, new ArrayList());
        
                        ((ArrayList) registeredArrayDeclares[arrayName]).Add(arrayValue);
+                       page.RequiresFormScriptDeclaration ();
                }
 
                void RegisterScript (ref ScriptEntry scriptList, Type type, string key, string script, bool addScriptTags)
@@ -627,25 +640,22 @@ namespace System.Web.UI
 #if NET_2_0
                internal const string SCRIPT_BLOCK_START = "//<![CDATA[";
                internal const string SCRIPT_BLOCK_END = "//]]>";
+               internal const string SCRIPT_ELEMENT_START = @"<script type=""text/javascript"">" + SCRIPT_BLOCK_START;
 #else
                internal const string SCRIPT_BLOCK_START = "<!--";
                internal const string SCRIPT_BLOCK_END ="// -->";
+               internal const string SCRIPT_ELEMENT_START = @"<script language=""javascript"" type=""text/javascript"">" + SCRIPT_BLOCK_START;
 #endif
+               internal const string SCRIPT_ELEMENT_END = SCRIPT_BLOCK_END + "</script>";
                
                internal static void WriteBeginScriptBlock (HtmlTextWriter writer)
                {
-                       writer.WriteLine ("<script"+
-#if !NET_2_0
-                               " language=\"javascript\""+
-#endif
-                               " type=\"text/javascript\">");
-                       writer.WriteLine (SCRIPT_BLOCK_START);
+                       writer.WriteLine (SCRIPT_ELEMENT_START);
                }
 
                internal static void WriteEndScriptBlock (HtmlTextWriter writer)
                {
-                       writer.WriteLine (SCRIPT_BLOCK_END);
-                       writer.WriteLine ("</script>");
+                       writer.WriteLine (SCRIPT_ELEMENT_END);
                }
                
                internal void WriteHiddenFields (HtmlTextWriter writer)
@@ -654,18 +664,28 @@ namespace System.Web.UI
                                return;
 
 #if NET_2_0
+                       writer.WriteLine ();
                        writer.RenderBeginTag (HtmlTextWriterTag.Div);
+                       int oldIndent = writer.Indent;
+                       writer.Indent = 0;
+                       bool first = true;
 #endif
                        foreach (string key in hiddenFields.Keys) {
                                string value = hiddenFields [key] as string;
+                               if (first)
+                                       first = false;
+                               else
+                                       writer.WriteLine ();
 #if NET_2_0
-                               writer.WriteLine ("<input type=\"hidden\" name=\"{0}\" id=\"{0}\" value=\"{1}\" />", key, HttpUtility.HtmlAttributeEncode (value));
+                               writer.Write ("<input type=\"hidden\" name=\"{0}\" id=\"{0}\" value=\"{1}\" />", key, HttpUtility.HtmlAttributeEncode (value));
 #else
-                               writer.WriteLine ("<input type=\"hidden\" name=\"{0}\" value=\"{1}\" />", key, HttpUtility.HtmlAttributeEncode (value));
+                               writer.Write ("<input type=\"hidden\" name=\"{0}\" value=\"{1}\" />", key, HttpUtility.HtmlAttributeEncode (value));
 #endif
                        }
 #if NET_2_0
+                       writer.Indent = oldIndent;
                        writer.RenderEndTag (); // DIV
+                       writer.WriteLine ();
 #endif
                        hiddenFields = null;
                }
index bfbeca58dc570d036729d37e4a098e0c2bf5715c..2148abd64db37dec71a628f76bf495fff2938246 100644 (file)
@@ -99,6 +99,8 @@ public partial class Page : TemplateControl, IHttpHandler
        NameValueCollection secondPostData;
        bool requiresPostBackScript;
        bool postBackScriptRendered;
+       bool requiresFormScriptDeclaration;
+       bool formScriptDeclarationRendered;
        bool handleViewState;
        string viewStateUserKey;
        NameValueCollection _requestValueCollection;
@@ -945,6 +947,11 @@ public partial class Page : TemplateControl, IHttpHandler
                return scriptManager.GetPostBackEventReference (control, argument);
        }
 
+       internal void RequiresFormScriptDeclaration ()
+       {
+               requiresFormScriptDeclaration = true;
+       }
+       
        internal void RequiresPostBackScript ()
        {
 #if NET_2_0
@@ -954,6 +961,7 @@ public partial class Page : TemplateControl, IHttpHandler
                ClientScript.RegisterHiddenField (postEventArgumentID, String.Empty);
 #endif
                requiresPostBackScript = true;
+               RequiresFormScriptDeclaration ();
        }
 
        [EditorBrowsable (EditorBrowsableState.Never)]
@@ -1147,7 +1155,7 @@ public partial class Page : TemplateControl, IHttpHandler
                
                ClientScriptManager.WriteBeginScriptBlock (writer);
 
-#if ONLY_1_1
+#if NET_1_1
                RenderClientScriptFormDeclaration (writer, formUniqueID);
 #endif
 #if NET_2_0
@@ -1167,6 +1175,9 @@ public partial class Page : TemplateControl, IHttpHandler
 
        void RenderClientScriptFormDeclaration (HtmlTextWriter writer, string formUniqueID)
        {
+               if (formScriptDeclarationRendered)
+                       return;
+               
 #if NET_2_0
                if (PageAdapter != null) {
                        writer.WriteLine ("\tvar {0} = {1};\n", theForm, PageAdapter.GetPostBackFormReference(formUniqueID));
@@ -1183,6 +1194,7 @@ public partial class Page : TemplateControl, IHttpHandler
                writer.WriteLine ("\twindow.TARGET_J2EE = true;");
                writer.WriteLine ("\twindow.IsMultiForm = {0};", IsMultiForm ? "true" : "false");
 #endif
+               formScriptDeclarationRendered = true;
        }
 
        internal void OnFormRender (HtmlTextWriter writer, string formUniqueID)
@@ -1194,9 +1206,11 @@ public partial class Page : TemplateControl, IHttpHandler
                writer.WriteLine ();
 
 #if NET_2_0
-               ClientScriptManager.WriteBeginScriptBlock (writer);
-               RenderClientScriptFormDeclaration (writer, formUniqueID);
-               ClientScriptManager.WriteEndScriptBlock (writer);
+               if (requiresFormScriptDeclaration || (scriptManager != null && scriptManager.ScriptsPresent) || PageAdapter != null) {
+                       ClientScriptManager.WriteBeginScriptBlock (writer);
+                       RenderClientScriptFormDeclaration (writer, formUniqueID);
+                       ClientScriptManager.WriteEndScriptBlock (writer);
+               }
 #endif
 
                if (handleViewState)