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