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


Reply via email to