You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2007/06/05 00:26:03 UTC

svn commit: r544313 - in /tapestry/tapestry4/trunk/tapestry-framework/src: java/org/apache/tapestry/form/ test/org/apache/tapestry/form/

Author: jkuhnert
Date: Mon Jun  4 15:26:02 2007
New Revision: 544313

URL: http://svn.apache.org/viewvc?view=rev&rev=544313
Log:
Fixes TAPESTRY-1536.  LinkSubmit combination with AbstractSubmit handling of async params was causing duplicate events to be connected to onclick event.

Modified:
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/AbstractSubmit.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/LinkSubmit.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Submit.jwc
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestSubmit.java

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/AbstractSubmit.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/AbstractSubmit.java?view=diff&rev=544313&r1=544312&r2=544313
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/AbstractSubmit.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/AbstractSubmit.java Mon Jun  4 15:26:02 2007
@@ -130,14 +130,13 @@
             json.put("async", Boolean.TRUE);
             json.put("json", isJson());
             
-            DirectServiceParameter dsp = 
-                new DirectServiceParameter(form, null, this);
+            DirectServiceParameter dsp = new DirectServiceParameter(form, null, this);
             
             json.put("url", getDirectService().getLink(true, dsp).getURL());
         }
         
         if (!type.equals(FormConstants.SUBMIT_NORMAL)) {
-            if (!isParameterBound("onClick")
+            if (!isParameterBound("onClick") && !isParameterBound("onclick")
                 && (!isAsync() && (update == null || update.size() == 0))) {
                 
                 StringBuffer str = new StringBuffer();
@@ -174,9 +173,27 @@
             
             PageRenderSupport prs = TapestryUtils.getPageRenderSupport(cycle, this);
             getSubmitScript().execute(this, cycle, prs, parms);
+
+            setSubmitBindingBound(true);
         }
     }
-    
+
+    /**
+     * Used internall to track whether or not an async submit binding was rendered
+     * as a result of calling {@link #renderSubmitBindings(org.apache.tapestry.IMarkupWriter, org.apache.tapestry.IRequestCycle)}.
+     *
+     * <p>
+     * Currently this is used to track javascript contributions between the base and subclasses so that
+     * duplicate client side bindings aren't created - such as the case with {@link LinkSubmit} where
+     * client side javascript is always bound to the click of the link - with only the XHR behaviour
+     * changing depending on the configuration of the component.
+     * </p>
+     *
+     * @return True if submit bindings have been configured for this component instance, false otherwise.
+     */
+    public abstract boolean isSubmitBindingBound();
+    public abstract void setSubmitBindingBound(boolean value);
+
     /** parameter. */
     public abstract IActionListener getListener();
     
@@ -212,7 +229,9 @@
      * {@inheritDoc}
      */
     public abstract boolean isJson();
-    
+
+
+
     /** Injected. */
     public abstract IEngineService getDirectService();
     

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/LinkSubmit.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/LinkSubmit.java?view=diff&rev=544313&r1=544312&r2=544313
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/LinkSubmit.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/LinkSubmit.java Mon Jun  4 15:26:02 2007
@@ -63,9 +63,7 @@
         String name = getName();
 
         if (!disabled)
-        {
-            PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(cycle, this);
-            
+        {            
             writer.begin("a");
             writer.attribute("href", "#");
             
@@ -75,13 +73,20 @@
             
             renderSubmitBindings(writer, cycle);
 
-            Map symbols = new HashMap();
-            symbols.put("form", form);
-            symbols.put("name", name);
-            symbols.put("component", this);
-            symbols.put("functionName", ScriptUtils.functionHash("onclick" + this.hashCode()));
+            // only if superclass hasn't done it already
+            
+            if (!isSubmitBindingBound())
+            {
+                PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(cycle, this);
+
+                Map symbols = new HashMap();
+                symbols.put("form", form);
+                symbols.put("name", name);
+                symbols.put("component", this);
+                symbols.put("functionName", ScriptUtils.functionHash("onclick" + this.hashCode()));
 
-            getScript().execute(this, cycle, pageRenderSupport, symbols);
+                getScript().execute(this, cycle, pageRenderSupport, symbols);
+            }
         }
 
         renderBody(writer, cycle);

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Submit.jwc
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Submit.jwc?view=diff&rev=544313&r1=544312&r2=544313
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Submit.jwc (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/Submit.jwc Mon Jun  4 15:26:02 2007
@@ -84,11 +84,8 @@
   </parameter>
   
   <parameter name="updateComponents" />
-  
   <parameter name="json" default-value="false" />
-  
   <parameter name="async" default-value="false" />
-  
   <parameter name="id" property="idParameter" default-value="id"/>
   
   <reserved-parameter name="name"/>

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java?view=diff&rev=544313&r1=544312&r2=544313
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/LinkSubmitTest.java Mon Jun  4 15:26:02 2007
@@ -18,24 +18,25 @@
 import org.apache.hivemind.Location;
 import org.apache.hivemind.Resource;
 import org.apache.tapestry.*;
+import org.apache.tapestry.engine.DirectServiceParameter;
+import org.apache.tapestry.engine.IEngineService;
+import org.apache.tapestry.engine.ILink;
 import org.apache.tapestry.valid.IValidationDelegate;
-import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.*;
 import org.testng.annotations.Test;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 /**
- * Tests for {@link org.apache.tapestry.form.LinkSubmit}
- * 
- * @author Howard Lewis Ship
- * @since 4.0
+ * Tests for {@link org.apache.tapestry.form.LinkSubmit} 
  */
-@Test(sequential=true)
+@Test
 public class LinkSubmitTest extends BaseComponentTestCase
 {
     private class ScriptFixture implements IScript
     {
-
         public void execute(IRequestCycle cycle, IScriptProcessor processor, Map symbols)
         {
             assertNotNull(cycle);
@@ -74,9 +75,7 @@
                                             "id", "fred_id", "clientId", "fred_1", "submitType", "submit");
         
         linkSubmit.addBody(newBody());
-
         trainGetSupport(cycle, support);
-        
         trainResponseBuilder(cycle, writer);
         
         replay();
@@ -107,6 +106,44 @@
         verify();
 
         assertBuffer("BODY");
+    }
+
+    public void test_Render_Submit_Bindings_True()
+    {
+        IMarkupWriter writer = newBufferWriter();
+        IRequestCycle cycle = newCycle();
+        IScript script = new ScriptFixture();
+        PageRenderSupport support = newPageRenderSupport();
+
+        IEngineService engine = newMock(IEngineService.class);
+        ILink link = newMock(ILink.class);
+        
+        IForm form = newForm();
+        List updates = Arrays.asList("comp1", "comp2");
+
+        LinkSubmit linkSubmit = newInstance(LinkSubmit.class,
+                                            "updateComponents", updates,
+                                            "form", form,
+                                            "name", "submitMe",
+                                            "clientId", "submitMe",
+                                            "submitType", FormConstants.SUBMIT_NORMAL,
+                                            "directService", engine,
+                                            "submitScript", script);
+        linkSubmit.addBody(newBody());
+
+        expect(engine.getLink(eq(true), isA(DirectServiceParameter.class))).andReturn(link);
+        expect(link.getURL()).andReturn("http://submit");
+
+        trainGetSupport(cycle, support);
+        trainResponseBuilder(cycle, writer);
+
+        replay();
+
+        linkSubmit.renderFormComponent(writer, cycle);
+
+        verify();
+
+        assertBuffer("<a href=\"#\" id=\"submitMe\">BODY</a>");
     }
 
     public void test_Prepare_Normal()

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestSubmit.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestSubmit.java?view=diff&rev=544313&r1=544312&r2=544313
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestSubmit.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestSubmit.java Mon Jun  4 15:26:02 2007
@@ -14,25 +14,8 @@
 
 package org.apache.tapestry.form;
 
-import static org.easymock.EasyMock.aryEq;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.isA;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
 import org.apache.hivemind.util.PropertyUtils;
-import org.apache.tapestry.IActionListener;
-import org.apache.tapestry.IBinding;
-import org.apache.tapestry.IForm;
-import org.apache.tapestry.IMarkupWriter;
-import org.apache.tapestry.IRequestCycle;
-import org.apache.tapestry.IScript;
-import org.apache.tapestry.PageRenderSupport;
+import org.apache.tapestry.*;
 import org.apache.tapestry.engine.DirectServiceParameter;
 import org.apache.tapestry.engine.IEngineService;
 import org.apache.tapestry.engine.ILink;
@@ -41,8 +24,11 @@
 import org.apache.tapestry.util.ScriptUtils;
 import org.apache.tapestry.valid.IValidationDelegate;
 import org.apache.tapestry.valid.ValidationConstants;
+import static org.easymock.EasyMock.*;
 import org.testng.annotations.Test;
 
+import java.util.*;
+
 /**
  * Tests for {@link org.apache.tapestry.form.Submit}.
  * 
@@ -377,11 +363,11 @@
         IEngineService engine = newEngineService();
         ILink link = newMock(ILink.class);
         
-        Submit submit = newInstance(Submit.class, 
-                new Object[] {"submitType", "cancel", 
-            "submitScript", script, "form", form, 
-            "async", true, "updateComponents", updates,
-            "directService", engine});
+        Submit submit = newInstance(Submit.class,
+                                    "submitType", "cancel",
+                                    "submitScript", script, "form", form,
+                                    "async", true, "updateComponents", updates,
+                                    "directService", engine);
         
         submit.setBinding("onClick", binding);
         
@@ -389,7 +375,6 @@
         IMarkupWriter writer = newWriter();
         
         expect(engine.getLink(eq(true), isA(DirectServiceParameter.class))).andReturn(link);
-        
         expect(link.getURL()).andReturn("/test/url");
         
         PageRenderSupport prs = newPageRenderSupport();