Author: pedro
Date: Fri Feb 18 02:02:51 2011
New Revision: 1071860

URL: http://svn.apache.org/viewvc?rev=1071860&view=rev
Log:
- preventing the submit link input name from being encoded in form action
- removing duplicated code in AbstractSubmitLink
- hidden input name changed to be root form relative
Issue: WICKET-3438

Added:
    
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java
Modified:
    
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
    
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
    
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java?rev=1071860&r1=1071859&r2=1071860&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/AbstractSubmitLink.java
 Fri Feb 18 02:02:51 2011
@@ -16,11 +16,8 @@
  */
 package org.apache.wicket.markup.html.form;
 
-import org.apache.wicket.Component;
-import org.apache.wicket.Page;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.version.undo.Change;
 
 /**
@@ -162,28 +159,6 @@ public abstract class AbstractSubmitLink
         */
        public String getInputName()
        {
-               // TODO: This is a copy & paste from the FormComponent class.
-               String id = getId();
-               final PrependingStringBuffer inputName = new 
PrependingStringBuffer(id.length());
-               Component c = this;
-               while (true)
-               {
-                       inputName.prepend(id);
-                       c = c.getParent();
-                       if (c == null || (c instanceof Form && 
((Form<?>)c).isRootForm()) || c instanceof Page)
-                       {
-                               break;
-                       }
-                       inputName.prepend(Component.PATH_SEPARATOR);
-                       id = c.getId();
-               }
-
-               // having input name "submit" causes problems with javascript, 
so we
-               // create a unique string to replace it by prepending a path 
separator
-               if (inputName.equals("submit"))
-               {
-                       inputName.prepend(Component.PATH_SEPARATOR);
-               }
-               return inputName.toString();
+               return Form.getRootFormRelativeId(this);
        }
 }

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java?rev=1071860&r1=1071859&r2=1071860&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/Form.java
 Fri Feb 18 02:02:51 2011
@@ -56,6 +56,7 @@ import org.apache.wicket.request.target.
 import org.apache.wicket.settings.IApplicationSettings;
 import org.apache.wicket.util.lang.Bytes;
 import org.apache.wicket.util.string.AppendingStringBuffer;
+import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.string.interpolator.MapVariableInterpolator;
 import org.apache.wicket.util.upload.FileUploadBase.SizeLimitExceededException;
@@ -977,6 +978,11 @@ public class Form<T> extends WebMarkupCo
                                }
                        });
                        parameters.remove(getHiddenFieldId());
+                       if (submittingComponent instanceof AbstractSubmitLink)
+                       {
+                               AbstractSubmitLink submitLink = 
(AbstractSubmitLink)submittingComponent;
+                               parameters.remove(submitLink.getInputName());
+                       }
                }
        }
 
@@ -1596,7 +1602,7 @@ public class Form<T> extends WebMarkupCo
                }
                else
                {
-                       formId = getId();
+                       formId = Form.getRootFormRelativeId(this);
                }
                return getInputNamePrefix() + formId + "_hf_0";
        }
@@ -2420,4 +2426,41 @@ public class Form<T> extends WebMarkupCo
                        "if (typeof(Wicket)=='undefined') { Wicket={}; } if 
(typeof(Wicket.Forms)=='undefined') { Wicket.Forms={}; }",
                        Form.class.getName());
        }
+
+       /**
+        * Utility method to assemble an id to distinct form components from 
diferent nesting levels.
+        * Useful to generate input names attributes.
+        * 
+        * @param component
+        * @return form relative identification string
+        */
+       public static String getRootFormRelativeId(Component component)
+       {
+               String id = component.getId();
+               final PrependingStringBuffer inputName = new 
PrependingStringBuffer(id.length());
+               Component c = component;
+               while (true)
+               {
+                       inputName.prepend(id);
+                       c = c.getParent();
+                       if (c == null || (c instanceof Form<?> && 
((Form<?>)c).isRootForm()) ||
+                               c instanceof Page)
+                       {
+                               break;
+                       }
+                       inputName.prepend(Component.PATH_SEPARATOR);
+                       id = c.getId();
+               }
+
+               /*
+                * having input name "submit" causes problems with JavaScript, 
so we create a unique string
+                * to replace it by prepending a path separator, as this 
identification can be assigned to
+                * an submit form component name
+                */
+               if (inputName.equals("submit"))
+               {
+                       inputName.prepend(Component.PATH_SEPARATOR);
+               }
+               return inputName.toString();
+       }
 }

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java?rev=1071860&r1=1071859&r2=1071860&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
 Fri Feb 18 02:02:51 2011
@@ -33,7 +33,6 @@ import org.apache.wicket.Component;
 import org.apache.wicket.IConverterLocator;
 import org.apache.wicket.Localizer;
 import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
@@ -41,7 +40,6 @@ import org.apache.wicket.model.IProperty
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.lang.Classes;
-import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.util.string.StringList;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.string.interpolator.MapVariableInterpolator;
@@ -798,38 +796,16 @@ public abstract class FormComponent<T> e
         */
        public String getInputName()
        {
-               // TODO: keep this in sync with AbstractSubmitLink#getInputName
-               String id = getId();
-               final PrependingStringBuffer inputName = new 
PrependingStringBuffer(id.length());
-               Component c = this;
-               while (true)
-               {
-                       inputName.prepend(id);
-                       c = c.getParent();
-                       if (c == null || (c instanceof Form<?> && 
((Form<?>)c).isRootForm()) ||
-                               c instanceof Page)
-                       {
-                               break;
-                       }
-                       inputName.prepend(Component.PATH_SEPARATOR);
-                       id = c.getId();
-               }
-
-               // having input name "submit" causes problems with javascript, 
so we
-               // create a unique string to replace it by prepending a path 
separator
-               if (inputName.equals("submit"))
-               {
-                       inputName.prepend(Component.PATH_SEPARATOR);
-               }
+               final String inputName = Form.getRootFormRelativeId(this);
                Form<?> form = findParent(Form.class);
 
                if (form != null)
                {
-                       return form.getInputNamePrefix() + inputName.toString();
+                       return form.getInputNamePrefix() + inputName;
                }
                else
                {
-                       return inputName.toString();
+                       return inputName;
                }
        }
 

Added: 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java?rev=1071860&view=auto
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java
 (added)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/stateless/StatelessFormUrlTest.java
 Fri Feb 18 02:02:51 2011
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.wicket.stateless;
+
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.StatelessForm;
+import org.apache.wicket.markup.html.form.SubmitLink;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+
+/**
+ * @author Pedro Santos
+ */
+public class StatelessFormUrlTest extends WicketTestCase
+{
+       /**
+        * Preventing WICKET-3438
+        */
+       public void testSubmitLinkInputNameNotEncodedIntoFormAction()
+       {
+               tester.startPage(TestPage.class);
+               tester.clickLink("form:submitLink");
+               
assertFalse(tester.getServletResponse().getDocument().contains("submitLink=x"));
+       }
+
+       /**
+        */
+       public static class TestPage extends WebPage implements 
IMarkupResourceStreamProvider
+       {
+
+               /**
+                * @param pageParameters
+                */
+               public TestPage(PageParameters pageParameters)
+               {
+                       super(pageParameters);
+                       StatelessForm<Void> form = new 
StatelessForm<Void>("form");
+                       add(form);
+                       SubmitLink submitLink = new SubmitLink("submitLink");
+                       form.add(submitLink);
+               }
+
+               public IResourceStream getMarkupResourceStream(MarkupContainer 
container,
+                       Class<?> containerClass)
+               {
+                       return new StringResourceStream(
+                               "<html><body><form wicket:id=\"form\"><a 
wicket:id=\"submitLink\"></a></form></body></html>");
+               }
+
+       }
+}


Reply via email to