You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/08/01 15:36:00 UTC

[4/5] git commit: WICKET-4675 Process Ajax responses in one go

WICKET-4675 Process Ajax responses in one go


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

Branch: refs/heads/master
Commit: fc485be5b8af2f8a65dfd0275bb486d474ac8b3c
Parents: de34474
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 1 16:28:45 2012 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Aug 1 16:35:17 2012 +0300

----------------------------------------------------------------------
 .../wicket/ajax/res/js/wicket-ajax-jquery.js       |   14 +-
 wicket-core/src/test/js/ajax.js                    |   29 +-
 .../test/js/data/ajax/manyEvaluationsResponse.xml  | 2146 +++++++++++++++
 3 files changed, 2181 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/fc485be5/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 58cebdc..3c267c2 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
@@ -109,10 +109,11 @@
 	/**
 	 * Functions executer takes array of functions and executes them. Each function gets
 	 * the notify object, which needs to be called for the next function to be executed.
-	 * This way the functions can be executed synchronously. Each function has to call
-	 * the notify object at some point, otherwise the functions after it wont be executed.
-	 * After the FunctionExecuter is initiatialized, the start methods triggers the
-	 * first function.
+	 * This way the functions can be executed synchronously.
+	 * This is needed because header contributions need to do asynchronous download of JS and/or CSS
+	 * and they have to let next function to run only after the download.
+	 * Each function has to call the notify object at some point, otherwise the functions after it wont be executed.
+	 * After the FunctionsExecuter is initiatialized, the start methods triggers the first function.
 	 */
 	var FunctionsExecuter = function (functions) {
 
@@ -139,9 +140,8 @@
 				run = jQuery.proxy(run, this);
 				this.current++;
 
-				if (this.depth > 50 || Wicket.Browser.isKHTML() || Wicket.Browser.isSafari()) {
-					// to prevent khtml bug that crashes entire browser
-					// or to prevent stack overflow (safari has small call stack)
+				if (this.depth > 1000) {
+					// to prevent stack overflow (see WICKET-4675)
 					this.depth = 0;
 					window.setTimeout(run, 1);
 				} else {

http://git-wip-us.apache.org/repos/asf/wicket/blob/fc485be5/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 055c866..eac6e33 100644
--- a/wicket-core/src/test/js/ajax.js
+++ b/wicket-core/src/test/js/ajax.js
@@ -988,7 +988,34 @@ jQuery(document).ready(function() {
 
 			Wicket.Ajax.ajax(attrs);
 
-			jQuery('#'+ attrs.c).triggerHandler(attrs.e);
+			jQuery('#'+ attrs.c).triggerHandler("nestedFormSubmit");
+		});
+
+		/**
+		 * Tests that a huge response with more than 1000 evaluations is properly executed.
+		 * FunctionsExecuter can execute at most 1000 functions in one go, the rest are executed
+		 * in setTimeout() to prevent stack size exceeds.
+		 * WICKET-4675
+		 */
+		asyncTest('Process response with 2k+ evaluations.', function () {
+
+			expect(2133);
+
+			var attrs = {
+				u:  "data/ajax/manyEvaluationsResponse.xml", // the mock response
+				e:  "manyEvaluations", // the event
+				bh: [ function(attrs) { ok(true, "Before handler executed"); } ],
+				pre: [ function(attrs) {ok(true, "Precondition executed"); return true; } ],
+				bsh: [ function(attrs) { ok(true, "BeforeSend handler executed"); } ],
+				ah: [ function(attrs) { ok(true, "After handler executed"); } ],
+				sh: [ function(attrs) { ok(true, "Success handler executed"); } ],
+				fh: [ function(attrs) { ok(false, "Failure handler should not be executed"); } ],
+				coh: [ function(attrs) { ok(true, "Complete handler executed"); } ]
+			};
+
+			Wicket.Ajax.ajax(attrs);
+
+			jQuery(window).triggerHandler("manyEvaluations");
 		});
 	}
 });