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);
-               }
        }
 
        /**

Reply via email to