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