You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2010/12/15 01:56:33 UTC

svn commit: r1049371 - in /wicket/branches/wicket-1.4.x: wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/ wicket/src/main/java/org/apache/wicket/ajax/

Author: pedro
Date: Wed Dec 15 00:56:33 2010
New Revision: 1049371

URL: http://svn.apache.org/viewvc?rev=1049371&view=rev
Log:
using an iframe to do the asynchronous progress bar update
Issue: WICKET-3202

Modified:
    wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
    wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java
    wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js

Modified: wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java?rev=1049371&r1=1049370&r2=1049371&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java (original)
+++ wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java Wed Dec 15 00:56:33 2010
@@ -16,17 +16,20 @@
  */
 package org.apache.wicket.extensions.ajax.markup.html.form.upload;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
 import org.apache.wicket.Application;
-import org.apache.wicket.Component;
 import org.apache.wicket.IInitializer;
 import org.apache.wicket.RequestCycle;
 import org.apache.wicket.ResourceReference;
-import org.apache.wicket.behavior.AbstractBehavior;
-import org.apache.wicket.behavior.IBehavior;
-import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.ajax.WicketAjaxReference;
 import org.apache.wicket.markup.html.CSSPackageResource;
+import org.apache.wicket.markup.html.IHeaderContributor;
+import org.apache.wicket.markup.html.IHeaderResponse;
 import org.apache.wicket.markup.html.JavascriptPackageResource;
 import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.WicketEventReference;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.upload.FileUploadField;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -41,7 +44,7 @@ import org.slf4j.LoggerFactory;
  * 
  * @author Andrew Lombardi
  */
-public class UploadProgressBar extends Panel
+public class UploadProgressBar extends Panel implements IHeaderContributor
 {
 	private static final Logger log = LoggerFactory.getLogger(UploadProgressBar.class);
 
@@ -119,10 +122,11 @@ public class UploadProgressBar extends P
 		super(id);
 		uploadField = fileUploadField;
 		this.form = form;
-		setOutputMarkupId(true);
 		form.setOutputMarkupId(true);
 		setRenderBodyOnly(true);
 
+		add(JavascriptPackageResource.getHeaderContribution(WicketEventReference.INSTANCE));
+		add(JavascriptPackageResource.getHeaderContribution(WicketAjaxReference.INSTANCE));
 		add(JavascriptPackageResource.getHeaderContribution(JS));
 		ResourceReference css = getCss();
 		if (css != null)
@@ -149,7 +153,7 @@ public class UploadProgressBar extends P
 	protected void onInitialize()
 	{
 		super.onInitialize();
-		form.getRootForm().add(new FormEnabler(this, statusDiv, barDiv, uploadField));
+		form.getRootForm().setOutputMarkupId(true);
 	}
 
 	/**
@@ -162,62 +166,35 @@ public class UploadProgressBar extends P
 		return CSS;
 	}
 
-	/** {@inheritDoc} */
-	@Override
-	protected void onRemove()
-	{
-		// remove formenabler we added to the form
-		for (IBehavior behavior : form.getBehaviors())
-		{
-			if (behavior instanceof FormEnabler)
-			{
-				if (((FormEnabler)behavior).getUploadProgressBar() == this)
-				{
-					form.remove(behavior);
-					break;
-				}
-			}
-		}
-		super.onRemove();
-	}
-
 	/**
-	 * Hooks into form onsubmit and triggers the progress bar updates
 	 * 
-	 * @author igor.vaynberg
 	 */
-	private static class FormEnabler extends AbstractBehavior
+	public void renderHead(IHeaderResponse response)
 	{
-		private static final long serialVersionUID = 1L;
+		ResourceReference ref = new ResourceReference(RESOURCE_NAME);
 
-		private final Component status, bar, uploadField;
-		private final UploadProgressBar pbar;
+		final String uploadFieldId = (uploadField == null) ? "" : uploadField.getMarkupId();
 
-		public FormEnabler(UploadProgressBar pbar, Component status, Component bar,
-			Component uploadField)
-		{
-			this.pbar = pbar;
-			this.bar = bar;
-			this.status = status;
-			this.uploadField = uploadField;
-		}
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		PrintStream js = new PrintStream(out);
 
-		@Override
-		public void onComponentTag(Component component, ComponentTag tag)
-		{
-			ResourceReference ref = new ResourceReference(RESOURCE_NAME);
-			final String uploadFieldId = (uploadField == null) ? "" : uploadField.getMarkupId();
-			tag.put("onsubmit", "var def=new Wicket.WUPB.Def('" + component.getMarkupId() + "', '" +
-				status.getMarkupId() + "', '" + bar.getMarkupId() + "', '" +
-				component.getPage().urlFor(ref) + "','" + uploadFieldId +
-				"'); Wicket.WUPB.start(def);");
-		}
+		js.printf("var formElement = Wicket.$('%s');", form.getRootForm().getMarkupId());
+		js.append("var originalCallback = formElement.onsubmit;");
 
-		public UploadProgressBar getUploadProgressBar()
-		{
-			return pbar;
-		}
+		js.append("var submitCallback = function() {");
+		js.printf("  if (!Wicket.$('%s')) return;", statusDiv.getMarkupId());
+		js.printf("  var def=new Wicket.WUPB.Def('%s', '%s', '%s', '%s','%s');", getMarkupId(),
+			statusDiv.getMarkupId(), barDiv.getMarkupId(), urlFor(ref), uploadFieldId);
+
+		js.append("  new Wicket.WUPB(def).start();");
+
+		js.append("  if(originalCallback)return originalCallback(); else return true;");
+		js.append("};");
+
+		js.append("formElement.onsubmit = submitCallback;");
+		js.close();
 
+		response.renderOnDomReadyJavascript(new String(out.toByteArray()));
 
 	}
 }

Modified: wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java?rev=1049371&r1=1049370&r2=1049371&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java (original)
+++ wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java Wed Dec 15 00:56:33 2010
@@ -60,7 +60,7 @@ class UploadStatusResource extends Dynam
 
 			if (info == null || info.getTotalBytes() < 1)
 			{
-				status = "0|0|0|0";
+				status = "0|0|0|0|0";
 			}
 			else
 			{
@@ -68,7 +68,7 @@ class UploadStatusResource extends Dynam
 						"|" + info.getTotalBytesString() + "|" + info.getTransferRateString() +
 						"|" + info.getRemainingTimeString();
 			}
-			status = "<html>|" + status + "|</html>";
+			status = "<html><body>|" + status + "|</body></html>";
 		}
 
 		/**

Modified: wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js?rev=1049371&r1=1049370&r2=1049371&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js (original)
+++ wicket/branches/wicket-1.4.x/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js Wed Dec 15 00:56:33 2010
@@ -16,114 +16,99 @@
  */
 if (typeof(Wicket) == "undefined") Wicket = { };
 
-Wicket.WUPB= {
+Wicket.WUPB = Wicket.Class.create();
 
-    Def : function(formid, statusid, barid, url, fileid) {
-        this.formid=formid;
-        this.statusid=statusid;
-        this.barid=barid;
-        this.url=url;
-        this.fileid=fileid;
-    },
-    
- 	get : function(id) {
-		return document.getElementById(id);
-	},
-	
-	start : function(def) {
-		var displayprogress = true;
+Wicket.WUPB.prototype = {
+		
+	initialize : function(def) {
+		this.def = def;
+		this.displayprogress = true;
 		if (def.fileid) {
-			var fileupload = Wicket.WUPB.get(def.fileid);
-			displayprogress = fileupload && fileupload.value && fileupload.value != '';
+			var fileupload = Wicket.$(def.fileid);
+			this.displayprogress = fileupload && fileupload.value && fileupload.value != '';
 		}
-		if(displayprogress) {
-			//Wicket.WUPB.get(def.formid).submit();
-			Wicket.WUPB.get(def.statusid).innerHTML='Upload starting...';
-			Wicket.WUPB.get(def.barid).firstChild.firstChild.style.width='0%';
-
-			Wicket.WUPB.get(def.statusid).style.display='block';
-			Wicket.WUPB.get(def.barid).style.display='block';
+		if(this.displayprogress) {
+			Wicket.$(def.statusid).innerHTML='Upload starting...';
+			Wicket.$(def.barid).firstChild.firstChild.style.width='0%';
 
-			window.setTimeout(function() { Wicket.WUPB.ajax(def); }, 1000);
+			Wicket.$(def.statusid).style.display='block';
+			Wicket.$(def.barid).style.display='block';
 		}
 	},
 	
-	ajax : function(def) {
-		transport = false;
-
-		if(window.XMLHttpRequest)
-		{
-			transport = new XMLHttpRequest();
-			if(transport.overrideMimeType)
-			{
-				transport.overrideMimeType('text/xml');
-			}
-		}
-		else if(window.ActiveXObject)
-		{
-			try
-			{
-				transport = new ActiveXObject("Msxml2.XMLHTTP");
-			} catch (e) {
-				try
-				{
-					transport = new ActiveXObject("Microsoft.XMLHTTP");
-				} catch (e) {}
-			}
-		}
-		if(!transport)
-		{
-			alert('Error: could not create XMLHTTP object.');
-			return false;
+	start : function(){
+		if(this.displayprogress) {
+			this.scheduleUpdate();
 		}
+	},
 	
-		transport.onreadystatechange = function() { Wicket.WUPB.update(transport, def); };
-		transport.open('GET', def.url+'?anticache='+Math.random(), true);
-		transport.send(null);
+	scheduleUpdate : function(){
+		window.setTimeout(function() { this.ajax(); }.bind(this), 1000);
 	},
 	
-	update: function(transport, def) {
-		if (transport.readyState == 4) {
-
-            if (transport.status == 200) {
-
-                var update = transport.responseText.split('|');
-
-
-                var completed_upload_size = update[2];
-                var total_upload_size = update[3];
-                var progressPercent = update[1];
-                var transferRate = update[4];
-                var timeRemaining = update[5];
-                
-
-
-                if ((completed_upload_size != "") && (completed_upload_size != 0))
-                {
-                    Wicket.WUPB.get(def.barid).firstChild.firstChild.style.width=progressPercent+'%';
-                    Wicket.WUPB.get(def.statusid).innerHTML=progressPercent + '% finished, '
-                            + completed_upload_size + ' of '
-                            + total_upload_size + ' at '
-                            + transferRate  
-                            + "; " + timeRemaining;
-                }
+	ajax : function() {
+		var URL = this.def.url + '?anticache=' + Math.random();
+		
+    	this.iframe = Wicket._createIFrame(""+Math.random());
+		
+    	document.body.appendChild(this.iframe);
+		
+		Wicket.Event.add(this.iframe, "load", this.update.bind(this));
+		this.iframe.src = URL; 
+		
+	},
 
-                if (progressPercent == 100)
-                {
+	update : function() {
+		
+		if(this.iframe.contentDocument){
+			var responseAsText = this.iframe.contentDocument.body.innerHTML;
+		}else{
+			// for IE 5.5, 6 and 7:
+			var responseAsText = this.iframe.contentWindow.document.body.innerHTML
+		}
+		
+		var update = responseAsText.split('|');
 
-                    Wicket.WUPB.get(def.barid).firstChild.firstChild.style.width='100%';
-                    
-					Wicket.WUPB.get(def.statusid).style.display='none';
-				    Wicket.WUPB.get(def.barid).style.display='none';
+		var completed_upload_size = update[2];
+		var total_upload_size = update[3];
+		var progressPercent = update[1];
+		var transferRate = update[4];
+		var timeRemaining = update[5];
+
+		if ((timeRemaining != "") && (completed_upload_size != 0)) {
+
+			Wicket.$(this.def.barid).firstChild.firstChild.style.width = progressPercent
+					+ '%';
+			Wicket.$(this.def.statusid).innerHTML = progressPercent
+					+ '% finished, ' + completed_upload_size + ' of '
+					+ total_upload_size + ' at ' + transferRate + "; "
+					+ timeRemaining;
 
-                    return null;
-                }
+		}
+		
+		this.iframe.parentNode.removeChild(this.iframe);
+		this.iframe = null;
+		
+		if (progressPercent == 100 || timeRemaining == 0) {
+			if (progressPercent == 100) {
+				Wicket.$(this.def.barid).firstChild.firstChild.style.width = '100%';
+			}
+			wicketHide(this.def.statusid);
+			wicketHide(this.def.barid);
+		} else {
+			this.scheduleUpdate();
+		}
+	}
+};
 
+Wicket.WUPB.Def = Wicket.Class.create();
 
-                window.setTimeout(function() { Wicket.WUPB.ajax(def); }, 1000);
-            } else {
-                alert('Error: got a not-OK status code...');
-            }
-        }
+Wicket.WUPB.Def.prototype = {
+	initialize : function(formid, statusid, barid, url, fileid) {
+		this.formid = formid;
+		this.statusid = statusid;
+		this.barid = barid;
+		this.url = url;
+		this.fileid = fileid;
 	}
-}
+};
\ No newline at end of file

Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js?rev=1049371&r1=1049370&r2=1049371&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js Wed Dec 15 00:56:33 2010
@@ -1159,17 +1159,7 @@ Wicket.Ajax.Call.prototype = {
 		
 		var iframeName="wicket-submit-"+(""+Math.random()).substr(2);
 		
-		try {
-    		var iframe = document.createElement("<iframe name='"+iframeName+"' id='"+iframeName+"' src='about:blank'/>");
-		} catch (ex) {
-		    var iframe = document.createElement("iframe");
-			iframe.name=iframeName;
-			iframe.id=iframe.name;
-			iframe.src="about:blank";
-		}
-		
-		iframe.style.display="none";
-		iframe.style.visibility="hidden";
+		var iframe = Wicket._createIFrame(iframeName);
 		
 		document.body.appendChild(iframe);
 		
@@ -2417,3 +2407,18 @@ Wicket._readTextNode = function(node) {
 	}
 	return text;
 }
+
+Wicket._createIFrame = function(iframeName){
+	try {
+		var iframe = document.createElement("<iframe name='"+iframeName+"' id='"+iframeName+"' src='about:blank'/>");
+	} catch (ex) {
+	    var iframe = document.createElement("iframe");
+		iframe.name=iframeName;
+		iframe.id=iframe.name;
+		iframe.src="about:blank";
+	}
+	
+	iframe.style.display="none";
+	iframe.style.visibility="hidden";
+	return iframe;
+}
\ No newline at end of file