You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2007/05/12 18:02:24 UTC

svn commit: r537474 - in /incubator/wicket/trunk/jdk-1.4/wicket/src: main/java/org/apache/wicket/ajax/ test/java/org/apache/wicket/ajax/markup/html/componentMap/

Author: knopp
Date: Sat May 12 09:02:23 2007
New Revision: 537474

URL: http://svn.apache.org/viewvc?view=rev&rev=537474
Log:
WICKET-556 Prevent setTimeout for AjaxSelfUpdatingTimerBehavior from firing after its contributing component has been replaced

Modified:
    incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
    incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
    incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
    incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html

Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java?view=diff&rev=537474&r1=537473&r2=537474
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java Sat May 12 09:02:23 2007
@@ -74,10 +74,23 @@
 	protected final String getJsTimeoutCall(final Duration updateInterval)
 	{
 		// this might look strange, but it is necessary for IE not to leak :(
-		return "setTimeout(\"" + getCallbackScript(true) + "\", "
+		return "setTimeout(\"" + getCallbackScript() + "\", "
 				+ updateInterval.getMilliseconds() + ");";
 	}
 
+	protected CharSequence getCallbackScript()
+	{
+		String componentId = getComponent().getMarkupId();
+		String precondition = "var c = Wicket.$('" + componentId + "'); return typeof(c) != 'undefined' && c != null";
+		
+		return getCallbackScript("wicketAjaxGet('"
+				+ getCallbackUrl(onlyTargetActivePage()) + "'", null, null, precondition);
+	}
+	
+	protected boolean onlyTargetActivePage() {
+		return true;
+	}
+	
 	/**
 	 * 
 	 * @see org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#respond(org.apache.wicket.ajax.AjaxRequestTarget)

Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java?view=diff&rev=537474&r1=537473&r2=537474
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/AbstractDefaultAjaxBehavior.java Sat May 12 09:02:23 2007
@@ -136,6 +136,36 @@
 	protected CharSequence getCallbackScript(final CharSequence partialCall,
 			final CharSequence onSuccessScript, final CharSequence onFailureScript)
 	{
+		return getCallbackScript(partialCall, onSuccessScript, onFailureScript, null);
+	}
+	
+	/**
+	 * Returns javascript that performs an ajax callback to this behavior. The
+	 * script is decorated by the ajax callback decorator from
+	 * {@link AbstractDefaultAjaxBehavior#getAjaxCallDecorator()}.
+	 * 
+	 * @param partialCall
+	 *            Javascript of a partial call to the function performing the
+	 *            actual ajax callback. Must be in format
+	 *            <code>function(params,</code> with signature
+	 *            <code>function(params, onSuccessHandler, onFailureHandler</code>.
+	 *            Example: <code>wicketAjaxGet('callbackurl'</code>
+	 * @param onSuccessScript
+	 *            javascript that will run when the ajax call finishes
+	 *            successfully
+	 * @param onFailureScript
+	 *            javascript that will run when the ajax call finishes with an
+	 *            error status
+	 * @param precondition
+	 * 			  optional javacript expression that determines whether the request
+	 *            will actually execute (in form of return XXX;);
+	 * 
+	 * @return script that peforms ajax callback to this behavior
+	 */
+	protected CharSequence getCallbackScript(final CharSequence partialCall,
+			final CharSequence onSuccessScript, final CharSequence onFailureScript, 
+			final CharSequence precondition)
+	{
 		final IAjaxCallDecorator decorator = getAjaxCallDecorator();
 
 		String indicatorId = findIndicatorId();
@@ -163,7 +193,16 @@
 		AppendingStringBuffer buff = new AppendingStringBuffer(256);
 		buff.append("var ").append(IAjaxCallDecorator.WICKET_CALL_RESULT_VAR).append("=");
 		buff.append(partialCall).append(", function() { ").append(success);
-		buff.append("}.bind(this), function() { ").append(failure).append("}.bind(this));");
+		buff.append("}.bind(this), function() { ").append(failure).append("}.bind(this)");
+		
+		if (precondition != null) 
+		{
+			buff.append(", function() {");
+			buff.append(precondition);
+			buff.append("}");
+		}
+		
+		buff.append(");");
 
 		CharSequence call = buff;
 

Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js?view=diff&rev=537474&r1=537473&r2=537474
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js Sat May 12 09:02:23 2007
@@ -621,6 +621,7 @@
 		this.failureHandler = failureHandler != null ? failureHandler : function() { };
 		this.async = true;
 		this.channel = channel;
+		this.precondition = function() { return true; } // allow a condition to block request 
 
 		// when suppressDone is set, the loadedCallback is responsible for calling
 		// Ajax.Request.done() to process possibly pendings requests in the channel.
@@ -664,24 +665,29 @@
 	
 	// The actual get request implementation
 	doGet: function() {
-		this.transport = Wicket.Ajax.getTransport();
+		if (this.precondition()) {
 	
-		var url = this.createUrl();	
-		this.log("GET", url);
+			this.transport = Wicket.Ajax.getTransport();
 		
-		Wicket.Ajax.invokePreCallHandlers();
-		
-		var t = this.transport;
-		if (t != null) {
-			t.open("GET", url, this.async);
-			t.onreadystatechange = this.stateChangeCallback.bind(this);
-			// set a special flag to allow server distinguish between ajax and non-ajax requests
-			t.setRequestHeader("Wicket-Ajax", "true");
-			t.send(null);
-			return true;
+			var url = this.createUrl();	
+			this.log("GET", url);
+			
+			Wicket.Ajax.invokePreCallHandlers();
+			
+			var t = this.transport;
+			if (t != null) {
+				t.open("GET", url, this.async);
+				t.onreadystatechange = this.stateChangeCallback.bind(this);
+				// set a special flag to allow server distinguish between ajax and non-ajax requests
+				t.setRequestHeader("Wicket-Ajax", "true");
+				t.send(null);
+				return true;
+			} else {
+				this.failure();
+	       		return false;
+			}
 		} else {
-			this.failure();
-       		return false;
+			return null;
 		}
 	},
 	
@@ -697,25 +703,29 @@
 	
 	// The actual post implementation
 	doPost: function(body) {
-		this.transport = Wicket.Ajax.getTransport();	
-	
-		var url = this.createUrl();	
-		this.log("POST", url);
-		
-		Wicket.Ajax.invokePreCallHandlers();
+		if (this.precondition()) {
+			this.transport = Wicket.Ajax.getTransport();	
 		
-		var t = this.transport;
-		if (t != null) {
-			t.open("POST", url, this.async);
-			t.onreadystatechange = this.stateChangeCallback.bind(this);
-			t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-			// set a special flag to allow server distinguish between ajax and non-ajax requests
-			t.setRequestHeader("Wicket-Ajax", "true");
-			t.send(body);
-			return true;
+			var url = this.createUrl();	
+			this.log("POST", url);
+			
+			Wicket.Ajax.invokePreCallHandlers();
+			
+			var t = this.transport;
+			if (t != null) {
+				t.open("POST", url, this.async);
+				t.onreadystatechange = this.stateChangeCallback.bind(this);
+				t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+				// set a special flag to allow server distinguish between ajax and non-ajax requests
+				t.setRequestHeader("Wicket-Ajax", "true");
+				t.send(body);
+				return true;
+			} else {
+	       		this.failure();
+	       		return false;
+			}
 		} else {
-       		this.failure();
-       		return false;
+			return null;
 		}
 	},
 	
@@ -1523,8 +1533,12 @@
 
 var wicketThrottler = Wicket.throttler;
 
-function wicketAjaxGet(url, successHandler, failureHandler, channel) {
+function wicketAjaxGet(url, successHandler, failureHandler, precondition, channel) {
 	var call = new Wicket.Ajax.Call(url, successHandler, failureHandler, channel);
+	
+	if (typeof(precondition) != "undefined" && precondition != null) {
+		call.request.precondition = precondition;
+	}
 	return call.call();
 }
 

Modified: incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html?view=diff&rev=537474&r1=537473&r2=537474
==============================================================================
--- incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html (original)
+++ incubator/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html Sat May 12 09:02:23 2007
@@ -9,7 +9,7 @@
 
 <script type="text/javascript" src="resources/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/wicket-ajax-debug.js"></script>
 <script type="text/javascript" ><!--/*--><![CDATA[/*><!--*/
-Wicket.Event.add(window, "load", function() { setTimeout("var wcall=wicketAjaxGet('?wicket:interface=:0:testPanel:baseSpan:linja1::IBehaviorListener:0&wicket:ignoreIfNotActive=true', function() { }.bind(this), function() { }.bind(this));", 2000);;});
+Wicket.Event.add(window, "load", function() { setTimeout("var wcall=wicketAjaxGet('?wicket:interface=:0:testPanel:baseSpan:linja1::IBehaviorListener:0&wicket:ignoreIfNotActive=true', function() { }.bind(this), function() { }.bind(this), function() {var c = Wicket.$('linja10'); return typeof(c) != 'undefined' && c != null});", 2000);;});
 /*-->]]>*/</script>
 
 </head>