This is an automated email from the ASF dual-hosted git repository. svenmeier pushed a commit to branch WICKET-6807_js_submitter_always_via_hidden_field in repository https://gitbox.apache.org/repos/asf/wicket.git
commit b6dfed19bb1a6cdad65b528ce707fd8eb62e4b6a Author: Sven Meier <[email protected]> AuthorDate: Thu Aug 6 21:29:53 2020 +0200 WICKET-6807 find submitter according to form's method only --- .../org/apache/wicket/markup/html/form/Form.java | 92 ++++++++++++++++------ .../wicket/markup/html/form/FormComponent.java | 32 +------- .../wicket/stateless/StatelessFormUrlTest.java | 14 +++- 3 files changed, 78 insertions(+), 60 deletions(-) diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java index 35be666..3116c1c 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java @@ -50,8 +50,10 @@ import org.apache.wicket.model.Model; import org.apache.wicket.protocol.http.servlet.MultipartServletWebRequest; import org.apache.wicket.protocol.http.servlet.ServletWebRequest; import org.apache.wicket.request.IRequestParameters; +import org.apache.wicket.request.Request; import org.apache.wicket.request.Response; import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.request.parameter.EmptyRequestParameters; import org.apache.wicket.util.encoding.UrlDecoder; import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.lang.Bytes; @@ -447,6 +449,8 @@ public class Form<T> extends WebMarkupContainer */ public final IFormSubmittingComponent findSubmitter() { + final IRequestParameters parameters = getRequestParameters(this); + IFormSubmittingComponent submittingComponent = getPage().visitChildren( IFormSubmittingComponent.class, new IVisitor<Component, IFormSubmittingComponent>() { @@ -462,7 +466,6 @@ public class Form<T> extends WebMarkupContainer if ((form != null) && (form.getRootForm() == Form.this)) { String name = submittingComponent.getInputName(); - IRequestParameters parameters = getRequest().getRequestParameters(); if ((!parameters.getParameterValue(name).isNull()) || !parameters.getParameterValue(name + ".x").isNull()) { @@ -581,20 +584,11 @@ public class Form<T> extends WebMarkupContainer AppendingStringBuffer buffer = new AppendingStringBuffer(); buffer.append(String.format("var f = document.getElementById('%s');", root.getMarkupId())); - if (root.encodeUrlInHiddenFields()) - { - buffer.append(String.format("document.getElementById('%s').innerHTML += '", - root.getHiddenFieldsId(HIDDEN_FIELDS_PARAMS_IDX))); - - writeParamsAsHiddenFields(new String[] {param}, buffer); - - buffer.append("';"); - } - else - { - String action = root.getActionUrl().toString(); - buffer.append("f.action += '" + (action.indexOf('?') > -1 ? '&' : '?') + param + "';"); - } + buffer.append(String.format("document.getElementById('%s').innerHTML += '", + root.getHiddenFieldsId(HIDDEN_FIELDS_PARAMS_IDX))); + writeParamsAsHiddenFields(new String[] {param}, buffer); + buffer.append("';"); + if (triggerEvent) { buffer.append("Wicket.Event.fire(f, 'submit');"); @@ -1717,9 +1711,15 @@ public class Form<T> extends WebMarkupContainer } /** - * Should URL query parameters be encoded in hidden fields. + * Should URL query parameters be encoded in hidden fields, by default <code>true</code> + * for {@link #METHOD_GET} only. + * <p> + * In that case, the parameters must <em>not</em> be written as query parameters, as the browser + * would strip them from the action url before appending the form values. * * @return true if form's method is 'get' + * + * @see #getMethod() */ protected boolean encodeUrlInHiddenFields() { @@ -1764,14 +1764,12 @@ public class Form<T> extends WebMarkupContainer */ public final void writeHiddenFields() { - // if it's a get, did put the parameters in the action attribute, - // and have to write the url parameters as hidden fields + getResponse().write(String.format("<div id=\"%s\" hidden=\"\" class=\"%s\">", + getHiddenFieldsId(HIDDEN_FIELDS_PARAMS_IDX), + getString(HIDDEN_FIELDS_CSS_CLASS_KEY))); + // if the parameters are not in the action attribute, they have to be written as hidden fields if (encodeUrlInHiddenFields()) { - getResponse().write(String.format("<div id=\"%s\" hidden=\"\" class=\"%s\">", - getHiddenFieldsId(HIDDEN_FIELDS_PARAMS_IDX), - getString(HIDDEN_FIELDS_CSS_CLASS_KEY))); - AppendingStringBuffer buffer = new AppendingStringBuffer(); String url = getActionUrl().toString(); @@ -1782,10 +1780,9 @@ public class Form<T> extends WebMarkupContainer writeParamsAsHiddenFields(params, buffer); getResponse().write(buffer); - - getResponse().write("</div>"); } - + getResponse().write("</div>"); + // if a default submitting component was set, handle the rendering of that if (hasDefaultSubmittingComponent()) { @@ -2186,6 +2183,51 @@ public class Form<T> extends WebMarkupContainer } /** + * Get the request parameters for a form submit, + * according to the request's method or the form's method as fallback. + * + * @param component any component inside the form or the form itself + * @return parameters + */ + static IRequestParameters getRequestParameters(Component component) { + String method = Form.METHOD_POST; + final Request request = component.getRequest(); + if (request.getContainerRequest() instanceof HttpServletRequest) + { + method = ((HttpServletRequest)request.getContainerRequest()).getMethod(); + } + else + { + final Form<?> form; + if (component instanceof Form) { + form = (Form<?>)component; + } else { + form = component.findParent(Form.class); + } + + if (form != null) + { + method = form.getMethod(); + } + } + + final IRequestParameters parameters; + switch (method.toLowerCase(Locale.ROOT)) + { + case Form.METHOD_POST: + parameters = request.getPostParameters(); + break; + case Form.METHOD_GET: + parameters = request.getQueryParameters(); + break; + default: + parameters = EmptyRequestParameters.INSTANCE; + } + + return parameters; + } + + /** * Response when a submission method mismatch is detected * * @see Form#getMethod() diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java index 9c283d7..6ba10e9 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java @@ -31,8 +31,6 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import javax.servlet.http.HttpServletRequest; - import org.apache.wicket.Application; import org.apache.wicket.Component; import org.apache.wicket.IConverterLocator; @@ -49,8 +47,6 @@ import org.apache.wicket.model.IObjectClassAwareModel; import org.apache.wicket.model.IPropertyReflectionAwareModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.IRequestParameters; -import org.apache.wicket.request.Request; -import org.apache.wicket.request.parameter.EmptyRequestParameters; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.util.lang.Args; @@ -798,33 +794,7 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme */ protected List<StringValue> getParameterValues(String inputName) { - String method = Form.METHOD_POST; - final Request request = getRequest(); - if (getRequest().getContainerRequest() instanceof HttpServletRequest) - { - method = ((HttpServletRequest)getRequest().getContainerRequest()).getMethod(); - } - else - { - final Form<?> form = findParent(Form.class); - if (form != null) - { - method = form.getMethod(); - } - } - - final IRequestParameters parameters; - switch (method.toLowerCase(Locale.ROOT)) - { - case Form.METHOD_POST: - parameters = request.getPostParameters(); - break; - case Form.METHOD_GET: - parameters = request.getQueryParameters(); - break; - default: - parameters = EmptyRequestParameters.INSTANCE; - } + final IRequestParameters parameters = Form.getRequestParameters(this); return parameters.getParameterValues(inputName); } diff --git a/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java b/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java index ef30976..73d79e3 100644 --- a/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java @@ -17,7 +17,7 @@ package org.apache.wicket.stateless; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.wicket.MarkupContainer; import org.apache.wicket.Page; @@ -58,7 +58,10 @@ class StatelessFormUrlTest extends WicketTestCase @Test void submitLinkInputNameNotEncodedIntoFormAction() { - tester.executeUrl("?0-1.IFormSubmitListener-form&text=newValue&submitLink=x"); + tester.getRequest().getPostParameters().setParameterValue("text", "newValue"); + tester.getRequest().getPostParameters().setParameterValue("submitLink", "x"); + tester.executeUrl("?0-1.-form"); + assertEquals("newValue", tester.getTagById("text3").getAttribute("value")); assertEquals("./?-1.-form", tester.getTagById("form1").getAttribute("action")); } @@ -68,8 +71,10 @@ class StatelessFormUrlTest extends WicketTestCase @Test void formComponentNameNotEncodedIntoFormAction() { - tester.executeUrl("?0-1.IFormSubmitListener-form&text=newValue"); - assertFalse(tester.getLastResponseAsString().contains("text=newValue")); + tester.getRequest().getPostParameters().setParameterValue("text", "newValue"); + tester.executeUrl("?0-1.-form"); + assertEquals("newValue", tester.getTagById("text3").getAttribute("value")); + assertEquals("./?-1.-form", tester.getTagById("form1").getAttribute("action")); } /** */ @@ -87,6 +92,7 @@ class StatelessFormUrlTest extends WicketTestCase StatelessForm<Void> form = new StatelessForm<>("form"); add(form); TextField<String> textField = new TextField<>("text", Model.of("textValue")); + textField.setOutputMarkupId(true); form.add(textField); SubmitLink submitLink = new SubmitLink("submitLink"); form.add(submitLink);
