Author: hlship
Date: Wed Nov  5 10:42:07 2008
New Revision: 711653

URL: http://svn.apache.org/viewvc?rev=711653&view=rev
Log:
TAP5-1: Clicking on a link that updates a zone before the page has fully loaded 
will result in a full page update and, often, a server-side exception

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/GridPager.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupport.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImplTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java?rev=711653&r1=711652&r2=711653&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractComponentEventLink.java
 Wed Nov  5 10:42:07 2008
@@ -52,7 +52,12 @@
 
         writeLink(writer, link);
 
-        if (zone != null) clientBehaviorSupport.linkZone(getClientId(), zone);
+        if (zone != null)
+        {
+            writer.getElement().forceAttributes("href", "#");
+
+            clientBehaviorSupport.linkZone(getClientId(), zone, link);
+        }
     }
 
     /**

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java?rev=711653&r1=711652&r2=711653&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Form.java
 Wed Nov  5 10:42:07 2008
@@ -239,13 +239,15 @@
 
     void beginRender(MarkupWriter writer)
     {
+        Link link = resources.createFormEventLink(EventConstants.ACTION, 
context);
+
         actionSink = new ComponentActionSink(logger);
 
         name = renderSupport.allocateClientId(resources);
 
         formSupport = createRenderTimeFormSupport(name, actionSink, new 
IdAllocator());
 
-        if (zone != null) clientBehaviorSupport.linkZone(name, zone);
+        if (zone != null) clientBehaviorSupport.linkZone(name, zone, link);
 
         // TODO: Forms should not allow to nest. Perhaps a set() method 
instead of a push() method
         // for this kind of check?  
@@ -267,15 +269,13 @@
 
         resources.triggerEvent(EventConstants.PREPARE, context, null);
 
-        Link link = resources.createFormEventLink(EventConstants.ACTION, 
context);
-
         // Save the form element for later, in case we want to write an 
encoding type attribute.
 
         form = writer.element("form",
                               "name", name,
                               "id", name,
                               "method", "post",
-                              "action", link);
+                              "action", zone == null ? link : "#");
 
         componentInvocationMap.store(form, link);
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/GridPager.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/GridPager.java?rev=711653&r1=711652&r2=711653&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/GridPager.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/GridPager.java
 Wed Nov  5 10:42:07 2008
@@ -142,7 +142,9 @@
 
         Link link = resources.createEventLink(EventConstants.ACTION, context);
 
-        Element element = writer.element("a", "href", link, "title", 
messages.format("goto-page", pageIndex));
+        Element element = writer.element("a",
+                                         "href", zone == null ? link : "#",
+                                         "title", messages.format("goto-page", 
pageIndex));
 
         writer.write(Integer.toString(pageIndex));
         writer.end();
@@ -153,7 +155,7 @@
 
             element.attribute("id", id);
 
-            clientBehaviorSupport.linkZone(id, zone);
+            clientBehaviorSupport.linkZone(id, zone, link);
         }
     }
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupport.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupport.java?rev=711653&r1=711652&r2=711653&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupport.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupport.java
 Wed Nov  5 10:42:07 2008
@@ -43,8 +43,9 @@
      *
      * @param linkId    id of the link to Ajax enable
      * @param elementId id of an element that has been previously registered 
as a Zone
+     * @param eventLink
      */
-    void linkZone(String linkId, String elementId);
+    void linkZone(String linkId, String elementId, Link eventLink);
 
     /**
      * Adds a new client-side Tapestry.FormFragment object.  FormFragment's 
are used to make parts of a client-side form

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImpl.java?rev=711653&r1=711652&r2=711653&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImpl.java
 Wed Nov  5 10:42:07 2008
@@ -64,11 +64,12 @@
         if (showFunctionName != null) spec.put(key, 
showFunctionName.toLowerCase());
     }
 
-    public void linkZone(String linkId, String elementId)
+    public void linkZone(String linkId, String elementId, Link eventLink)
     {
         JSONArray spec = new JSONArray();
         spec.put(linkId);
         spec.put(elementId);
+        spec.put(eventLink.toAbsoluteURI());
 
         renderSupport.addInit("linkZone", spec);
     }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js?rev=711653&r1=711652&r2=711653&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/resources/org/apache/tapestry5/tapestry.js
 Wed Nov  5 10:42:07 2008
@@ -501,7 +501,7 @@
      * @param options      standard Prototype Ajax Options
      * @return Ajax.Request the Ajax.Request created for the request
      */
-    sendAjaxRequest : function (form, options)
+    sendAjaxRequest : function (form, url, options)
     {
         form = $(form);
 
@@ -542,11 +542,6 @@
 
         options.parameters = hash;
 
-        // We'll just assume that the form has an action; this
-        // will always be true in Tapestry.
-
-        var url = form.readAttribute('action');
-
         // Ajax.Request will convert the hash into a query string and post it.
 
         return new Ajax.Request(url, options);
@@ -714,8 +709,9 @@
      * updates the indicated Zone.
      * @param element id or instance of <form> or <a> element
      * @param zoneId id of the element to update when link clicked or form 
submitted
+     * @param url absolute component event request URL
      */
-    linkZone : function(element, zoneId)
+    linkZone : function(element, zoneId, url)
     {
         element = $(element);
 
@@ -745,7 +741,7 @@
                     zoneManager.processReply(transport.responseJSON);
                 };
 
-                element.sendAjaxRequest({ onSuccess : successHandler });
+                element.sendAjaxRequest(url, { onSuccess : successHandler });
             });
 
             return;
@@ -761,7 +757,7 @@
 
             if (!zoneObject) return;
 
-            zoneObject.updateFromURL(element.href);
+            zoneObject.updateFromURL(url);
         });
     },
 

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImplTest.java?rev=711653&r1=711652&r2=711653&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ClientBehaviorSupportImplTest.java
 Wed Nov  5 10:42:07 2008
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry5.internal.services;
 
+import org.apache.tapestry5.Link;
 import org.apache.tapestry5.RenderSupport;
 import org.apache.tapestry5.json.JSONArray;
 import org.apache.tapestry5.json.JSONObject;
@@ -39,23 +40,34 @@
     @Test
     public void add_links()
     {
+        Link link1 = mockLink("/link1");
+        Link link2 = mockLink("/link2");
         RenderSupport support = mockRenderSupport();
 
-        support.addInit("linkZone", new JSONArray("['client1', 'zone1']"));
-        support.addInit("linkZone", new JSONArray("['client2', 'zone2']"));
+        support.addInit("linkZone", new JSONArray("['client1', 'zone1', 
'/link1']"));
+        support.addInit("linkZone", new JSONArray("['client2', 'zone2', 
'/link2']"));
 
         replay();
 
         ClientBehaviorSupportImpl setup = new 
ClientBehaviorSupportImpl(support);
 
-        setup.linkZone("client1", "zone1");
-        setup.linkZone("client2", "zone2");
+        setup.linkZone("client1", "zone1", link1);
+        setup.linkZone("client2", "zone2", link2);
 
         setup.commit();
 
         verify();
     }
 
+    private Link mockLink(String absoluteURI)
+    {
+        Link link = mockLink();
+
+        expect(link.toAbsoluteURI()).andReturn(absoluteURI).atLeastOnce();
+
+        return link;
+    }
+
     @Test
     public void add_zones()
     {


Reply via email to