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);

Reply via email to