Repository: wicket Updated Branches: refs/heads/wicket-7.x 4b141ccff -> 1daec2ef2
WICKET-6050 Wicket Ajax (Wicket.From.serializeElement) causes 400 bad request WICKET-5948 wicket-ajax.js probably doesn't traverse the children of <div> or <span> WICKET-6006 ModalWindow.closeCurrent() causes 414 status error Introduce AjaxRequestAttributes#serializeRecursively with default value 'false'. This is a flag indicating whether to collect (submit) the name/value pairs for all HTML form elements children of the HTML element with the JavaScript listener Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/1daec2ef Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/1daec2ef Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/1daec2ef Branch: refs/heads/wicket-7.x Commit: 1daec2ef2b6b9ae5ff4f60d42ed5d119cbaaf4a0 Parents: 4b141cc Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Dec 24 14:05:39 2015 +0100 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Thu Dec 24 14:05:39 2015 +0100 ---------------------------------------------------------------------- .../ajax/AbstractDefaultAjaxBehavior.java | 5 ++++ .../ajax/attributes/AjaxAttributeName.java | 11 +++++-- .../ajax/attributes/AjaxRequestAttributes.java | 23 +++++++++++++++ .../wicket/ajax/res/js/wicket-ajax-jquery.js | 31 +++++++++++++------- .../ajax/attributes/AjaxAttributeNameTest.java | 2 +- wicket-core/src/test/js/form.js | 11 ++++++- .../ajax/markup/html/modal/ModalWindow.java | 22 -------------- 7 files changed, 67 insertions(+), 38 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/1daec2ef/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 8f131a6..43f031d 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 @@ -236,6 +236,11 @@ public abstract class AbstractDefaultAjaxBehavior extends AbstractAjaxBehavior childSelector); } + if (attributes.isSerializeRecursively()) + { + attributesJson.put(AjaxAttributeName.SERIALIZE_RECURSIVELY.jsonName(), true); + } + String indicatorId = findIndicatorId(); if (Strings.isEmpty(indicatorId) == false) { http://git-wip-us.apache.org/repos/asf/wicket/blob/1daec2ef/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java index 784bb2b..45b0b73 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxAttributeName.java @@ -235,13 +235,18 @@ public enum AjaxAttributeName { URL("u"), /** - * @see org.apache.wicket.ajax.attributes.AjaxRequestAttributes#childSelector + * @see AjaxRequestAttributes#childSelector */ - CHILD_SELECTOR("sel"); + CHILD_SELECTOR("sel"), + + /** + * @see AjaxRequestAttributes#serializeRecursively + */ + SERIALIZE_RECURSIVELY("sr"); private final String jsonName; - private AjaxAttributeName(String jsonName) + AjaxAttributeName(String jsonName) { this.jsonName = Args.notNull(jsonName, "jsonName"); } http://git-wip-us.apache.org/repos/asf/wicket/blob/1daec2ef/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java index fea733d..22982ef 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java @@ -142,6 +142,12 @@ public final class AjaxRequestAttributes private CharSequence childSelector; /** + * A flag indicating whether to collect (submit) the name/value pairs for all HTML form elements + * children of the HTML element with the JavaScript listener + */ + private boolean serializeRecursively; + + /** * @see #childSelector * @return The selector string that filters the descendants */ @@ -550,4 +556,21 @@ public final class AjaxRequestAttributes return this; } + /** + * @return whether to collect (submit) the name/value pairs for all HTML form elements + * children of the HTML element with the JavaScript listener + */ + public boolean isSerializeRecursively() { + return serializeRecursively; + } + + /** + * @param serializeRecursively + * a flag indicating whether to collect (submit) the name/value pairs for all HTML form elements + * children of the HTML element with the JavaScript listener + */ + public AjaxRequestAttributes setSerializeRecursively(final boolean serializeRecursively) { + this.serializeRecursively = serializeRecursively; + return this; + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/1daec2ef/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js index 68dfefe..65ab38c 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js @@ -435,6 +435,10 @@ if (!attrs.sp) { attrs.sp = "bubble"; } + + if (!attrs.sr) { + attrs.sr = false; + } }, /** @@ -653,7 +657,7 @@ } else if (attrs.c && !jQuery.isWindow(attrs.c)) { // serialize just the form component with id == attrs.c var el = Wicket.$(attrs.c); - data = data.concat(Wicket.Form.serializeElement(el)); + data = data.concat(Wicket.Form.serializeElement(el, attrs.sr)); } // convert to URL encoded string @@ -1510,9 +1514,12 @@ * <em>Wicket.Form.excludeFromAjaxSerialization</em> * * @param element {HTMLFormElement} - the form element to serialize. E.g. HTMLInputElement + * @param serializeRecursively {Boolean} - a flag indicating whether to collect (submit) the + * name/value pairs for all HTML form elements children of the HTML element with + * the JavaScript listener * @return An array with a single element - an object with two keys - <em>name</em> and <em>value</em>. */ - serializeElement: function(element) { + serializeElement: function(element, serializeRecursively) { if (!element) { return []; @@ -1531,15 +1538,17 @@ } else if (tag === "input" || tag === "textarea") { return Wicket.Form.serializeInput(element); } else { - var elements = nodeListToArray(element.getElementsByTagName("input")); - elements = elements.concat(nodeListToArray(element.getElementsByTagName("select"))); - elements = elements.concat(nodeListToArray(element.getElementsByTagName("textarea"))); - var result = []; - for (var i = 0; i < elements.length; ++i) { - var el = elements[i]; - if (el.name && el.name !== "") { - result = result.concat(Wicket.Form.serializeElement(el)); + if (serializeRecursively) { + var elements = nodeListToArray(element.getElementsByTagName("input")); + elements = elements.concat(nodeListToArray(element.getElementsByTagName("select"))); + elements = elements.concat(nodeListToArray(element.getElementsByTagName("textarea"))); + + for (var i = 0; i < elements.length; ++i) { + var el = elements[i]; + if (el.name && el.name !== "") { + result = result.concat(Wicket.Form.serializeElement(el, serializeRecursively)); + } } } return result; @@ -1567,7 +1576,7 @@ for (var i = 0; i < elements.length; ++i) { var el = elements[i]; if (el.name && el.name !== "") { - result = result.concat(Wicket.Form.serializeElement(el)); + result = result.concat(Wicket.Form.serializeElement(el, false)); } } return result; http://git-wip-us.apache.org/repos/asf/wicket/blob/1daec2ef/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java b/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java index bda7d10..cef220d 100644 --- a/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/ajax/attributes/AjaxAttributeNameTest.java @@ -57,7 +57,7 @@ public class AjaxAttributeNameTest extends Assert } assertEquals("all known json parameter names", - "tr|p|d|id|dt|wr|rt|pd|sp|ch|e|async|dep|ep|pre|coh|fh|sh|ah|bsh|bh|ih|dh|i|sc|mp|f|c|m|u|sel|", + "tr|p|d|id|dt|wr|rt|pd|sp|ch|e|async|dep|ep|pre|coh|fh|sh|ah|bsh|bh|ih|dh|i|sc|mp|f|c|m|u|sel|sr|", sb.toString()); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/1daec2ef/wicket-core/src/test/js/form.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/js/form.js b/wicket-core/src/test/js/form.js index 7e309a3..ab80e02 100644 --- a/wicket-core/src/test/js/form.js +++ b/wicket-core/src/test/js/form.js @@ -137,7 +137,7 @@ jQuery(document).ready(function() { test("Wicket.Form.serializeElement should serialize the HTMLFormElement's which a children of a non-HTMLFormElement", function() { expect(1); - var actual = Wicket.Form.serializeElement('nonHtmlFormElement'); + var actual = Wicket.Form.serializeElement('nonHtmlFormElement', true); var expected = [ { name: "textInput", value: "textValue" }, @@ -159,6 +159,15 @@ jQuery(document).ready(function() { deepEqual(actual, expected); }); + test("Wicket.Form.serializeElement should serialize the HTMLFormElement's which a children of a non-HTMLFormElement", function() { + expect(1); + + var actual = Wicket.Form.serializeElement('nonHtmlFormElement', false); + + var expected = []; + deepEqual(actual, expected); + }); + module('Wicket.Form.serializeForm'); test('Wicket.Form.serialize - form element WITHOUT searching for the parent form', function() { http://git-wip-us.apache.org/repos/asf/wicket/blob/1daec2ef/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java index b929c38..2870c87 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/ModalWindow.java @@ -22,8 +22,6 @@ import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.core.request.handler.IPartialPageRequestHandler; -import org.apache.wicket.ajax.attributes.AjaxCallListener; -import org.apache.wicket.ajax.attributes.AjaxRequestAttributes; import org.apache.wicket.core.request.handler.PageProvider; import org.apache.wicket.core.request.handler.RenderPageRequestHandler; import org.apache.wicket.markup.ComponentTag; @@ -970,16 +968,6 @@ public class ModalWindow extends Panel windowClosedCallback.onClose(target); } } - - @Override - protected void updateAjaxAttributes(AjaxRequestAttributes attributes) - { - super.updateAjaxAttributes(attributes); - AjaxCallListener listener = new AjaxCallListener(); - // disable all form elements inside the modal window to avoid serializing them in the url - listener.onBefore("$('#'+attrs.c+' :input').prop('disabled', true);"); - attributes.getAjaxCallListeners().add(listener); - } } /** @@ -1002,16 +990,6 @@ public class ModalWindow extends Panel close(target); } } - - @Override - protected void updateAjaxAttributes(AjaxRequestAttributes attributes) - { - super.updateAjaxAttributes(attributes); - AjaxCallListener listener = new AjaxCallListener(); - // disable all form elements inside the modal window to avoid serializing them in the url - listener.onBefore("$('#'+attrs.c+' :input').prop('disabled', true);"); - attributes.getAjaxCallListeners().add(listener); - } } /**
