Repository: wicket
Updated Branches:
  refs/heads/master 2f04133d6 -> 0374c0405


WICKET-5759 AjaxRequestAttributes extra parameters aren't properly handled in 
getCallbackFunction()

(cherry picked from commit 18667ac778a96dcd85f03936c094d1fad2884424)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/0374c040
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0374c040
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0374c040

Branch: refs/heads/master
Commit: 0374c040577410ab76cfd37a1ff0f79f74bca368
Parents: 2f04133
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Tue Nov 18 11:23:21 2014 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Tue Nov 18 11:33:24 2014 +0200

----------------------------------------------------------------------
 .../ajax/AbstractDefaultAjaxBehavior.java       |  34 +++--
 .../ajax/AbstractDefaultAjaxBehaviorTest.java   |  30 +++--
 .../wicket/ajax/AjaxCallbackFunctionTest.java   | 135 ++++++++++++++++---
 .../apache/wicket/ajax/AjaxCallbackPage.java    |  33 ++++-
 4 files changed, 179 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0374c040/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
index a309635..bc0989d 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
@@ -504,30 +504,28 @@ public abstract class AbstractDefaultAjaxBehavior extends 
AbstractAjaxBehavior
                sb.append("var attrs = ");
                sb.append(attrsJson);
                sb.append(";\n");
-               sb.append("var params = {");
-               boolean first = true;
+               JSONArray jsonArray = new JSONArray();
                for (CallbackParameter curExtraParameter : extraParameters)
                {
                        if (curExtraParameter.getAjaxParameterName() != null)
                        {
-                               if (!first)
-                                       sb.append(',');
-                               else
-                                       first = false;
-                               
sb.append('\'').append(curExtraParameter.getAjaxParameterName()).append("': ")
-                                       
.append(curExtraParameter.getAjaxParameterCode());
+                               try
+                               {
+                                       JSONObject object = new JSONObject();
+                                       object.put("name", 
curExtraParameter.getAjaxParameterName());
+                                       object.put("value", new 
JsonFunction(curExtraParameter.getAjaxParameterCode()));
+                                       jsonArray.put(object);
+                               }
+                               catch (JSONException e)
+                               {
+                                       throw new WicketRuntimeException(e);
+                               }
                        }
                }
-               sb.append("};\n");
-               if (attributes.getExtraParameters().isEmpty())
-               {
-                       
sb.append("attrs.").append(AjaxAttributeName.EXTRA_PARAMETERS).append(" = 
params;\n");
-               }
-               else
-               {
-                       
sb.append("attrs.").append(AjaxAttributeName.EXTRA_PARAMETERS).append(" = 
Wicket.merge(attrs.")
-                                       
.append(AjaxAttributeName.EXTRA_PARAMETERS).append(", params);\n");
-               }
+               sb.append("var params = ").append(jsonArray).append(";\n");
+               sb.append("attrs.").append(AjaxAttributeName.EXTRA_PARAMETERS)
+                               .append(" = params.concat(attrs.")
+                               
.append(AjaxAttributeName.EXTRA_PARAMETERS).append(");\n");
                sb.append("Wicket.Ajax.ajax(attrs);\n");
                return sb;
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/0374c040/wicket-core/src/test/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehaviorTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehaviorTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehaviorTest.java
index 8da123e..539b495 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehaviorTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehaviorTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.ajax;
 
+import java.util.Locale;
+
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.attributes.AjaxAttributeName;
 import org.apache.wicket.ajax.attributes.AjaxCallListener;
@@ -38,6 +40,8 @@ public class AbstractDefaultAjaxBehaviorTest extends Assert
        public void renderAjaxAttributes()
        {
                AjaxRequestAttributes attributes = new AjaxRequestAttributes();
+               attributes.getExtraParameters().put("param1", 123);
+               attributes.getExtraParameters().put("param2", 
Locale.CANADA_FRENCH);
 
                AjaxCallListener listener = new AjaxCallListener();
                listener.onPrecondition("return somePrecondition();");
@@ -66,16 +70,22 @@ public class AbstractDefaultAjaxBehaviorTest extends Assert
 
                CharSequence json = behavior.renderAjaxAttributes(component, 
attributes);
 
-               String expected =
-               "{" +
-                       "\""+AjaxAttributeName.URL+"\":\"some/url\"," +
-                       
"\""+AjaxAttributeName.BEFORE_HANDLER+"\":[function(attrs){alert('Before!');}],"
 +
-                       
"\""+AjaxAttributeName.AFTER_HANDLER+"\":[function(attrs){alert('After!');}]," +
-                       
"\""+AjaxAttributeName.SUCCESS_HANDLER+"\":[function(attrs, jqXHR, data, 
textStatus){alert('Success!');}]," +
-                       
"\""+AjaxAttributeName.FAILURE_HANDLER+"\":[function(attrs, jqXHR, 
errorMessage, textStatus){alert('Failure!');}]," +
-                       
"\""+AjaxAttributeName.COMPLETE_HANDLER+"\":[function(attrs, jqXHR, 
textStatus){alert('Complete!');}]," +
-                       
"\""+AjaxAttributeName.PRECONDITION+"\":[function(attrs){return 
somePrecondition();}]" +
-               "}";
+               String expected = "{\"" +
+                       AjaxAttributeName.URL + "\":\"some/url\",\"" +
+                       AjaxAttributeName.BEFORE_HANDLER +
+                               "\":[function(attrs){alert('Before!');}],\"" +
+                       AjaxAttributeName.AFTER_HANDLER + 
"\":[function(attrs){alert('After!');}],\"" +
+                       AjaxAttributeName.SUCCESS_HANDLER +
+                               "\":[function(attrs, jqXHR, data, 
textStatus){alert('Success!');}],\"" +
+                       AjaxAttributeName.FAILURE_HANDLER +
+                               "\":[function(attrs, jqXHR, errorMessage, 
textStatus){alert('Failure!');}],\"" +
+                       AjaxAttributeName.COMPLETE_HANDLER +
+                               "\":[function(attrs, jqXHR, 
textStatus){alert('Complete!');}],\"" +
+                       AjaxAttributeName.PRECONDITION +
+                               "\":[function(attrs){return 
somePrecondition();}],\"" +
+                       AjaxAttributeName.EXTRA_PARAMETERS +
+                       
"\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"fr_CA\"}]"
 +
+                       "}";
 
                assertEquals(expected, json);
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/0374c040/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackFunctionTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackFunctionTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackFunctionTest.java
index 430821b..5e4f824 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackFunctionTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackFunctionTest.java
@@ -34,11 +34,21 @@ public class AjaxCallbackFunctionTest extends WicketTestCase
                assertEquals(//
                        "function () {\n" //
                                + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.0-\"};\n"
 //
-                               + "var params = {};\n" //
-                               + "attrs.ep = params;\n" //
+                               + "var params = [];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
                                + "Wicket.Ajax.ajax(attrs);\n" //
                                + "}\n", //
-                       page.getBehavior().getCallbackFunction().toString());
+                       page.getBehavior1().getCallbackFunction().toString());
+
+               assertEquals(//
+                       "function () {\n" //
+                               + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.1-\","
 //
+                               + 
"\"ep\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"zh_CN\"}]};\n"
 //
+                               + "var params = [];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
+                               + "Wicket.Ajax.ajax(attrs);\n" //
+                               + "}\n", //
+                       page.getBehavior2().getCallbackFunction().toString());
        }
 
        @Test
@@ -48,11 +58,21 @@ public class AjaxCallbackFunctionTest extends WicketTestCase
                assertEquals(//
                        "function (context) {\n" //
                                + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.0-\"};\n"
 //
-                               + "var params = {};\n" //
-                               + "attrs.ep = params;\n" //
+                               + "var params = [];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
                                + "Wicket.Ajax.ajax(attrs);\n" //
                                + "}\n", //
-                       
page.getBehavior().getCallbackFunction(context("context")).toString());
+                       
page.getBehavior1().getCallbackFunction(context("context")).toString());
+
+               assertEquals(//
+                       "function (context) {\n" //
+                               + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.1-\","
 //
+                               + 
"\"ep\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"zh_CN\"}]};\n"
 //
+                               + "var params = [];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
+                               + "Wicket.Ajax.ajax(attrs);\n" //
+                               + "}\n", //
+                       
page.getBehavior2().getCallbackFunction(context("context")).toString());
        }
 
        @Test
@@ -62,11 +82,20 @@ public class AjaxCallbackFunctionTest extends WicketTestCase
                assertEquals(//
                        "function (explicit) {\n" //
                                + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.0-\"};\n"
 //
-                               + "var params = {'explicit': explicit};\n" //
-                               + "attrs.ep = params;\n" //
+                               + "var params = 
[{\"name\":\"explicit\",\"value\":explicit}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
+                               + "Wicket.Ajax.ajax(attrs);\n" //
+                               + "}\n", //
+                       
page.getBehavior1().getCallbackFunction(explicit("explicit")).toString());
+
+               assertEquals(//
+                       "function (explicit) {\n" //
+                               + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.1-\",\"ep\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"zh_CN\"}]};\n"
 //
+                               + "var params = 
[{\"name\":\"explicit\",\"value\":explicit}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
                                + "Wicket.Ajax.ajax(attrs);\n" //
                                + "}\n", //
-                       
page.getBehavior().getCallbackFunction(explicit("explicit")).toString());
+                       
page.getBehavior2().getCallbackFunction(explicit("explicit")).toString());
        }
 
        @Test
@@ -76,11 +105,23 @@ public class AjaxCallbackFunctionTest extends 
WicketTestCase
                assertEquals(//
                        "function () {\n" //
                                + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.0-\"};\n"
 //
-                               + "var params = {'resolved': 
window.location.href};\n" //
-                               + "attrs.ep = params;\n" //
+                               + "var params = 
[{\"name\":\"resolved\",\"value\":window.location.href}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
                                + "Wicket.Ajax.ajax(attrs);\n" //
                                + "}\n", //
-                       page.getBehavior()
+                       page.getBehavior1()
+                               .getCallbackFunction(resolved("resolved", 
"window.location.href"))
+                               .toString());
+
+               assertEquals(//
+                       "function () {\n" //
+                               + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.1-\","
 //
+                               + 
"\"ep\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"zh_CN\"}]};\n"
 //
+                               + "var params = 
[{\"name\":\"resolved\",\"value\":window.location.href}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
+                               + "Wicket.Ajax.ajax(attrs);\n" //
+                               + "}\n", //
+                       page.getBehavior2()
                                .getCallbackFunction(resolved("resolved", 
"window.location.href"))
                                .toString());
        }
@@ -93,11 +134,24 @@ public class AjaxCallbackFunctionTest extends 
WicketTestCase
                        //
                        "function (converted) {\n" //
                                + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.0-\"};\n"
 //
-                               + "var params = {'converted': 
converted.substring(0, 3)};\n" //
-                               + "attrs.ep = params;\n" //
+                               + "var params = 
[{\"name\":\"converted\",\"value\":converted.substring(0, 3)}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
                                + "Wicket.Ajax.ajax(attrs);\n" //
                                + "}\n", //
-                       page.getBehavior()
+                       page.getBehavior1()
+                               .getCallbackFunction(converted("converted", 
"converted.substring(0, 3)"))
+                               .toString());
+
+               assertEquals(
+                       //
+                       "function (converted) {\n" //
+                               + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.1-\","
 //
+                               + 
"\"ep\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"zh_CN\"}]};\n"
 //
+                               + "var params = 
[{\"name\":\"converted\",\"value\":converted.substring(0, 3)}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
+                               + "Wicket.Ajax.ajax(attrs);\n" //
+                               + "}\n", //
+                       page.getBehavior2()
                                .getCallbackFunction(converted("converted", 
"converted.substring(0, 3)"))
                                .toString());
        }
@@ -110,11 +164,30 @@ public class AjaxCallbackFunctionTest extends 
WicketTestCase
                        //
                        "function (context,explicit,converted) {\n" //
                                + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.0-\"};\n"
 //
-                               + "var params = {'explicit': 
explicit,'resolved': window.location.href,'converted': converted.substring(0, 
3)};\n" //
-                               + "attrs.ep = params;\n" //
+                               + "var params = 
[{\"name\":\"explicit\",\"value\":explicit},"
+                               + 
"{\"name\":\"resolved\",\"value\":window.location.href},"
+                               + 
"{\"name\":\"converted\",\"value\":converted.substring(0, 3)}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
                                + "Wicket.Ajax.ajax(attrs);\n" //
                                + "}\n", //
-                       page.getBehavior()
+                       page.getBehavior1()
+                               .getCallbackFunction(context("context"), 
explicit("explicit"),
+                                       resolved("resolved", 
"window.location.href"),
+                                       converted("converted", 
"converted.substring(0, 3)"))
+                               .toString());
+
+               assertEquals(
+                       //
+                       "function (context,explicit,converted) {\n" //
+                               + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.1-\","
 //
+                               + 
"\"ep\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"zh_CN\"}]};\n"
 //
+                               + "var params = 
[{\"name\":\"explicit\",\"value\":explicit},"
+                               + 
"{\"name\":\"resolved\",\"value\":window.location.href},"
+                               + 
"{\"name\":\"converted\",\"value\":converted.substring(0, 3)}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
+                               + "Wicket.Ajax.ajax(attrs);\n" //
+                               + "}\n", //
+                       page.getBehavior2()
                                .getCallbackFunction(context("context"), 
explicit("explicit"),
                                        resolved("resolved", 
"window.location.href"),
                                        converted("converted", 
"converted.substring(0, 3)"))
@@ -129,11 +202,31 @@ public class AjaxCallbackFunctionTest extends 
WicketTestCase
                        //
                        "function (event,ui) {\n" //
                                + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.0-\"};\n"
 //
-                               + "var params = {'sortIndex': 
$(this).find(':data(sortable-item)').index(ui.item),'sortItemId': 
$(ui.item).attr('id'),'sortSenderId': $(ui.sender).attr('id')};\n" //
-                               + "attrs.ep = params;\n" //
+                               + "var params = 
[{\"name\":\"sortIndex\",\"value\":$(this).find(':data(sortable-item)').index(ui.item)},"
 //
+                               + 
"{\"name\":\"sortItemId\",\"value\":$(ui.item).attr('id')}," //
+                               + 
"{\"name\":\"sortSenderId\",\"value\":$(ui.sender).attr('id')}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
+                               + "Wicket.Ajax.ajax(attrs);\n" //
+                               + "}\n", //
+                       page.getBehavior1()
+                               .getCallbackFunction(context("event"), 
context("ui"),
+                                       resolved("sortIndex", 
"$(this).find(':data(sortable-item)').index(ui.item)"),
+                                       resolved("sortItemId", 
"$(ui.item).attr('id')"),
+                                       resolved("sortSenderId", 
"$(ui.sender).attr('id')"))
+                               .toString());
+
+               assertEquals(
+                       //
+                       "function (event,ui) {\n" //
+                               + "var attrs = 
{\"u\":\"./wicket/bookmarkable/org.apache.wicket.ajax.AjaxCallbackPage?0-1.IBehaviorListener.1-\","
 //
+                                       + 
"\"ep\":[{\"name\":\"param1\",\"value\":123},{\"name\":\"param2\",\"value\":\"zh_CN\"}]};\n"
 //
+                               + "var params = 
[{\"name\":\"sortIndex\",\"value\":$(this).find(':data(sortable-item)').index(ui.item)},"
 //
+                               + 
"{\"name\":\"sortItemId\",\"value\":$(ui.item).attr('id')}," //
+                               + 
"{\"name\":\"sortSenderId\",\"value\":$(ui.sender).attr('id')}];\n" //
+                               + "attrs.ep = params.concat(attrs.ep);\n" //
                                + "Wicket.Ajax.ajax(attrs);\n" //
                                + "}\n", //
-                       page.getBehavior()
+                       page.getBehavior2()
                                .getCallbackFunction(context("event"), 
context("ui"),
                                        resolved("sortIndex", 
"$(this).find(':data(sortable-item)').index(ui.item)"),
                                        resolved("sortItemId", 
"$(ui.item).attr('id')"),

http://git-wip-us.apache.org/repos/asf/wicket/blob/0374c040/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackPage.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackPage.java 
b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackPage.java
index 34e8029..f245634 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxCallbackPage.java
@@ -16,15 +16,19 @@
  */
 package org.apache.wicket.ajax;
 
+import java.util.Locale;
+
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.markup.html.WebPage;
 
 public class AjaxCallbackPage extends WebPage
 {
-       private AbstractDefaultAjaxBehavior behavior;
+       private AbstractDefaultAjaxBehavior behavior1;
+       private AbstractDefaultAjaxBehavior behavior2;
 
        public AjaxCallbackPage()
        {
-               add(behavior = new AbstractDefaultAjaxBehavior()
+               add(behavior1 = new AbstractDefaultAjaxBehavior()
                {
                        private static final long serialVersionUID = 1L;
 
@@ -33,10 +37,31 @@ public class AjaxCallbackPage extends WebPage
                        {
                        }
                });
+               add(behavior2 = new AbstractDefaultAjaxBehavior()
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected void 
updateAjaxAttributes(AjaxRequestAttributes attributes) {
+                               super.updateAjaxAttributes(attributes);
+                               attributes.getExtraParameters().put("param1", 
123);
+                               attributes.getExtraParameters().put("param2", 
Locale.SIMPLIFIED_CHINESE);
+                       }
+
+                       @Override
+                       protected void respond(AjaxRequestTarget target)
+                       {
+                       }
+               });
+       }
+
+       public AbstractDefaultAjaxBehavior getBehavior1()
+       {
+               return behavior1;
        }
 
-       public AbstractDefaultAjaxBehavior getBehavior()
+       public AbstractDefaultAjaxBehavior getBehavior2()
        {
-               return behavior;
+               return behavior2;
        }
 }

Reply via email to