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()
{