You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2018/01/12 11:46:10 UTC
wicket git commit: WICKET-6517 use FormData,
removed submitMultipartForm
Repository: wicket
Updated Branches:
refs/heads/WICKET-6517-multipart-ajax [created] dfccba1f9
WICKET-6517 use FormData, removed submitMultipartForm
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/dfccba1f
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/dfccba1f
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/dfccba1f
Branch: refs/heads/WICKET-6517-multipart-ajax
Commit: dfccba1f9598ba9c2ad5dbb9954d867a195c16d2
Parents: c69592d
Author: Sven Meier <sv...@apache.org>
Authored: Fri Jan 12 12:45:55 2018 +0100
Committer: Sven Meier <sv...@apache.org>
Committed: Fri Jan 12 12:45:55 2018 +0100
----------------------------------------------------------------------
.../wicket/ajax/res/js/wicket-ajax-jquery.js | 234 +++----------------
wicket-core/src/test/js/ajax.js | 28 +--
2 files changed, 28 insertions(+), 234 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/dfccba1f/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 d4f3100..801a47d 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
@@ -643,11 +643,6 @@
we.publish(topic.AJAX_CALL_PRECONDITION, attrs);
- if (attrs.mp) { // multipart form. jQuery.ajax() doesn't help here ...
- var ret = self.submitMultipartForm(context);
- return ret;
- }
-
if (attrs.f) {
// serialize the form with id == attrs.f
var form = Wicket.$(attrs.f);
@@ -658,23 +653,36 @@
var scName = attrs.sc;
data = data.concat({name: scName, value: 1});
}
-
} 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, attrs.sr));
}
- // convert to URL encoded string
- data = jQuery.param(data);
+ var wwwFormUrlEncoded = undefined; // default
+ if (attrs.mp) {
+ try {
+ var formData = new FormData();
+ for (var i = 0; i < data.length; i++) {
+ formData.append(data[i].name, data[i].value);
+ }
+
+ data = formData;
+ wwwFormUrlEncoded = false;
+ } catch (exception) {
+ Wicket.Log.error("Ajax multipat not supported:" + exception);
+ }
+ }
// execute the request
var jqXHR = jQuery.ajax({
url: attrs.u,
type: attrs.m,
context: self,
+ processData: wwwFormUrlEncoded,
+ contentType: wwwFormUrlEncoded,
+
beforeSend: function (jqXHR, settings) {
-
// collect the dynamic extra parameters
if (jQuery.isArray(attrs.dep)) {
var queryString,
@@ -831,203 +839,6 @@
}
},
- /**
- * This method serializes a form and sends it as POST body. If the form contains multipart content
- * this function will post the form using an iframe instead of the regular ajax call
- * and bridge the output - transparently making this work as if it was an ajax call.
- *
- * @param {Object} context - the context for the ajax call (request attributes + steps)
- */
- submitMultipartForm: function (context) {
-
- var attrs = context.attrs;
-
- var form = Wicket.$(attrs.f);
- if (!form) {
- Wicket.Log.error("Wicket.Ajax.Call.submitForm: Trying to submit form with id '" + attrs.f + "' that is not in document.");
- return;
- }
-
- // find root form
- if (form.tagName.toLowerCase() !== "form") {
- do {
- form = form.parentNode;
- } while(form.tagName.toLowerCase() !== "form" && form !== document.body);
- }
-
- if (form.tagName.toLowerCase() !== "form") {
- Wicket.Log.error("Cannot submit form with id " + attrs.f + " because there is no form element in the hierarchy.");
- return false;
- }
-
- var submittingAttribute = 'data-wicket-submitting';
-
- if (form.onsubmit && !form.getAttribute(submittingAttribute)) {
- form.setAttribute(submittingAttribute, submittingAttribute);
- var retValue = true;
- try {
- retValue = form.onsubmit();
- } finally {
- form.removeAttribute(submittingAttribute);
- }
- if (!retValue) {
- return;
- }
- }
-
- var originalFormAction = form.action;
- var originalFormTarget = form.target;
- var originalFormMethod = form.method;
- var originalFormEnctype = form.enctype;
- var originalFormEncoding = form.encoding;
-
- var iframeName = "wicket-submit-" + ("" + Math.random()).substr(2);
-
- var iframe = createIFrame(iframeName);
-
- document.body.appendChild(iframe);
-
- // reconfigure the form
- form.target = iframe.name;
- var separator = (attrs.u.indexOf("?")>-1 ? "&" : "?");
- form.action = attrs.u + separator + "wicket-ajax=true&wicket-ajax-baseurl=" + Wicket.Form.encode(getAjaxBaseUrl());
-
- // add the static extra parameters
- if (attrs.ep) {
- var extraParametersArray = this._asParamArray(attrs.ep);
- if (extraParametersArray.length > 0) {
- var extraParametersQueryString = jQuery.param(extraParametersArray);
- form.action = form.action + '&' + extraParametersQueryString;
- }
- }
-
- // add the dynamic extra parameters
- if (jQuery.isArray(attrs.dep)) {
- var dynamicExtraParameters = this._calculateDynamicParameters(attrs);
- if (dynamicExtraParameters) {
- form.action = form.action + '&' + dynamicExtraParameters;
- }
- }
- form.method = 'post';
- form.enctype = "multipart/form-data";
- form.encoding = "multipart/form-data";
-
- // create submitting button element
- if (attrs.sc) {
- var $btn = jQuery("<input type='hidden' name='" + attrs.sc + "' id='" + iframe.id + "-btn' value='1'/>");
- form.appendChild($btn[0]);
- }
-
- var we = Wicket.Event;
- var topic = we.Topic;
-
- this._executeHandlers(attrs.bsh, attrs, null, null);
- we.publish(topic.AJAX_CALL_BEFORE_SEND, attrs, null, null);
-
- if (attrs.i) {
- // show the indicator
- Wicket.DOM.showIncrementally(attrs.i);
- }
-
- //submit the form into the iframe, response will be handled by the onload callback
- form.submit();
-
- this._executeHandlers(attrs.ah, attrs);
- we.publish(topic.AJAX_CALL_AFTER, attrs);
-
- // a step to execute in both successful and erroneous completion
- context.endStep = jQuery.proxy(function(notify) {
- // remove the iframe and button elements
- setTimeout(function() {
- jQuery('#'+iframe.id + '-btn').remove();
- jQuery(iframe).remove();
- }, 0);
-
- var attrs = context.attrs;
- if (attrs.i && context.isRedirecting !== true) {
- // hide the indicator
- Wicket.DOM.hideIncrementally(attrs.i);
- }
-
- this._executeHandlers(attrs.coh, attrs, null, null);
- Wicket.Event.publish(Wicket.Event.Topic.AJAX_CALL_COMPLETE, attrs, null, null);
-
- this.done(attrs);
- return FunctionsExecuter.DONE;
- }, this);
-
- // an error handler that is used when the connection to the server fails for any reason
- if (attrs.rt) {
- context.errorHandle = setTimeout(jQuery.proxy(function () {
- this.failure(context, null, "No XML response in the IFrame document", "Failure");
-
- context.steps.push(context.endStep);
- var executer = new FunctionsExecuter(context.steps);
- executer.start();
- }, this), attrs.rt);
- } else {
- Wicket.Log.info("Submitting a multipart form without a timeout. " +
- "Use AjaxRequestAttributes.setRequestTimeout(duration) if need to handle connection timeouts.");
- }
-
- // install handler to deal with the ajax response
- // ... we add the onload event after form submit because chrome fires it prematurely
- we.add(iframe, "load.handleMultipartComplete", jQuery.proxy(this.handleMultipartComplete, this), context);
-
-
- // handled, restore state and return true
- form.action = originalFormAction;
- form.target = originalFormTarget;
- form.method = originalFormMethod;
- form.enctype = originalFormEnctype;
- form.encoding = originalFormEncoding;
-
- return true;
- },
-
- /**
- * Completes the multipart ajax handling started via handleMultipart()
- * @param {jQuery.Event} event
- */
- handleMultipartComplete: function (event) {
-
- var context = event.data,
- iframe = event.target,
- envelope;
-
- if (!isUndef(context.errorHandle)) {
- clearTimeout(context.errorHandle);
- }
-
- // stop the event
- event.stopPropagation();
-
- // remove the event
- jQuery(iframe).off("load.handleMultipartComplete");
-
- try {
- envelope = iframe.contentWindow.document;
- } catch (e) {
- Wicket.Log.error("Cannot read Ajax response for multipart form submit: " + e);
- }
-
- if (isUndef(envelope)) {
- this.failure(context, null, "No XML response in the IFrame document", "Failure");
- }
- else {
- if (envelope.XMLDocument) {
- envelope = envelope.XMLDocument;
- }
-
- // process the response
- this.loadedCallback(envelope, context);
- }
-
- context.steps.push(context.endStep);
- var executer = new FunctionsExecuter(context.steps);
- executer.start();
- },
-
// Processes the response
loadedCallback: function (envelope, context) {
// To process the response, we go through the xml document and add a function for every action (step).
@@ -1488,9 +1299,16 @@
*/
serializeInput: function (input) {
var result = [];
- if (input && input.type && !(input.type === 'image' || input.type === 'submit')) {
+ if (input && input.type) {
var $input = jQuery(input);
- result = $input.serializeArray();
+
+ if (input.type === 'file') {
+ for (var f = 0; f < input.files.length; f++) {
+ result.push({"name" : input.name, "value" : input.files[f]});
+ }
+ } else if (!(input.type === 'image' || input.type === 'submit')) {
+ result = $input.serializeArray();
+ }
}
return result;
},
http://git-wip-us.apache.org/repos/asf/wicket/blob/dfccba1f/wicket-core/src/test/js/ajax.js
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/js/ajax.js b/wicket-core/src/test/js/ajax.js
index 71f9fce..982aa47 100644
--- a/wicket-core/src/test/js/ajax.js
+++ b/wicket-core/src/test/js/ajax.js
@@ -1042,7 +1042,7 @@ jQuery(document).ready(function() {
*/
asyncTest('Submit nested form - success scenario.', function () {
- expect(13);
+ expect(9);
var attrs = {
f: "innerForm", // the id of the form to submit
@@ -1056,18 +1056,6 @@ jQuery(document).ready(function() {
pre: [ function(attrs) {ok(true, "Precondition executed"); return true; } ],
bsh: [ function(attrs) {
ok(true, "BeforeSend handler executed");
-
- var form = Wicket.$(attrs.f);
- if (form.tagName.toLowerCase() !== "form") {
- do {
- form = form.parentNode;
- } while(form.tagName.toLowerCase() !== "form" && form !== document.body);
- }
- var formUrl = form.action;
- ok(formUrl.indexOf('dynamicEPName') > -1, "Dynamic extra parameter name is in the request query string");
- ok(formUrl.indexOf('dynamicEPValue') > -1, "Dynamic extra parameter value is in the request query string");
- ok(formUrl.indexOf('extraParamName') > -1, "Static extra parameter name is in the request query string");
- ok(formUrl.indexOf('extraParamValue') > -1, "Static extra parameter value is in the request query string");
} ],
ah: [ function(attrs) { ok(true, "After handler executed"); } ],
sh: [ function(attrs) { ok(true, "Success handler executed"); } ],
@@ -1101,7 +1089,7 @@ jQuery(document).ready(function() {
*/
asyncTest('Submit nested form - failure scenario.', function () {
- expect(12);
+ expect(8);
var attrs = {
f: "innerForm", // the id of the form to submit
@@ -1115,18 +1103,6 @@ jQuery(document).ready(function() {
pre: [ function(attrs) {ok(true, "Precondition executed"); return true; } ],
bsh: [ function(attrs) {
ok(true, "BeforeSend handler executed");
-
- var form = Wicket.$(attrs.f);
- if (form.tagName.toLowerCase() !== "form") {
- do {
- form = form.parentNode;
- } while(form.tagName.toLowerCase() !== "form" && form !== document.body);
- }
- var formUrl = form.action;
- ok(formUrl.indexOf('dynamicEPName') > -1, "Dynamic extra parameter name is in the request query string");
- ok(formUrl.indexOf('dynamicEPValue') > -1, "Dynamic extra parameter value is in the request query string");
- ok(formUrl.indexOf('extraParamName') > -1, "Static extra parameter name is in the request query string");
- ok(formUrl.indexOf('extraParamValue') > -1, "Static extra parameter value is in the request query string");
} ],
ah: [ function(attrs) { ok(true, "After handler executed"); } ],
sh: [ function(attrs) { ok(false, "Success handler should not be executed"); } ],