add Http callback support for J2EE portlets.
authorEyal Alalouf <eyala@mainsoft.com>
Sun, 18 Feb 2007 12:28:38 +0000 (12:28 -0000)
committerEyal Alalouf <eyala@mainsoft.com>
Sun, 18 Feb 2007 12:28:38 +0000 (12:28 -0000)
svn path=/trunk/mcs/; revision=73071

21 files changed:
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.WebControls/Button.cs
mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.js
mcs/class/System.Web/System.Web.UI.WebControls/GridView.cs
mcs/class/System.Web/System.Web.UI.WebControls/GridView.js
mcs/class/System.Web/System.Web.UI.WebControls/ImageButton.cs
mcs/class/System.Web/System.Web.UI.WebControls/LinkButton.cs
mcs/class/System.Web/System.Web.UI.WebControls/TreeView.cs
mcs/class/System.Web/System.Web.UI.WebControls/TreeView.js
mcs/class/System.Web/System.Web.UI/ChangeLog
mcs/class/System.Web/System.Web.UI/ClientScriptManager.cs
mcs/class/System.Web/System.Web.UI/Control.cs
mcs/class/System.Web/System.Web.UI/Control.jvm.cs
mcs/class/System.Web/System.Web.UI/Page.cs
mcs/class/System.Web/System.Web.UI/Page.jvm.cs
mcs/class/System.Web/Test/System.Web.UI/ClientScriptManagerTest.cs
mcs/class/System.Web/resources/ChangeLog
mcs/class/System.Web/resources/webform.js

index 6c9d72dc01b0e4233d95842c31a04d8bd40afbaf..9c5a4ced2c2f2b2efffd14339db9e8f59fb1e4f0 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-18  Eyal Alaluf <eyala@mainsoft.com>
+
+       * HtmlForm.cs: Under TARGET_J2EE use Page.RenderResponse instead of
+         GetRenderResponse.
+
 2007-01-20  Miguel de Icaza  <miguel@novell.com>
 
        * HtmlHead.cs: comment out unused code, in particular metadata is
@@ -11,7 +16,7 @@
 
 2007-01-14  Eyal Alaluf  <eyala@mainsoft.com>
 
-       * HtmlForm.cs, HtmlAnchor.cs: Added H2EE Portal support for TARGET_J2EE.
+       * HtmlForm.cs, HtmlAnchor.cs: Added J2EE Portal support for TARGET_J2EE.
 
 2007-01-14  Eyal Alaluf  <eyala@mainsoft.com>
 
index e5661da62ed2d037d714efeb4570c043be128eb7..2b72c79083383c3530388e39412124855173d2c6 100644 (file)
@@ -251,9 +251,9 @@ namespace System.Web.UI.HtmlControls
 
                        action += Page.Request.QueryStringRaw;
 #if TARGET_J2EE
-                       vmw.@internal.j2ee.IPortletRenderResponse resp = GetRenderResponse();
-                       if (resp != null)
-                               action = resp.createActionURL(action);
+                       // Allow the page to transform action to a portlet action url
+                       if (Page.IsPortletRender)
+                               action = Page.RenderResponse.createActionURL(action);
 #endif
 
                        w.WriteAttribute ("name", Name);
index 459606184385e12761ce28bec64645ec8b75dab2..9cab6b54df9cbb128b6c163b1ec3d6d6110128a3 100644 (file)
@@ -218,11 +218,6 @@ namespace System.Web.UI.WebControls {
                {
                        PostBackOptions options = new PostBackOptions (this);
                        options.ActionUrl = (PostBackUrl.Length > 0 ? Page.ResolveClientUrl (PostBackUrl) : null);
-#if TARGET_J2EE
-                       vmw.@internal.j2ee.IPortletRenderResponse resp = GetRenderResponse();
-                       if (resp != null && options.ActionUrl != null)
-                               options.ActionUrl = resp.createActionURL(options.ActionUrl);
-#endif
                        options.ValidationGroup = null;
                        options.Argument = "";
                        options.RequiresJavaScriptProtocol = false;
index 4d85975109942b77ca56f3b75101e3a540d2d73e..f7632161258af2f0c591f20df35096cb9d907753 100644 (file)
@@ -1,3 +1,12 @@
+2007-02-18  Eyal Alaluf <eyala@mainsoft.com>
+
+       * Button.cs, ImageButton.cs, LinkButton.cs: Hanlding of PostbackOptions for
+         TARGET_J2EE is now centralized in ClientScriptManager.
+       * TreeView.cs, DetailsView.cs, GridView.cs, TreeView.js, DetailsView.js,
+         GridView.js: Added a field to the controls JavaScript 'data' object. The
+         form is initialized to the page 'theForm'. This is used for J2EE portlets
+         callback support.
+
 2006-02-18 Igor Zelmanovich <igorz@mainsoft.com>
 
        * Wizard: fixed:
index df151411a1aad8c6d8280211a5fb885e780c5fbc..f3bd3f0fb80f3960605770e782cf7f930a953f4e 100644 (file)
@@ -1914,6 +1914,7 @@ namespace System.Web.UI.WebControls
                                string script = string.Format ("var {0} = new Object ();\n", cgrid);\r
                                script += string.Format ("{0}.pageIndex = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (PageIndex));\r
                                script += string.Format ("{0}.uid = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (UniqueID));\r
+                               script += string.Format ("{0}.form = {1};\n", cgrid, Page.theForm);\r
                                Page.ClientScript.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);\r
                                \r
                                // Make sure the basic script infrastructure is rendered\r
index 406007a2339555f167e9412eb705df159f03ec33..35889a02f234d9858b11f03bb3dd7f98a9f62128 100644 (file)
@@ -4,7 +4,7 @@ function DetailsView_ClientEvent (ctrlId, evnt)
        if (!gridData)\r
            return null;\r
        var clientData = gridData.pageIndex + '|' + evnt;\r
-       WebForm_DoCallback (gridData.uid, clientData, DetailsView_ClientRender, ctrlId, DetailsView_ClientRender_Error);\r
+       WebForm_DoCallback (gridData.uid, clientData, DetailsView_ClientRender, ctrlId, DetailsView_ClientRender_Error, gridData.form);\r
 }\r
 \r
 function DetailsView_ClientRender (data, ctx)\r
index cba4cd4c0c12d4ad401560fd9aaebdca620a341f..e9ee9e18b9fa80e131773457462ddf2040d2edc9 100644 (file)
@@ -2076,6 +2076,7 @@ namespace System.Web.UI.WebControls
                                script += string.Format ("{0}.sortExp = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (SortExpression == null ? "" : SortExpression));
                                script += string.Format ("{0}.sortDir = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral ((int) SortDirection));
                                script += string.Format ("{0}.uid = {1};\n", cgrid, ClientScriptManager.GetScriptLiteral (UniqueID));
+                               script += string.Format ("{0}.form = {1};\n", cgrid, Page.theForm);
                                Page.ClientScript.RegisterStartupScript (typeof(TreeView), this.UniqueID, script, true);
                                
                                // Make sure the basic script infrastructure is rendered
index 52857f285934467316881c9c16705a54a11cda5e..e1e35d946585419a8950e564bcc1c1c28dd55a78 100644 (file)
@@ -4,7 +4,7 @@ function GridView_ClientEvent (ctrlId, evnt)
        if (!gridData)
            return null;
        var clientData = gridData.pageIndex + '|' + escape (gridData.sortExp) + '|' + gridData.sortDir + '|' + evnt;
-       WebForm_DoCallback (gridData.uid, clientData, GridView_ClientRender, ctrlId, GridView_ClientRender_Error);
+       WebForm_DoCallback (gridData.uid, clientData, GridView_ClientRender, ctrlId, GridView_ClientRender_Error, gridData.form);
 }
 
 function GridView_ClientRender (data, ctx)
index fb0e242ba822312de942ce81e4032fe310374698..5596f835322de246833071dab343422e6f066673 100644 (file)
@@ -244,11 +244,6 @@ namespace System.Web.UI.WebControls {
                {
                        PostBackOptions options = new PostBackOptions (this);
                        options.ActionUrl = (PostBackUrl.Length > 0 ? Page.ResolveClientUrl (PostBackUrl) : null);
-#if TARGET_J2EE
-                       vmw.@internal.j2ee.IPortletRenderResponse resp = GetRenderResponse();
-                       if (resp != null && options.ActionUrl != null)
-                               options.ActionUrl = resp.createActionURL(options.ActionUrl);
-#endif
                        options.ValidationGroup = null;
                        options.Argument = "";
                        options.ClientSubmit = false;
index db84255dd5db3e6905044a17bdc9462a26510508..47b472e654337ec8bdca9eb5c263ec96fa939c13 100644 (file)
@@ -144,11 +144,6 @@ namespace System.Web.UI.WebControls {
                {
                        PostBackOptions options = new PostBackOptions (this);
                        options.ActionUrl = (PostBackUrl.Length > 0 ? Page.ResolveClientUrl (PostBackUrl) : null);
-#if TARGET_J2EE
-                       vmw.@internal.j2ee.IPortletRenderResponse resp = GetRenderResponse();
-                       if (resp != null && options.ActionUrl != null)
-                               options.ActionUrl = resp.createActionURL(options.ActionUrl);
-#endif
                        options.ValidationGroup = null;
                        options.Argument = "";
                        options.ClientSubmit = true;
index b47b87226be49ea368a3565a2224178e6ee2de5f..7c9991d3ded3cf79d1efeee6ca0f635ccbbdc6a5 100644 (file)
@@ -1068,6 +1068,7 @@ namespace System.Web.UI.WebControls
                        }
 
                        if (Page != null) {
+                               script += string.Format ("{0}.form = {1};\n", ctree, Page.theForm);
                                script += string.Format ("{0}.populateFromClient = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (PopulateNodesFromClient));
                                script += string.Format ("{0}.expandAlt = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageToolTip (true, null)));
                                script += string.Format ("{0}.collapseAlt = {1};\n", ctree, ClientScriptManager.GetScriptLiteral (GetNodeImageToolTip (false, null)));
index 1dd426efd4cf2e23b6c6c5b33f604cfc3e6b502a..4ac79d72f3dc68c5be35c420a155dfac03617249 100644 (file)
@@ -8,7 +8,7 @@ function TreeView_ToggleExpand (treeId, nodeId) {
        var expand = node.style.display == "none";
        
        if (tree.populateFromClient && expand && node.populated != true && (node.innerHTML.length == 0 || node.hasError)) {
-               WebForm_DoCallback (tree.uid, nodeId, TreeView_PopulateCallback, treeId + " " + nodeId, TreeView_PopulateCallback)
+               WebForm_DoCallback (tree.uid, nodeId, TreeView_PopulateCallback, treeId + " " + nodeId, TreeView_PopulateCallback, tree.form)
                return;
        }
        
@@ -17,8 +17,7 @@ function TreeView_ToggleExpand (treeId, nodeId) {
        
        node.style.display = expand ? "block" : "none";
        
-       var myForm = WebForm_GetFormFromCtrl (treeId);
-       var inputStates = myForm [treeId + "_ExpandStates"];
+       var inputStates = tree.form [treeId + "_ExpandStates"];
        TreeView_SetNodeFlag (inputStates, nodeId, expand);
        
        if (tree.showImage) {
@@ -60,8 +59,7 @@ function TreeView_PopulateCallback (data, ids)
        if (data != "*") {
                node.innerHTML = data;
            TreeView_ToggleExpand (idArray[0], idArray[1]);
-               var myForm = WebForm_GetFormFromCtrl (idArray[0]);
-           TreeView_SetNodeFlag (myForm [idArray[0] + "_PopulatedStates"], idArray[1], true);
+           TreeView_SetNodeFlag (tree.form [idArray[0] + "_PopulatedStates"], idArray[1], true);
        } else {
                if (tree.showImage && tree.noExpandImage != null) {
                        var image = document.getElementById (spanId + "_img");
index 8d4d3f832ce8949505954280fd55e069bdc8406a..d8bf5cda01dfbf72f9eaaad02efed9922f6318be 100644 (file)
@@ -1,3 +1,10 @@
+2007-02-18  Eyal Alaluf <eyala@mainsoft.com>
+
+       * Control.jvm.cs, Control.cs: Move TemplateSourceDirectory to .jvm file.
+       * Control.jvm.cs, Page.jvm.cs: Centralize Portlet specific API in Page.jvm
+       * Page.cs, Page.jvm.cs, ClientScriptManager.cs: Support for Http callbacks
+         for J2EE portlets.
+
 2007-02-14 Igor Zelmanovich <igorz@mainsoft.com>
 
        * Page.cs: for 2.0: 
index 392bbe1e208e26d1851b8a46f6f8c419c43bffe4..6ff81feb4f4df6b1c37fc656193c576c81f6270b 100644 (file)
@@ -131,7 +131,7 @@ namespace System.Web.UI
                {
                        if (options == null)
                                throw new ArgumentNullException ("options");
-                       
+
                        if (options.ActionUrl == null && options.ValidationGroup == null && !options.TrackFocus && 
                                !options.AutoPostBack && !options.PerformValidation)
                        {
@@ -145,20 +145,31 @@ namespace System.Web.UI
                        }
 
                        RegisterWebFormClientScript ();
-                       
-                       if (options.ActionUrl != null)
+
+                       string actionUrl = options.ActionUrl;
+                       if (actionUrl != null)
                                RegisterHiddenField (Page.PreviousPageID, page.Request.FilePath);
-                       
-                       return String.Format ("{0}WebForm_DoPostback({1},{2},{3},{4},{5},{6},{7},{8})", 
-                                       options.RequiresJavaScriptProtocol ? "javascript:" : "",
+
+                       string prefix = options.RequiresJavaScriptProtocol ? "javascript:" : "";
+#if TARGET_J2EE
+                       // Allow the page to transform ActionUrl to a portlet action url
+                       if (actionUrl != null && page.PortletNamespace != null) {
+                               actionUrl = page.CreateActionUrl(actionUrl);
+                               prefix += "Portal";
+                       }
+#endif
+
+                       return String.Format ("{0}WebForm_DoPostback({1},{2},{3},{4},{5},{6},{7},{8},{9})", 
+                                       prefix,
                                        ClientScriptManager.GetScriptLiteral (options.TargetControl.UniqueID), 
                                        ClientScriptManager.GetScriptLiteral (options.Argument),
-                                       ClientScriptManager.GetScriptLiteral (options.ActionUrl),
+                                       ClientScriptManager.GetScriptLiteral (actionUrl),
                                        ClientScriptManager.GetScriptLiteral (options.AutoPostBack),
                                        ClientScriptManager.GetScriptLiteral (options.PerformValidation),
                                        ClientScriptManager.GetScriptLiteral (options.TrackFocus),
                                        ClientScriptManager.GetScriptLiteral (options.ClientSubmit),
-                                       ClientScriptManager.GetScriptLiteral (options.ValidationGroup)
+                                       ClientScriptManager.GetScriptLiteral (options.ValidationGroup),
+                                       page.theForm
                                );
                }
 
@@ -195,7 +206,7 @@ namespace System.Web.UI
                {
                        RegisterWebFormClientScript ();
                        
-                       return string.Format ("WebForm_DoCallback('{0}',{1},{2},{3},{4},{5})", target, argument, clientCallback, context, ((clientErrorCallback == null) ? "null" : clientErrorCallback), (useAsync ? "true" : "false"));
+                       return string.Format ("WebForm_DoCallback('{0}',{1},{2},{3},{4},{5},{6})", target, argument, clientCallback, context, ((clientErrorCallback == null) ? "null" : clientErrorCallback), (useAsync ? "true" : "false"), page.theForm);
                }
 #endif
                
index 479952cbeea1be1066b65a2000284e0137fd18df..2ce6f09cdf641d5b0c4f5c00545e65a0ac4d8a7f 100644 (file)
@@ -389,41 +389,7 @@ namespace System.Web.UI
                }
 #endif         
 
-#if TARGET_JVM
-                       private string _templateSourceDir;
-                       public virtual string TemplateSourceDirectory
-                       {
-                               get
-                               {
-                                       int location = 0;
-                                       if (_templateSourceDir == null) {
-                                               string tempSrcDir = _appRelativeTemplateSourceDirectory;
-                                               if (tempSrcDir == null && Parent != null)
-                                                       tempSrcDir = Parent.TemplateSourceDirectory;
-                                               if (tempSrcDir != null && tempSrcDir.Length > 1) {
-                                                       location = tempSrcDir.IndexOf ('/', 1);
-                                                       if (location != -1)
-                                                               tempSrcDir = tempSrcDir.Substring (location + 1);
-                                                       else
-                                                               tempSrcDir = string.Empty;
-                                               }
-                                               string answer = HttpRuntime.AppDomainAppVirtualPath;
-                                               if (tempSrcDir == null)
-                                                       tempSrcDir = "";
-
-                                               if (tempSrcDir.Length > 0 && tempSrcDir [tempSrcDir.Length - 1] == '/')
-                                                       tempSrcDir = tempSrcDir.Substring (0, tempSrcDir.Length - 1);
-
-                                               if (tempSrcDir.StartsWith ("/") || tempSrcDir.Length == 0)
-                                                       _templateSourceDir = answer + tempSrcDir;
-                                               else
-                                                       _templateSourceDir = answer + "/" + tempSrcDir;
-                                       }
-                                       return _templateSourceDir;
-                               }
-                       }
-
-#else
+#if !TARGET_J2EE
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                [Browsable (false)]
                [WebSysDescription ("A virtual directory containing the parent of the control.")]
@@ -761,7 +727,7 @@ namespace System.Web.UI
                Control LookForControlByName (string id)
                {
 #if TARGET_J2EE
-                       if (this == _page && id != null && id == _page.PortletNamespace)
+                       if (this == Page && id != null && id == Page.PortletNamespace)
                                return this;
 #endif
                        if (!HasControls ())
@@ -1224,7 +1190,7 @@ namespace System.Web.UI
                        string absoluteUrl = ResolveUrl (relativeUrl);
 #if TARGET_J2EE
                        // There are no relative paths when rendering a J2EE portlet
-                       if (IsPortletRender)
+                       if (Page != null && Page.PortletNamespace != null)
                                return absoluteUrl;
 #endif
                        if (Context != null && Context.Request != null) {
index 25b2abbd275937a50c8f44de68c4b11fb4b7f775..f35714e57bc5163f191cf98bceecae28916b6711 100644 (file)
@@ -35,39 +35,56 @@ namespace System.Web.UI
 {\r
        public partial class Control\r
        {\r
-               internal bool IsPortletRender\r
+               private string _templateSourceDir;\r
+\r
+               public virtual string TemplateSourceDirectory\r
                {\r
-                       get {\r
-                               return GetRenderResponse() != null;\r
+                       get\r
+                       {\r
+                               int location = 0;\r
+                               if (_templateSourceDir == null) {\r
+                                       string tempSrcDir = _appRelativeTemplateSourceDirectory;\r
+                                       if (tempSrcDir == null && Parent != null)\r
+                                               tempSrcDir = Parent.TemplateSourceDirectory;\r
+                                       if (tempSrcDir != null && tempSrcDir.Length > 1) {\r
+                                               location = tempSrcDir.IndexOf ('/', 1);\r
+                                               if (location != -1)\r
+                                                       tempSrcDir = tempSrcDir.Substring (location + 1);\r
+                                               else\r
+                                                       tempSrcDir = string.Empty;\r
+                                       }\r
+                                       string answer = HttpRuntime.AppDomainAppVirtualPath;\r
+                                       if (tempSrcDir == null)\r
+                                               tempSrcDir = "";\r
+\r
+                                       if (tempSrcDir.Length > 0 && tempSrcDir [tempSrcDir.Length - 1] == '/')\r
+                                               tempSrcDir = tempSrcDir.Substring (0, tempSrcDir.Length - 1);\r
+\r
+                                       if (tempSrcDir.StartsWith ("/") || tempSrcDir.Length == 0)\r
+                                               _templateSourceDir = answer + tempSrcDir;\r
+                                       else\r
+                                               _templateSourceDir = answer + "/" + tempSrcDir;\r
+                               }\r
+                               return _templateSourceDir;\r
                        }\r
                }\r
 \r
+\r
                // Add a variant for specifying use of portlet resolveRenderUrl\r
                internal string ResolveUrl (string relativeUrl, bool usePortletRenderResolve)\r
                {\r
                        relativeUrl = ResolveUrl (relativeUrl);\r
-                       if (usePortletRenderResolve) {\r
-                               IPortletRenderResponse resp = GetRenderResponse ();\r
-                               if (resp != null)\r
-                                       relativeUrl = resp.createRenderURL (relativeUrl);\r
-                       }\r
+                       if (usePortletRenderResolve && Page != null)\r
+                               relativeUrl = Page.CreateRenderUrl (relativeUrl);\r
                        return relativeUrl;\r
                }\r
 \r
                internal string ResolveClientUrl (string relativeUrl, bool usePortletRenderResolve)\r
                {\r
                        relativeUrl = ResolveClientUrl (relativeUrl);\r
-                       if (usePortletRenderResolve) {\r
-                               IPortletRenderResponse resp = GetRenderResponse ();\r
-                               if (resp != null)\r
-                                       relativeUrl = resp.createRenderURL (relativeUrl);\r
-                       }\r
+                       if (usePortletRenderResolve && Page != null)\r
+                               relativeUrl = Page.CreateRenderUrl (relativeUrl);\r
                        return relativeUrl;\r
                }\r
-\r
-               internal IPortletRenderResponse GetRenderResponse ()\r
-               {\r
-                       return Context.ServletResponse as IPortletRenderResponse;\r
-               }\r
        }\r
 }\r
index 5f9332b667c39b99f09e89fe93c4d4aba6f73b72..3d614486695732939ea65506a66b54ce184c1c6a 100644 (file)
@@ -1006,6 +1006,10 @@ public partial class Page : TemplateControl, IHttpHandler
                writer.WriteLine ("\tvar {0};\n\tif (document.getElementById) {{ {0} = document.getElementById ('{1}'); }}", theForm, formUniqueID);
                writer.WriteLine ("\telse {{ {0} = document.{1}; }}", theForm, formUniqueID);
                writer.WriteLine ("\t{0}.isAspForm = true;", theForm);
+#if TARGET_J2EE
+               string serverUrl = Context.ServletResponse.encodeURL (Request.RawUrl);
+               writer.WriteLine ("\t{0}.serverURL = {1};", theForm, ClientScriptManager.GetScriptLiteral (serverUrl));
+#endif
        }
 
        internal void OnFormRender (HtmlTextWriter writer, string formUniqueID)
@@ -1135,7 +1139,7 @@ public partial class Page : TemplateControl, IHttpHandler
        }
 
        [EditorBrowsable (EditorBrowsableState.Never)]
-#if NET_2_0 || TARGET_JVM
+#if NET_2_0
        public virtual void ProcessRequest (HttpContext context)
 #else
        public void ProcessRequest (HttpContext context)
@@ -1309,12 +1313,11 @@ public partial class Page : TemplateControl, IHttpHandler
 #if NET_2_0
                _lifeCycle = PageLifeCycle.SaveStateComplete;
                OnSaveStateComplete (EventArgs.Empty);
-#endif
-
 #if TARGET_J2EE
-               if (SaveViewStateForNextPortletRender())
+               if (OnSaveStateCompleteForPortlet ())
                        return;
-#endif
+#endif // TARGET_J2EE
+#endif // NET_2_0
 
 #if NET_2_0
                _lifeCycle = PageLifeCycle.Render;
index 2490f59c392c884afecc905d91187bedc4e85084..fb60c850774c023928814019685033a208d751df 100644 (file)
@@ -27,8 +27,8 @@
 //
 
 using vmw.@internal.j2ee;
-using javax.servlet.http;\r
-using System.Collections.Specialized;\r
+using javax.servlet.http;
+using System.Collections.Specialized;
 using System.Globalization;
 using System.Web.Hosting;
 
@@ -36,8 +36,16 @@ namespace System.Web.UI
 {
        public partial class Page
        {
+               const string PageNamespaceKey = "__PAGENAMESPACE";
+               const string RenderPageMark = "vmw.render.page=";
+               const string ActionPageMark = "vmw.action.page=";
+               static readonly string NextActionPageKey = PortletInternalUtils.NextActionPage;
+               static readonly string NextRenderPageKey = PortletInternalUtils.NextRenderPage;
+
                bool _emptyPortletNamespace = false;
                string _PortletNamespace = null;
+               bool _renderResponseInit = false;
+               IPortletRenderResponse _renderResponse = null;
 
                internal string PortletNamespace
                {
@@ -46,9 +54,14 @@ namespace System.Web.UI
                                        return null;
 
                                if (_PortletNamespace == null) {
-                                       IPortletResponse portletResponse = Context.ServletResponse as IPortletResponse;
+                                       IPortletResponse portletResponse = null;
+                                       if (Context != null)
+                                               portletResponse = Context.ServletResponse as IPortletResponse;
                                        if (portletResponse != null)
                                                _PortletNamespace = portletResponse.getNamespace ();
+                                       else if (_requestValueCollection != null && _requestValueCollection [PageNamespaceKey] != null)
+                                               _PortletNamespace = _requestValueCollection [PageNamespaceKey];
+                                               
                                        _emptyPortletNamespace = _PortletNamespace == null;
                                }
                                return _PortletNamespace;
@@ -61,8 +74,77 @@ namespace System.Web.UI
                        }
                }
 
-               internal bool SaveViewStateForNextPortletRender ()
+               internal bool IsPortletRender
+               {
+                       get {
+                               return RenderResponse != null;
+                       }
+               }
+
+               internal IPortletRenderResponse RenderResponse
+               {
+                       get {
+                               if (!_renderResponseInit) {
+                                       _renderResponse = Context.ServletResponse as IPortletRenderResponse;
+                                       _renderResponseInit = true;
+                               }
+                               return _renderResponse;
+                       }
+               }
+
+               public string CreateRenderUrl (string url)
+               {
+                       if (RenderResponse != null)
+                               return RenderResponse.createRenderURL (url);
+                       if (PortletNamespace == null)
+                               return url;
+
+                       string internalUrl = RemoveAppPathIfInternal (url);
+                       if (internalUrl == null)
+                               return url;
+
+                       PostBackOptions options = new PostBackOptions (this);
+                       options.ActionUrl = RenderPageMark + internalUrl;
+                       options.RequiresJavaScriptProtocol = true;
+                       return ClientScript.GetPostBackEventReference (options);
+               }
+
+               public string CreateActionUrl (string url)
+               {
+                       if (url.StartsWith(RenderPageMark) || url.StartsWith(ActionPageMark))
+                               return url;
+
+                       if (RenderResponse != null)
+                               return RenderResponse.createActionURL (url);
+                       if (PortletNamespace == null)
+                               return url;
+
+                       Uri requestUrl = Request.Url;
+                       string internalUrl = RemoveAppPathIfInternal (url);
+                       if (internalUrl == null)
+                               return url;
+
+                       return ActionPageMark + internalUrl;
+               }
+
+               private string RemoveAppPathIfInternal (string url)
                {
+                       Uri reqUrl = Request.Url;
+                       string appPath = Request.ApplicationPath;
+                       string currPage = Request.CurrentExecutionFilePath;
+                       if (currPage.StartsWith (appPath))
+                               currPage = currPage.Substring (appPath.Length);
+                       return PortletInternalUtils.mapPathIfInternal (url, reqUrl.Host, reqUrl.Port, reqUrl.Scheme, appPath, currPage);
+               }
+
+               internal bool OnSaveStateCompleteForPortlet ()
+               {
+                       if (PortletNamespace != null) {
+                               ClientScript.RegisterHiddenField (PageNamespaceKey, PortletNamespace);
+                               ClientScript.RegisterHiddenField (NextActionPageKey, "");
+                               ClientScript.RegisterHiddenField (NextRenderPageKey, "");
+                       }
+
                        IPortletActionResponse resp = Context.ServletResponse as IPortletActionResponse;
                        IPortletActionRequest req = Context.ServletRequest as IPortletActionRequest;
                        if (req == null)
index 1fd068cb4ac812c042b82f5bc0cb6ca9009bc15b..f86736c556a3a0a87b3240f4ad86c2c9d69072f7 100644 (file)
@@ -85,17 +85,19 @@ namespace MonoTests.System.Web.UI
                {
                        MyPage p = new MyPage ();
                        ClientScriptManager cs = p.ClientScript;
-                       StringBuilder context1 = new StringBuilder ();
-                       context1.Append ("function ReceiveServerData1(arg, context)");
-                       context1.Append ("{");
-                       context1.Append ("Message1.innerText =  arg;");
-                       context1.Append ("value1 = arg;");
-                       context1.Append ("}");
+                       StringBuilder func = new StringBuilder ();
+                       func.Append ("function ReceiveServerData1(arg, context)");
+                       func.Append ("{");
+                       func.Append ("Message1.innerText =  arg;");
+                       func.Append ("value1 = arg;");
+                       func.Append ("}");
 
                        // Define callback references.
-                       String cbReference = cs.GetCallbackEventReference (p, "arg",
-                           "ReceiveServerData1", context1.ToString ());
-                       Assert.AreEqual ("WebForm_DoCallback('__Page',arg,ReceiveServerData1,function ReceiveServerData1(arg, context){Message1.innerText =  arg;value1 = arg;},null,false)", cbReference, "GetCallbackEventReferenceFail1");
+                       String cbReference = cs.GetCallbackEventReference (p, "callArg",
+                           func.ToString (), "ReceiveServerData1Ctx");
+                       Assert.IsTrue (cbReference.IndexOf ("callArg") != -1, "GetCallbackEventReferenceFail1_arg");
+                       Assert.IsTrue (cbReference.IndexOf (func.ToString ()) != -1, "GetCallbackEventReferenceFail1_callback");
+                       Assert.IsTrue (cbReference.IndexOf ("ReceiveServerData1Ctx") != -1, "GetCallbackEventReferenceFail1_context");
                }
 
                [Test]
@@ -103,17 +105,23 @@ namespace MonoTests.System.Web.UI
                {
                        MyPage p = new MyPage ();
                        ClientScriptManager cs = p.ClientScript;
-                       StringBuilder context1 = new StringBuilder ();
-                       context1.Append ("function ReceiveServerData1(arg, context)");
-                       context1.Append ("{");
-                       context1.Append ("Message1.innerText =  arg;");
-                       context1.Append ("value1 = arg;");
-                       context1.Append ("}");
+                       StringBuilder func = new StringBuilder ();
+                       func.Append ("function ReceiveServerData1(arg, context)");
+                       func.Append ("{");
+                       func.Append ("Message1.innerText =  arg;");
+                       func.Append ("value1 = arg;");
+                       func.Append ("}");
 
                        // Define callback references.
-                       String cbReference = cs.GetCallbackEventReference (p, "arg",
-                           "ReceiveServerData1", context1.ToString (), true);
-                       Assert.AreEqual ("WebForm_DoCallback('__Page',arg,ReceiveServerData1,function ReceiveServerData1(arg, context){Message1.innerText =  arg;value1 = arg;},null,true)", cbReference, "GetCallbackEventReferenceFail2");
+                       String cbReference = cs.GetCallbackEventReference (p, "callArg",
+                           func.ToString (), "ReceiveServerData1Ctx", true);
+                       Assert.IsTrue (cbReference.IndexOf ("callArg") != -1, "GetCallbackEventReferenceFail2_arg");
+                       Assert.IsTrue (cbReference.IndexOf (func.ToString ()) != -1, "GetCallbackEventReferenceFail2_callback");
+                       Assert.IsTrue (cbReference.IndexOf ("ReceiveServerData1Ctx") != -1, "GetCallbackEventReferenceFail2_context");
+                       String cbReference2 = cs.GetCallbackEventReference (p, "arg",
+                           func.ToString (), "ReceiveServerData1Ctx", false);
+                       // Check that we get different results when useAsync differs.
+                       Assert.IsTrue (cbReference != cbReference2, "GetCallbackEventReferenceFail2_useAsync");
                }
 
                [Test]
@@ -121,17 +129,20 @@ namespace MonoTests.System.Web.UI
                {
                        MyPage p = new MyPage ();
                        ClientScriptManager cs = p.ClientScript;
-                       StringBuilder context1 = new StringBuilder ();
-                       context1.Append ("function ReceiveServerData1(arg, context)");
-                       context1.Append ("{");
-                       context1.Append ("Message1.innerText =  arg;");
-                       context1.Append ("value1 = arg;");
-                       context1.Append ("}");
+                       StringBuilder func = new StringBuilder ();
+                       func.Append ("function ReceiveServerData1(arg, context)");
+                       func.Append ("{");
+                       func.Append ("Message1.innerText =  arg;");
+                       func.Append ("value1 = arg;");
+                       func.Append ("}");
 
                        // Define callback references.
-                       String cbReference = cs.GetCallbackEventReference (p, "arg",
-                           "ReceiveServerData1", context1.ToString (), "ErrorCallback", false);
-                       Assert.AreEqual ("WebForm_DoCallback('__Page',arg,ReceiveServerData1,function ReceiveServerData1(arg, context){Message1.innerText =  arg;value1 = arg;},ErrorCallback,false)", cbReference, "GetCallbackEventReferenceFail3");
+                       String cbReference = cs.GetCallbackEventReference (p, "callArg",
+                           func.ToString (), "ReceiveServerData1Ctx", "ErrorCallback", false);
+                       Assert.IsTrue (cbReference.IndexOf ("callArg") != -1, "GetCallbackEventReferenceFail3_arg");
+                       Assert.IsTrue (cbReference.IndexOf (func.ToString ()) != -1, "GetCallbackEventReferenceFail3_callback");
+                       Assert.IsTrue (cbReference.IndexOf ("ReceiveServerData1Ctx") != -1, "GetCallbackEventReferenceFail3_context");
+                       Assert.IsTrue (cbReference.IndexOf ("ErrorCallback") != -1, "GetCallbackEventReferenceFail3_errorCallback");
                }
 
                [Test]
@@ -139,8 +150,9 @@ namespace MonoTests.System.Web.UI
                {
                        MyPage p = new MyPage ();
                        ClientScriptManager cs = p.ClientScript;
-                       String result = cs.GetPostBackEventReference (new PostBackOptions (p, "args"));
-                       Assert.AreEqual ("__doPostBack('__Page','args')", result, "GetPostBackEventReference#1");
+                       String result = cs.GetPostBackEventReference (new PostBackOptions (p, "args1"));
+                       Assert.IsTrue (result.IndexOf(p.ClientID) != -1, "GetPostBackEventReference#1_targetEvent");
+                       Assert.IsTrue (result.IndexOf("args1") != -1, "GetPostBackEventReference#1_targetArgs");
                }
 
                [Test]
@@ -148,8 +160,9 @@ namespace MonoTests.System.Web.UI
                {
                        MyPage p = new MyPage ();
                        ClientScriptManager cs = p.ClientScript;
-                       String result = cs.GetPostBackEventReference (p, "args");
-                       Assert.AreEqual ("__doPostBack('__Page','args')", result, "GetPostBackEventReference#2");
+                       String result = cs.GetPostBackEventReference (p, "args1");
+                       Assert.IsTrue (result.IndexOf(p.ClientID) != -1, "GetPostBackEventReference#2_targetEvent");
+                       Assert.IsTrue (result.IndexOf("args1") != -1, "GetPostBackEventReference#2_targetArgs");
                }
 
                [Test]
@@ -157,8 +170,10 @@ namespace MonoTests.System.Web.UI
                {
                        MyPage p = new MyPage ();
                        ClientScriptManager cs = p.ClientScript;
-                       String hyperlink = cs.GetPostBackClientHyperlink (p, "args");
-                       Assert.AreEqual ("javascript:__doPostBack('__Page','args')", hyperlink, "GetPostBackClientHyperlink");
+                       String hyperlink = cs.GetPostBackClientHyperlink (p, "args1");
+                       Assert.IsTrue (hyperlink.IndexOf("javascript:") != -1, "GetPostBackClientHyperlink_javaScript");
+                       Assert.IsTrue (hyperlink.IndexOf(p.ClientID) != -1, "GetPostBackClientHyperlink_targetEvent");
+                       Assert.IsTrue (hyperlink.IndexOf("args1") != -1, "GetPostBackClientHyperlink_targetArgs");
                }
 
                [Test]
index f6bb39ebe754642abaa84958eedd8355da8312c9..b258ed99892fbe471cf7ecae4350d134bb833a7e 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-18  Eyal Alaluf <eyala@mainsoft.com>
+
+       * webform.js: Adding an optional parameter for passing the form to all JS
+         methods. This is needed to support Http callbacks for J2EE portlets. 
+
 2007-02-18 Igor Zelmanovich <igorz@mainsoft.com>
 
        * WebUIValidation_2.0.js: 
index 89f80209660bfed5922514e0f060ae7ce4b03e72..b93791f0db7bda7aed32d4e27b63bddd9dcf2c46 100644 (file)
@@ -108,10 +108,28 @@ function WebForm_ReEnableControls (currForm)
        }
 }
 
-function WebForm_DoPostback (id, par, url, apb, pval, tf, csubm, vg)
+// This function is only used in the context of TARGET_J2EE for portlets
+function PortalWebForm_DoPostback (id, par, url, apb, pval, tf, csubm, vg, currForm)
 {
-       var currForm = WebForm_GetFormFromCtrl (id);
-       
+       if (url != null) {
+               currForm = WebForm_GetFormFromCtrl (id, currForm);
+               if (url.indexOf ("vmw.action.page=") == 0) {
+                       currForm.__NEXTVMWACTIONPAGE.value = url.substring ("vmw.action.page=".length);
+                       url = currForm.action;
+               }
+               else if (url.indexOf ("vmw.render.page=") == 0)
+               {
+                       currForm.__NEXTVMWRENDERPAGE.value = url.substring ("vmw.render.page=".length);
+                       currForm.submit ();
+                       return;
+               }
+       }
+       return WebForm_DoPostback (id, par, url, apb, pval, tf, csubm, vg, currForm);
+}
+function WebForm_DoPostback (id, par, url, apb, pval, tf, csubm, vg, currForm)
+{
+       currForm = WebForm_GetFormFromCtrl (id, currForm);
+
        if (typeof(SetValidatorContext) == "function") 
                SetValidatorContext (currForm);
 
@@ -119,24 +137,22 @@ function WebForm_DoPostback (id, par, url, apb, pval, tf, csubm, vg)
        if (pval && typeof(Page_ClientValidate) == "function")
                validationResult =  Page_ClientValidate(vg);
 
-       if (validationResult) {
-               if (url != null)
-                       currForm.action = url;
-       }
+       if (validationResult && url != null)
+               currForm.action = url;
                
        if (csubm)
                currForm.__doPostBack (id, par);
 }
 
-function WebForm_DoCallback (id, arg, callback, ctx, errorCallback)
+function WebForm_DoCallback (id, arg, callback, ctx, errorCallback, currForm)
 {
-       var currForm = WebForm_GetFormFromCtrl (id);
+       currForm = WebForm_GetFormFromCtrl (id, currForm);
        var qs = WebForm_getFormData (currForm) + "__CALLBACKTARGET=" + id + "&__CALLBACKARGUMENT=" + encodeURIComponent(arg);
        if (currForm["__EVENTVALIDATION"]) qs += "&__EVENTVALIDATION=" + encodeURIComponent(currForm["__EVENTVALIDATION"].value);
-       WebForm_httpPost (document.URL, qs, function (httpPost) { WebForm_ClientCallback (httpPost, ctx, callback, errorCallback); });
+       WebForm_httpPost (currForm.serverURL || document.URL, qs, function (httpPost) { WebForm_ClientCallback (httpPost, ctx, callback, errorCallback, currForm); });
 }
 
-function WebForm_ClientCallback (httpPost, ctx, callback, errorCallback)
+function WebForm_ClientCallback (httpPost, ctx, callback, errorCallback, currForm)
 {
        var doc = httpPost.responseText;
        if (doc.charAt(0) == "e") {
@@ -149,12 +165,12 @@ function WebForm_ClientCallback (httpPost, ctx, callback, errorCallback)
                        if (!isNaN(validationFieldLength)) {
                                var validationField = doc.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);
                                if (validationField != "") {
-                                       var validationFieldElement = theForm["__EVENTVALIDATION"];
+                                       var validationFieldElement = currForm["__EVENTVALIDATION"];
                                        if (!validationFieldElement) {
                                                validationFieldElement = document.createElement("INPUT");
                                                validationFieldElement.type = "hidden";
                                                validationFieldElement.name = "__EVENTVALIDATION";
-                                               theForm.appendChild(validationFieldElement);
+                                               currForm.appendChild(validationFieldElement);
                                        }
                                        validationFieldElement.value = validationField;
                                }
@@ -228,8 +244,11 @@ function WebForm_httpPost (url, data, callback)
        setTimeout (function () { httpPost.send (data); }, 10);
 }
 
-function WebForm_GetFormFromCtrl (id)
+function WebForm_GetFormFromCtrl (id, currForm)
 {
+       if (currForm)
+               return currForm;
+
        // We need to translate the id from ASPX UniqueID to its ClientID.
        var ctrl = WebForm_GetElementById (id.replace(/\$/g, "_"));
        while (ctrl != null) {