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