Author: pedro Date: Tue Dec 14 23:40:34 2010 New Revision: 1049335 URL: http://svn.apache.org/viewvc?rev=1049335&view=rev Log: using an iframe to do the asynchronous progress bar update Issue: WICKET-3202
Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java?rev=1049335&r1=1049334&r2=1049335&view=diff ============================================================================== --- wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java (original) +++ wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java Tue Dec 14 23:40:34 2010 @@ -16,8 +16,14 @@ */ 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.IInitializer; +import org.apache.wicket.ajax.WicketAjaxReference; +import org.apache.wicket.ajax.markup.html.form.AjaxButton; +import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.WicketEventReference; @@ -160,6 +166,7 @@ public class UploadProgressBar extends P { super.renderHead(response); response.renderJavaScriptReference(WicketEventReference.INSTANCE); + response.renderJavaScriptReference(WicketAjaxReference.INSTANCE); response.renderJavaScriptReference(JS); ResourceReference css = getCss(); if (css != null) @@ -171,13 +178,26 @@ public class UploadProgressBar extends P final String uploadFieldId = (uploadField == null) ? "" : uploadField.getMarkupId(); - response.renderOnDomReadyJavaScript("Wicket.Event.add(document.getElementById('" + - form.getRootForm().getMarkupId() + "'), 'submit', function() {" + - "if (!document.getElementById('" + statusDiv.getMarkupId() + "')) return;" + - "var def=new Wicket.WUPB.Def('" + getMarkupId() + "', '" + statusDiv.getMarkupId() + - "', '" + barDiv.getMarkupId() + "', '" + urlFor(ref, null) + "','" + uploadFieldId + - "'); Wicket.WUPB.start(def);});"); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream js = new PrintStream(out); + + js.printf("var formElement = Wicket.$('%s');", form.getRootForm().getMarkupId()); + js.append("var originalCallback = formElement.onsubmit;"); + + 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, null), 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/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java?rev=1049335&r1=1049334&r2=1049335&view=diff ============================================================================== --- wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java (original) +++ wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java Tue Dec 14 23:40:34 2010 @@ -39,7 +39,7 @@ class UploadStatusResource extends Abstr protected ResourceResponse newResourceResponse(Attributes attributes) { ResourceResponse response = new ResourceResponse(); - response.setContentType("text/plain"); + response.setContentType("text/html"); final String content = getStatus(attributes); response.setWriteCallback(new WriteCallback() @@ -60,7 +60,8 @@ class UploadStatusResource extends Abstr /** * @param attributes - * @return + * @return Status string with progress data that will feed the progressbar.js variables on + * browser to update the progress bar */ private String getStatus(Attributes attributes) { @@ -70,7 +71,7 @@ class UploadStatusResource extends Abstr String status = null; if (info == null || info.getTotalBytes() < 1) { - status = "0|0|0|0"; + status = "0|0|0|0|0"; } else { @@ -78,7 +79,7 @@ class UploadStatusResource extends Abstr info.getTotalBytesString() + "|" + info.getTransferRateString() + "|" + info.getRemainingTimeString(); } - status = "<html>|" + status + "|</html>"; + status = "<html><body>|" + status + "|</body></html>"; return status; } Modified: wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js?rev=1049335&r1=1049334&r2=1049335&view=diff ============================================================================== --- wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js (original) +++ wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js Tue Dec 14 23:40:34 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/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js?rev=1049335&r1=1049334&r2=1049335&view=diff ============================================================================== --- wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js (original) +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ajax/wicket-ajax.js Tue Dec 14 23:40:34 2010 @@ -1138,17 +1138,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"; + iframe = Wicket._createIFrame(iframeName); document.body.appendChild(iframe); @@ -2393,3 +2383,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