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