You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2005/08/31 19:08:13 UTC

svn commit: r265533 - in /jakarta/tapestry/trunk: ./ examples/Workbench/src/context/ examples/Workbench/src/context/WEB-INF/ examples/Workbench/src/java/org/apache/tapestry/workbench/fields/ framework/src/java/org/apache/tapestry/form/ framework/src/te...

Author: hlship
Date: Wed Aug 31 10:08:04 2005
New Revision: 265533

URL: http://svn.apache.org/viewcvs?rev=265533&view=rev
Log:
TAPESTRY-613: Javascript problem with @LinkSubmit

Added:
    jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/FieldsResults.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java
Modified:
    jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html
    jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html
    jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/FieldsResults.page
    jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormMessages.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormStrings.properties
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java
    jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.jwc
    jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/BaseComponentTestCase.java
    jakarta/tapestry/trunk/status.xml

Modified: jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/Fields.html Wed Aug 31 10:08:04 2005
@@ -70,7 +70,7 @@
       	<td></td>
   		<td>
       	Or, use a LinkSubmit component:   
-      	<a jwcid="continueLink@LinkSubmit">Continue</a>
+      	<a jwcid="continueLink@LinkSubmit" listener="listener:doByLink">Continue</a>
         </td>
   </tr>
   

Modified: jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/FieldsResults.html Wed Aug 31 10:08:04 2005
@@ -1,6 +1,10 @@
 
 <span jwcid="@Border">
 
+<span jwcid="@If" condition="ognl:byLink">
+<b>You clicked the link on the previous form.</b>
+</span>
+
 <table>
 	<tr>
 		<th>Date Value</th>

Modified: jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/FieldsResults.page
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/FieldsResults.page?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/FieldsResults.page (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/context/WEB-INF/FieldsResults.page Wed Aug 31 10:08:04 2005
@@ -19,7 +19,7 @@
   "-//Apache Software Foundation//Tapestry Specification 4.0//EN" 
   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
 
-<page-specification>
+<page-specification class="org.apache.tapestry.workbench.fields.FieldsResults">
 
   <component id="backRollover" type="Rollover">
     <binding name="image" value="asset:back"/>

Modified: jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java (original)
+++ jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/Fields.java Wed Aug 31 10:08:04 2005
@@ -16,6 +16,8 @@
 
 import java.math.BigDecimal;
 
+import org.apache.tapestry.IPage;
+import org.apache.tapestry.annotations.InjectPage;
 import org.apache.tapestry.html.BasePage;
 import org.apache.tapestry.valid.IValidationDelegate;
 
@@ -45,9 +47,17 @@
 
     public static final int STRING_MIN_LENGTH = 3;
 
-    public String doSubmit()
+    @InjectPage("FieldsResults")
+    public abstract FieldsResults getResultsPage();
+
+    public IPage doSubmit()
+    {
+        return getResultsPage();
+    }
+
+    public void doByLink()
     {
-        return "FieldsResults";
+        getResultsPage().setByLink(true);
     }
 
     /**

Added: jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/FieldsResults.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/FieldsResults.java?rev=265533&view=auto
==============================================================================
--- jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/FieldsResults.java (added)
+++ jakarta/tapestry/trunk/examples/Workbench/src/java/org/apache/tapestry/workbench/fields/FieldsResults.java Wed Aug 31 10:08:04 2005
@@ -0,0 +1,16 @@
+package org.apache.tapestry.workbench.fields;
+
+import org.apache.tapestry.html.BasePage;
+
+/**
+ * @author Howard Lewis Ship
+ * @since 4.0
+ */
+public abstract class FieldsResults extends BasePage
+{
+    /**
+     * Flag indicating whether the form was submitted via a link.
+     */
+
+    public abstract void setByLink(boolean byLink);
+}

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/Form.js Wed Aug 31 10:08:04 2005
@@ -159,8 +159,8 @@
   // Inside onsubmit and onreset, "this" will be the form (how convienient)
   // so we need to carefully bridge this back to the FormEventManager instance.
   
-  form.onsubmit = function() { return this.events.submit(); };
-  form.onreset = function() { return this.events.reset(); };
+  form.onsubmit = function() { return this.events.onsubmit_handler(); };
+  form.onreset = function() { return this.events.onreset_handler(); };
   
   // Override this property when doing something more ambitious than
   // the default (which invokes window.alert(), focuses the field, and aborts
@@ -211,11 +211,11 @@
   }
 }
 
-// addCancelListener(handler)
+// add_cancel_handler(handler)
 //
 // handler - receives notifications when the form is canceled
 
-FormEventManager.prototype.addCancelListener= function(handler)
+FormEventManager.prototype.add_cancel_handler = function(handler)
 {
   this.add_handler("cancel", handler);
 }
@@ -284,15 +284,28 @@
 
 // submit()
 //
-// Submits a form.  This is designed to be the form's onsubmit event handler, so it returns true
-// to let the form submit, or false if any of the listeners set the abort flag on the event.
-// Returns false if any listener set the event's abort flag, true otherwise.
-//
-// Invokes all pre-submit listeners, then all submit listeners, then all post-submit listeners.
+// Submits a form programatically.
 // 
 
 FormEventManager.prototype.submit = function()
 {
+	if (this.onsubmit_handler())
+	{
+	  this.form.onsubmit = null;
+	  this.form.submit();
+	}
+}
+
+// onsubmit_handler()
+//
+// The handler for the form's onsubmit event.  Invokes the presubmit, submit
+// and postsubmit handlers and returns false if any handler sets the
+// event's abort flag.  Otherwise, sets the form's submitmode to "submit"
+// and return true.
+// 
+
+FormEventManager.prototype.onsubmit_handler = function()
+{
 	var event = new FormSubmitEvent(this.form, "submit", this.invalid_field_handler);
 
     this.invoke_handlers("presubmit", event);
@@ -354,13 +367,12 @@
   this.add_handler("reset", handler);
 }
 
-// reset()
+// onreset_handler()
 //
-// Intended as an onreset event handler for a form.  Returns
-// true normally, or false if the event's abort flag was
-// set by a listener.
+// Handles a reset by invoking any "reset" handlers (which are rare).
+// Returns true, unless a handler sets the event.abort flag.
 
-FormEventManager.prototype.reset = function()
+FormEventManager.prototype.onreset_handler = function()
 {
   var event = new FormSubmitEvent(this.form, "reset", this.invalid_field_handler);
   

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormMessages.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormMessages.java?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormMessages.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormMessages.java Wed Aug 31 10:08:04 2005
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.form;
 
+import org.apache.hivemind.HiveMind;
 import org.apache.hivemind.impl.MessageFormatter;
 import org.apache.tapestry.IComponent;
 
@@ -61,5 +62,11 @@
     static String fieldAlreadyPrerendered(IComponent field)
     {
         return _formatter.format("field-already-prerenderer", field);
+    }
+
+    static String linkSubmitMayNotNest(IComponent inner, IComponent outer)
+    {
+        return _formatter.format("link-submit-may-not-nest", inner.getExtendedId(), outer
+                .getExtendedId(), HiveMind.getLocationString(outer));
     }
 }

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormStrings.properties
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormStrings.properties?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormStrings.properties (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/FormStrings.properties Wed Aug 31 10:08:04 2005
@@ -17,3 +17,4 @@
 form-too-few-ids=Rewind of form {0} expected {1} more form elements, starting with id ''{2}''.
 encoding-type-contention=Components within form {0} have requested conflicting encoding types ''{1}'' and ''{2}''.
 field-already-prerendered=Field {0} has already been pre-rendered. This exception may indicate that a FieldLabel rendered, but the corresponding field did not.
+link-submit-may-not-nest=LinkSubmit {0} may not be enclosed by another LinkSubmit ({1}, at {2}).
\ No newline at end of file

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.java Wed Aug 31 10:08:04 2005
@@ -14,12 +14,17 @@
 
 package org.apache.tapestry.form;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.HiveMind;
+import org.apache.tapestry.IComponent;
 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.Tapestry;
 import org.apache.tapestry.TapestryUtils;
 
 /**
@@ -39,24 +44,15 @@
 
     public static final String ATTRIBUTE_NAME = "org.apache.tapestry.form.LinkSubmit";
 
-    /**
-     * The name of an {@link org.apache.tapestry.IRequestCycle}attribute in which the link submit
-     * component that generates the javascript function is stored. The function is only required
-     * once per page (containing a form with a non-disabled LinkSubmit)
-     */
-    public static final String ATTRIBUTE_FUNCTION_NAME = "org.apache.tapestry.form.LinkSubmit_function";
-
     protected boolean isClicked(IRequestCycle cycle, String name)
     {
-        // How to know which Submit link was actually
-        // clicked? When submitted, it sets its elementId into a hidden field
-        String value = cycle.getParameter("_linkSubmit");
-
-        // If the value isn't the elementId of this component, then this link wasn't
-        // selected.
-        return value != null && value.equals(name);
+        String value = cycle.getParameter(name);
+
+        return HiveMind.isNonBlank(value);
     }
 
+    public abstract IScript getScript();
+
     /**
      * @see org.apache.tapestry.form.AbstractFormComponent#renderFormComponent(org.apache.tapestry.IMarkupWriter,
      *      org.apache.tapestry.IRequestCycle)
@@ -65,59 +61,42 @@
     {
         boolean disabled = isDisabled();
 
-        IMarkupWriter wrappedWriter;
+        IForm form = getForm();
+        String name = getName();
+
+        String hiddenId = cycle.getUniqueId(TapestryUtils
+                .convertTapestryIdToNMToken(getIdParameter()));
+
+        // Store for later access by the FieldLabel (or JavaScript).
+
+        setClientId(hiddenId);
+
+        // Add a hidden field used to identify the link that caused the submission.
+        // Client-side JavaScript will set the value to non-null when the link is clicked,
+        // then force the form to submit.
+
+        form.addHiddenValue(name, hiddenId, "");
 
         if (!disabled)
         {
             PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(cycle, this);
 
-            // make sure the submit function is on the page (once)
-            if (cycle.getAttribute(ATTRIBUTE_FUNCTION_NAME) == null)
-            {
-                pageRenderSupport
-                        .addBodyScript("function submitLink(form, elementId) { form._linkSubmit.value = elementId; if (form.onsubmit == null || form.onsubmit()) form.submit(); }");
-                cycle.setAttribute(ATTRIBUTE_FUNCTION_NAME, this);
-            }
-
-            IForm form = getForm();
-            String formName = form.getName();
-
-            // one hidden field per form:
-            String formHiddenFieldAttributeName = ATTRIBUTE_FUNCTION_NAME + formName;
-            if (cycle.getAttribute(formHiddenFieldAttributeName) == null)
-            {
-                writer.beginEmpty("input");
-                writer.attribute("type", "hidden");
-                writer.attribute("name", "_linkSubmit");
-                cycle.setAttribute(formHiddenFieldAttributeName, this);
-            }
+            Map symbols = new HashMap();
+            symbols.put("form", form);
+            symbols.put("hiddenId", hiddenId);
+
+            getScript().execute(cycle, pageRenderSupport, symbols);
 
             writer.begin("a");
-            renderIdAttribute(writer, cycle);
-            writer.attribute("href", "javascript:submitLink(Tapestry.find('" + formName + "', '"
-                    + getName() + "');");
-
-            // Allow the wrapped components a chance to render.
-            // Along the way, they may interact with this component
-            // and cause the name variable to get set.
-            wrappedWriter = writer.getNestedWriter();
+            writer.attribute("href", (String) symbols.get("href"));
+            renderInformalParameters(writer, cycle);
         }
-        else
-            wrappedWriter = writer;
 
-        renderBody(wrappedWriter, cycle);
+        renderBody(writer, cycle);
 
         if (!disabled)
-        {
-            // Generate additional attributes from informal parameters.
-            renderInformalParameters(writer, cycle);
-
-            // Dump in HTML provided by wrapped components
-            wrappedWriter.close();
-
-            // Close the <a> tag
             writer.end();
-        }
+
     }
 
     /**
@@ -125,9 +104,11 @@
      */
     protected void prepareForRender(IRequestCycle cycle)
     {
-        if (cycle.getAttribute(ATTRIBUTE_NAME) != null)
-            throw new ApplicationRuntimeException(Tapestry.getMessage("LinkSubmit.may-not-nest"),
-                    this, null, null);
+        IComponent outer = (IComponent) cycle.getAttribute(ATTRIBUTE_NAME);
+
+        if (outer != null)
+            throw new ApplicationRuntimeException(FormMessages.linkSubmitMayNotNest(this, outer),
+                    this, getLocation(), null);
 
         cycle.setAttribute(ATTRIBUTE_NAME, this);
     }
@@ -138,5 +119,13 @@
     protected void cleanupAfterRender(IRequestCycle cycle)
     {
         cycle.removeAttribute(ATTRIBUTE_NAME);
+    }
+
+    /**
+     * Links can not take focus.
+     */
+    protected boolean getCanTakeFocus()
+    {
+        return false;
     }
 }

Modified: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.jwc
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.jwc?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.jwc (original)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.jwc Wed Aug 31 10:08:04 2005
@@ -53,5 +53,6 @@
   <reserved-parameter name="href"/>
   
   <inject property="listenerInvoker" object="infrastructure:listenerInvoker"/>
+  <inject property="script" type="script" object="LinkSubmit.script"/>
   
 </component-specification>

Added: jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script?rev=265533&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script (added)
+++ jakarta/tapestry/trunk/framework/src/java/org/apache/tapestry/form/LinkSubmit.script Wed Aug 31 10:08:04 2005
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!-- 
+   Copyright 2005 The Apache Software Foundation
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+<!DOCTYPE script PUBLIC
+	"-//Apache Software Foundation//Tapestry Script Specification 3.0//EN"
+	"http://jakarta.apache.org/tapestry/dtd/Script_3_0.dtd">
+<script>
+
+<input-symbol key="hiddenId" class="java.lang.String" required="yes"/>
+<input-symbol key="form" class="org.apache.tapestry.IForm" required="yes"/>
+
+<let key="functionName" unique="yes">
+  onclick_${hiddenId}
+</let>
+
+<let key="href">
+  javascript:${functionName}();
+</let>
+
+<body>
+function ${functionName}()
+{
+  var form = Tapestry.find('${form.name}');
+  
+  if (form.events.onsubmit_handler())
+  {
+    Tapestry.find('${hiddenId}').value = "T";
+    form.onsubmit = null;
+    form.submit();
+  }
+}
+
+</body>
+
+</script>
\ No newline at end of file

Modified: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/BaseComponentTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/BaseComponentTestCase.java?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/BaseComponentTestCase.java (original)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/components/BaseComponentTestCase.java Wed Aug 31 10:08:04 2005
@@ -21,10 +21,13 @@
 import org.apache.hivemind.test.HiveMindTestCase;
 import org.apache.tapestry.IBinding;
 import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IForm;
 import org.apache.tapestry.IMarkupWriter;
 import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRender;
 import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.PageRenderSupport;
+import org.apache.tapestry.TapestryUtils;
 import org.apache.tapestry.markup.AsciiMarkupFilter;
 import org.apache.tapestry.markup.MarkupWriterImpl;
 import org.apache.tapestry.spec.IComponentSpecification;
@@ -201,11 +204,16 @@
 
     protected IPage newPage(String name)
     {
+        return newPage(name, 1);
+    }
+
+    protected IPage newPage(String name, int count)
+    {
         MockControl control = newControl(IPage.class);
         IPage page = (IPage) control.getMock();
 
         page.getPageName();
-        control.setReturnValue(name);
+        control.setReturnValue(name, count);
 
         return page;
     }
@@ -215,6 +223,65 @@
     {
         cycle.getAttribute(key);
         cyclec.setReturnValue(value);
+    }
+
+    protected IForm newForm()
+    {
+        return (IForm) newMock(IForm.class);
+    }
+
+    protected IRender newBody()
+    {
+        return new IRender()
+        {
+            public void render(IMarkupWriter writer, IRequestCycle cycle)
+            {
+                writer.print("BODY");
+            }
+        };
+    }
+
+    protected PageRenderSupport newPageRenderSupport()
+    {
+        return (PageRenderSupport) newMock(PageRenderSupport.class);
+    }
+
+    protected void trainGetSupport(IRequestCycle cycle, PageRenderSupport support)
+    {
+        trainGetAttribute(cycle, TapestryUtils.PAGE_RENDER_SUPPORT_ATTRIBUTE, support);
+    }
+
+    protected void trainGetAttribute(IRequestCycle cycle, String attributeName, Object attribute)
+    {
+        MockControl control = getControl(cycle);
+    
+        cycle.getAttribute(attributeName);
+    
+        control.setReturnValue(attribute);
+    }
+
+    protected void trainGetUniqueId(IRequestCycle cycle, String id, String uniqueId)
+    {
+        MockControl control = getControl(cycle);
+    
+        cycle.getUniqueId(id);
+        control.setReturnValue(uniqueId);
+    }
+
+    protected void trainGetIdPath(IComponent component, String idPath)
+    {
+        MockControl control = getControl(component);
+    
+        component.getIdPath();
+        control.setReturnValue(idPath);
+    }
+
+    protected void trainGetParameter(IRequestCycle cycle, String name, String value)
+    {
+        MockControl control = getControl(cycle);
+    
+        cycle.getParameter(name);
+        control.setReturnValue(value);
     }
 
 }

Added: jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java?rev=265533&view=auto
==============================================================================
--- jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java (added)
+++ jakarta/tapestry/trunk/framework/src/test/org/apache/tapestry/form/TestLinkSubmit.java Wed Aug 31 10:08:04 2005
@@ -0,0 +1,207 @@
+// Copyright 2005 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.form;
+
+import java.util.Map;
+
+import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.Location;
+import org.apache.hivemind.Resource;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IForm;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IPage;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.IScript;
+import org.apache.tapestry.IScriptProcessor;
+import org.apache.tapestry.PageRenderSupport;
+import org.apache.tapestry.components.BaseComponentTestCase;
+
+/**
+ * Tests for {@link org.apache.tapestry.form.LinkSubmit}
+ * 
+ * @author Howard Lewis Ship
+ * @since 4.0
+ */
+public class TestLinkSubmit extends BaseComponentTestCase
+{
+    private class ScriptFixture implements IScript
+    {
+
+        public void execute(IRequestCycle cycle, IScriptProcessor processor, Map symbols)
+        {
+            assertNotNull(cycle);
+            assertNotNull(processor);
+            assertNotNull(symbols);
+
+            symbols.put("href", "HREF");
+        }
+
+        public Resource getScriptResource()
+        {
+            return null;
+        }
+
+    }
+
+    public void testRenderNormal()
+    {
+        IMarkupWriter writer = newBufferWriter();
+        IRequestCycle cycle = newCycle();
+        IScript script = new ScriptFixture();
+        PageRenderSupport support = newPageRenderSupport();
+
+        IForm form = newForm();
+
+        LinkSubmit linkSubmit = (LinkSubmit) newInstance(LinkSubmit.class, new Object[]
+        { "form", form, "name", "fred_1", "script", script, "idParameter", "fred_id" });
+        linkSubmit.addBody(newBody());
+
+        trainGetUniqueId(cycle, "fred_id", "fred_id_unique");
+
+        form.addHiddenValue("fred_1", "fred_id_unique", "");
+
+        trainGetSupport(cycle, support);
+
+        replayControls();
+
+        linkSubmit.renderFormComponent(writer, cycle);
+
+        verifyControls();
+
+        assertBuffer("<a href=\"HREF\">BODY</a>");
+    }
+
+    public void testRenderDisabled()
+    {
+        IMarkupWriter writer = newBufferWriter();
+        IRequestCycle cycle = newCycle();
+
+        IForm form = newForm();
+
+        LinkSubmit linkSubmit = (LinkSubmit) newInstance(LinkSubmit.class, new Object[]
+        { "disabled", Boolean.TRUE, "form", form, "name", "fred_1", "idParameter", "fred_id" });
+        linkSubmit.addBody(newBody());
+
+        trainGetUniqueId(cycle, "fred_id", "fred_id_unique");
+
+        form.addHiddenValue("fred_1", "fred_id_unique", "");
+
+        replayControls();
+
+        linkSubmit.renderFormComponent(writer, cycle);
+
+        verifyControls();
+
+        assertBuffer("BODY");
+    }
+
+    public void testPrepareNormal()
+    {
+        IRequestCycle cycle = newCycle();
+
+        trainGetAttribute(cycle, LinkSubmit.ATTRIBUTE_NAME, null);
+
+        LinkSubmit linkSubmit = (LinkSubmit) newInstance(LinkSubmit.class);
+
+        cycle.setAttribute(LinkSubmit.ATTRIBUTE_NAME, linkSubmit);
+
+        replayControls();
+
+        linkSubmit.prepareForRender(cycle);
+
+        verifyControls();
+    }
+
+    public void testPrepareConflict()
+    {
+        IRequestCycle cycle = newCycle();
+        IPage page = newPage("MyPage");
+        Location bloc = newLocation();
+        Location floc = newLocation();
+        IComponent existing = newComponent("MyPage/barney", bloc);
+
+        trainGetAttribute(cycle, LinkSubmit.ATTRIBUTE_NAME, existing);
+
+        trainGetIdPath(page, null);
+
+        LinkSubmit linkSubmit = (LinkSubmit) newInstance(LinkSubmit.class, new Object[]
+        { "id", "fred", "page", page, "container", page, "location", floc });
+
+        replayControls();
+
+        try
+        {
+            linkSubmit.prepareForRender(cycle);
+            unreachable();
+        }
+        catch (ApplicationRuntimeException ex)
+        {
+            assertEquals(
+                    "LinkSubmit MyPage/fred may not be enclosed by another LinkSubmit (MyPage/barney, at classpath:/org/apache/tapestry/form/TestLinkSubmit, line 1).",
+                    ex.getMessage());
+            assertSame(linkSubmit, ex.getComponent());
+            assertSame(floc, ex.getLocation());
+        }
+
+        verifyControls();
+    }
+
+    public void testCleanupAfterRender()
+    {
+        IRequestCycle cycle = newCycle();
+
+        cycle.removeAttribute(LinkSubmit.ATTRIBUTE_NAME);
+
+        replayControls();
+
+        LinkSubmit linkSubmit = (LinkSubmit) newInstance(LinkSubmit.class);
+
+        linkSubmit.cleanupAfterRender(cycle);
+
+        verifyControls();
+    }
+
+    public void testIsClicked()
+    {
+        IRequestCycle cycle = newCycle();
+
+        trainGetParameter(cycle, "fred", "T");
+
+        replayControls();
+
+        LinkSubmit linkSubmit = (LinkSubmit) newInstance(LinkSubmit.class);
+
+        assertEquals(true, linkSubmit.isClicked(cycle, "fred"));
+
+        verifyControls();
+    }
+
+    public void testIsNotClicked()
+    {
+        IRequestCycle cycle = newCycle();
+
+        trainGetParameter(cycle, "fred", null);
+
+        replayControls();
+
+        LinkSubmit linkSubmit = (LinkSubmit) newInstance(LinkSubmit.class);
+
+        assertEquals(false, linkSubmit.isClicked(cycle, "fred"));
+
+        verifyControls();
+    }
+
+}

Modified: jakarta/tapestry/trunk/status.xml
URL: http://svn.apache.org/viewcvs/jakarta/tapestry/trunk/status.xml?rev=265533&r1=265532&r2=265533&view=diff
==============================================================================
--- jakarta/tapestry/trunk/status.xml (original)
+++ jakarta/tapestry/trunk/status.xml Wed Aug 31 10:08:04 2005
@@ -56,6 +56,7 @@
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-610">$bean syntax for validators: binding prefix is broken</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-609">Tapestry.set_focus() seems to be passed the form components elementId (i.e. name attribute) not clientId (i.e. id attribute), which keeps focus from being set</action>
       <action type="fix" dev="HLS" fixes-bug="TAPESTRY-478" due-to="Pierre-Yves Nicolas">Document RadioGroup component</action>
+      <action type="fix" dev="HLS" fixes-bug="TAPESTRY-613">Javascript problem with @LinkSubmit</action>
     </release>
     <release version="4.0-beta-5" date="Aug 26 2005">
       <action type="fix" dev="MB,HLS" fixes-bug="TAPESTRY-552">Improperly configured SerializableAdaptor (for DataSqueezer) prevents serialized objects from being de-serialized</action>



---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org