From: Dion O. <dol...@us...> - 2006-01-29 23:07:07
|
Update of /cvsroot/magicajax/magicajax/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26941/magicajax/Core Modified Files: AjaxCallHelper.cs Util.cs Log Message: Fix for reflecting stylesheet changes for ASP.NET 2.0 skinning/theming Index: Util.cs =================================================================== RCS file: /cvsroot/magicajax/magicajax/Core/Util.cs,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** Util.cs 27 Jan 2006 23:59:09 -0000 1.26 --- Util.cs 29 Jan 2006 23:06:53 -0000 1.27 *************** *** 37,41 **** public const string ScriptPattern = "<script.[^>]*>"; public const string FormElementPattern = @"<(?<tag>input|textarea|select)\s+(?<attribute>(?<attrname>[-\w]+)=((""|')(?<attrvalue>.*?)(""|')\s*|(?<attrvalue>[-\w]+)\s*))*.*?(/>|>((?<inner>.*?)</\k'tag'>)?)"; ! public const string HeadElementPattern = @"<(?<tag>title|style|link)\s*(?<attribute>(?<attrname>[-\w]+)=((""|')(?<attrvalue>.*?)(""|')\s*|(?<attrvalue>[-\w]+)\s*))*.*?(/>|>[\r\n\t]*(?<inner>.*?)[\r\n]*</\k'tag'>)"; #region Global Regular Expressions --- 37,41 ---- public const string ScriptPattern = "<script.[^>]*>"; public const string FormElementPattern = @"<(?<tag>input|textarea|select)\s+(?<attribute>(?<attrname>[-\w]+)=((""|')(?<attrvalue>.*?)(""|')\s*|(?<attrvalue>[-\w]+)\s*))*.*?(/>|>((?<inner>.*?)</\k'tag'>)?)"; ! public const string StyleElementPattern = @"<(?<tag>style|link)\s*(?<attribute>(?<attrname>[-\w]+)=((""|')(?<attrvalue>.*?)(""|')\s*|(?<attrvalue>[-\w]+)\s*))*.*?(/>|>(?<inner>.*?)</\k'tag'>)"; #region Global Regular Expressions *************** *** 46,50 **** public static Regex ScriptPatternRegEx = new Regex(Util.ScriptPattern, RegexOptions.IgnoreCase); public static Regex ScriptTagsRegEx = new Regex("<script\\s((?<attrname>[-\\w]+)=[\"'](?<attrvalue>.*?)[\"']\\s?)*\\s*>(?<script>.*?)</script>", _options); ! public static Regex HeaderTagsRegEx = new Regex(HeadElementPattern, _options); #endregion --- 46,50 ---- public static Regex ScriptPatternRegEx = new Regex(Util.ScriptPattern, RegexOptions.IgnoreCase); public static Regex ScriptTagsRegEx = new Regex("<script\\s((?<attrname>[-\\w]+)=[\"'](?<attrvalue>.*?)[\"']\\s?)*\\s*>(?<script>.*?)</script>", _options); ! public static Regex HeaderStyleTagsRegEx = new Regex(StyleElementPattern, _options); #endregion Index: AjaxCallHelper.cs =================================================================== RCS file: /cvsroot/magicajax/magicajax/Core/AjaxCallHelper.cs,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** AjaxCallHelper.cs 25 Jan 2006 03:12:56 -0000 1.24 --- AjaxCallHelper.cs 29 Jan 2006 23:06:50 -0000 1.25 *************** *** 312,320 **** { StringBuilder sbuilder = new StringBuilder("new Array("); ! for (int i = 0; i < attributes.Count; i++) { ! if (i > 0) ! sbuilder.Append(","); ! sbuilder.AppendFormat("\"{0}\",\"{1}\"", attributes.Keys[i], attributes[i]); } sbuilder.Append(")"); --- 312,323 ---- { StringBuilder sbuilder = new StringBuilder("new Array("); ! if (attributes != null) { ! for (int i = 0; i < attributes.Count; i++) ! { ! if (i > 0) ! sbuilder.Append(","); ! sbuilder.AppendFormat("\"{0}\",\"{1}\"", attributes.Keys[i], attributes[i]); ! } } sbuilder.Append(")"); *************** *** 532,541 **** { Page page = (Page)sender; ! #if NET_2_0 ! // For ASP.NET 2.0, reflect the head-tag's stylesheet- or ! // title-changes back to client ! HandleHeader(MagicAjaxContext.Current.IsAjaxCall, page); #endif if (MagicAjaxContext.Current.IsAjaxCall) { --- 535,544 ---- { Page page = (Page)sender; ! #if NET_2_0 ! // Reflect head content (title and stylesheets) ! page.Header.SetRenderMethodDelegate(new RenderMethod(RenderHead)); #endif + if (MagicAjaxContext.Current.IsAjaxCall) { *************** *** 562,566 **** } } ! /// <summary> /// Reflects registered Hidden fields if added/changed on callback --- 565,658 ---- } } ! ! #if NET_2_0 ! ///<summary> ! /// Handles style,title and link tags (inside HEAD) that were added/changed during callback. ! /// For first page-request, only stores hidden field containing fingerprints ! /// of the tags inside the html head section. ! /// When reflectToClient is true, also reflects the changed tags inside head. ! ///</summary> ! protected static void RenderHead(HtmlTextWriter writer, Control ctl) ! { ! if (ctl != null) ! { ! bool reflectToClient = MagicAjaxContext.Current.IsAjaxCall; ! ! ArrayList _previousHeaderFPs = new ArrayList(); ! ArrayList _currentHeaderFPs = new ArrayList(); ! ! // Get the fingerprints of the head-tags sent previous time ! if (HttpContext.Current.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != null) ! { ! _previousHeaderFPs.AddRange(HttpContext.Current.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"].Split(';')); ! } ! ! StringBuilder sbHeader = new StringBuilder(); ! HtmlTextWriter headerWriter = new HtmlTextWriter(new System.IO.StringWriter(sbHeader)); ! ! System.Web.UI.HtmlControls.HtmlHead h = new System.Web.UI.HtmlControls.HtmlHead(); ! ctl.SetRenderMethodDelegate(null); ! ctl.RenderControl(headerWriter); ! ! //strip <header> tag ! string header = sbHeader.ToString(); ! ! //write to HtmlTextWriter ! writer.Write(header); ! ! //reflect title ! if (ctl.Page.Title != null) ! { ! string titleFP = Util.GetFingerprint(ctl.Page.Title); ! _currentHeaderFPs.Add(titleFP); ! if (reflectToClient && !_previousHeaderFPs.Contains(titleFP)) ! { ! AjaxCallHelper.WriteAddHeaderElementScript("title", ctl.Page.Title, null); ! } ! } ! ! MatchCollection matches = Util.HeaderStyleTagsRegEx.Matches(header); ! for (int i = 0; i < matches.Count; i++) ! { ! Match match = matches[i]; ! ! string matchFP = Util.GetFingerprint(match.Value); ! _currentHeaderFPs.Add(matchFP); ! ! if (reflectToClient && !_previousHeaderFPs.Contains(matchFP)) ! { ! string tagName = match.Groups["tag"].Value.ToLower(CultureInfo.InvariantCulture); ! string innerText = match.Groups["inner"].Success ? match.Groups["inner"].Value : String.Empty; ! ! NameValueCollection attrNameValues = new NameValueCollection(); ! ! if (tagName == "link") ! { ! CaptureCollection attributes = match.Groups["attribute"].Captures; ! CaptureCollection attrnames = match.Groups["attrname"].Captures; ! CaptureCollection attrvalues = match.Groups["attrvalue"].Captures; ! ! for (int j = 0; j < attributes.Count; j++) ! { ! string attrname = attrnames[j].Value.ToLower(System.Globalization.CultureInfo.InvariantCulture); ! attrNameValues.Add(attrname, attrvalues[j].Value); ! } ! } ! ! AjaxCallHelper.WriteAddHeaderElementScript(tagName, innerText, attrNameValues); ! } ! } ! ! string allHeadFPs = string.Join(";", (string[])_currentHeaderFPs.ToArray(typeof(string))); ! ! // Store head-tag fingerprints in hidden field ! if (reflectToClient && HttpContext.Current.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != allHeadFPs) ! AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); ! else if (!reflectToClient) ! ctl.Page.RegisterHiddenField("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); ! } ! } ! #endif ! /// <summary> /// Reflects registered Hidden fields if added/changed on callback *************** *** 754,829 **** #endif } - - #if NET_2_0 - /// <summary> - /// Handles style,title and link tags (inside HEAD) that were added/changed during callback. - /// For first page-request, only stores hidden field containing fingerprints - /// of the tags inside the html head section. - /// When reflectToClient is true, also reflects the changed tags inside head. - /// </summary> - /// <param name="reflectToClient"></param> - private static void HandleHeader(bool reflectToClient, Page page) - { - if (page != null && page.Header != null) - { - ArrayList _previousHeaderFPs = new ArrayList(); - ArrayList _currentHeaderFPs = new ArrayList(); - - // Get the fingerprints of the head-tags sent previous time - if (page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != null) - { - _previousHeaderFPs.AddRange(page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"].Split(';')); - } - - StringBuilder sbHeader = new StringBuilder(); - HtmlTextWriter headerWriter = new HtmlTextWriter(new System.IO.StringWriter(sbHeader)); - page.Header.RenderControl(headerWriter); - - //strip <header> tag - string header = sbHeader.ToString(); - - MatchCollection matches = Util.HeaderTagsRegEx.Matches(header); - for (int i = 0; i < matches.Count; i++) - { - Match match = matches[i]; - - string matchFP = Util.GetFingerprint(match.Value); - _currentHeaderFPs.Add(matchFP); - - if (reflectToClient && !_previousHeaderFPs.Contains(matchFP)) - { - string tagName = match.Groups["tag"].Value.ToLower(CultureInfo.InvariantCulture); - string innerText = match.Groups["inner"].Success ? match.Groups["inner"].Value : String.Empty; - - NameValueCollection attrNameValues = new NameValueCollection(); - - if (tagName == "link") - { - CaptureCollection attributes = match.Groups["attribute"].Captures; - CaptureCollection attrnames = match.Groups["attrname"].Captures; - CaptureCollection attrvalues = match.Groups["attrvalue"].Captures; - - for (int j = 0; j < attributes.Count; j++) - { - string attrname = attrnames[j].Value.ToLower(System.Globalization.CultureInfo.InvariantCulture); - attrNameValues.Add(attrname, attrvalues[j].Value); - } - } - - AjaxCallHelper.WriteAddHeaderElementScript(tagName, innerText, attrNameValues); - } - } - - string allHeadFPs = string.Join(";", (string[])_currentHeaderFPs.ToArray(typeof(string))); - - // Store head-tag fingerprints in hidden field - if (reflectToClient && page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != allHeadFPs) - AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); - else if (!reflectToClient) - page.RegisterHiddenField("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); - } - } - #endif - #endregion } --- 846,849 ---- |