WICKET-6286 Add support for success callback to 'NewWindow' location

Add 'onDownloadCompleted()' callback that is executed after any success or 
failure callback. Like in jQuery - do something in all cases.

WICKET-6340 Use XHTML friendly markup when creating the iframe


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a7c01094
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a7c01094
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a7c01094

Branch: refs/heads/master
Commit: a7c01094b369c95316ee103f364f04f57cbba1ad
Parents: 27bb0bb
Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
Authored: Mon Mar 20 17:26:23 2017 +0100
Committer: Sven Meier <svenme...@apache.org>
Committed: Tue Mar 21 23:23:17 2017 +0100

----------------------------------------------------------------------
 .../examples/ajax/builtin/AjaxDownloadPage.java |  9 ++++++-
 .../wicket/extensions/ajax/AjaxDownload.java    | 28 +++++++++++++++++++-
 .../extensions/ajax/wicket-ajaxdownload.js      | 24 ++++++++++-------
 3 files changed, 50 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a7c01094/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
index 3a7ccb5..b339b64 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java
@@ -252,8 +252,15 @@ public class AjaxDownloadPage extends BasePage
                                downloadingContainer.setVisible(false);
                                target.add(downloadingContainer);
                        }
+
+                       @Override
+                       protected void onDownloadCompleted(AjaxRequestTarget 
target)
+                       {
+                               downloadingContainer.setVisible(false);
+                               target.add(downloadingContainer);
+                       }
                };
-               download.setLocation(AjaxDownload.Location.NewWindow);
+               download.setLocation(AjaxDownload.Location.SameWindow);
                add(download);
 
                add(new AjaxLink<Void>("downloadInNewWindow")

http://git-wip-us.apache.org/repos/asf/wicket/blob/a7c01094/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
index aacbfd9..34595e6 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/AjaxDownload.java
@@ -72,18 +72,23 @@ public class AjaxDownload extends 
AbstractDefaultAjaxBehavior
                 * The resource will be downloaded via a temporary created 
iframe.
                 * This is recommended when there are resources in the DOM 
which will be
                 * closed automatically on JavaScript <em>unload</em> event, 
like WebSockets.
+                * Supports both <em>success</em> and <em>failure</em> 
callbacks!
                 */
                IFrame,
 
                /**
                 * The resource will be downloaded by changing the location of 
the current DOM document.
                 * Note: This will trigger JavaScript <em>unload</em> event on 
the page!
+                * Supports only <em>success</em> callback, i.e. it is not 
possible to detect whether
+                * the download has finished successfully or not.
                 */
-               Self,
+               SameWindow,
 
                /**
                 * The resource will be downloaded in a new browser window by 
using JavaScript
                 * <code>window.open()</code> API.
+                * Supports only <em>success</em> callback, i.e. it is not 
possible to detect whether
+                * the download has finished successfully or not.
                 */
                NewWindow
        }
@@ -230,14 +235,34 @@ public class AjaxDownload extends 
AbstractDefaultAjaxBehavior
        {
        }
 
+       /**
+        * A callback executed when the download of the resource finished 
successfully.
+        *
+        * @param target The Ajax request handler
+        */
        protected void onDownloadSuccess(AjaxRequestTarget target)
        {
        }
 
+       /**
+        * A callback executed when the download of the resource failed for 
some reason,
+        * e.g. an error at the server side.
+        *
+        * @param target The Ajax request handler
+        */
        protected void onDownloadFailed(AjaxRequestTarget target)
        {
        }
 
+       /**
+        * A callback executed when the download of the resource finished 
successfully or with a failure.
+        *
+        * @param target The Ajax request handler
+        */
+       protected void onDownloadCompleted(AjaxRequestTarget target)
+       {
+       }
+
        @Override
        public void renderHead(Component component, IHeaderResponse response)
        {
@@ -255,6 +280,7 @@ public class AjaxDownload extends 
AbstractDefaultAjaxBehavior
                } else if ("failed".equals(result)) {
                        onDownloadFailed(target);
                }
+               onDownloadCompleted(target);
        }
 
        public final Location getLocation() {

http://git-wip-us.apache.org/repos/asf/wicket/blob/a7c01094/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
----------------------------------------------------------------------
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
index 4c5d554..26de71e 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/wicket-ajaxdownload.js
@@ -28,6 +28,12 @@
        Wicket.AjaxDownload = {
                initiate : function(settings) {
 
+                       var notifyServer = function (result) {
+                settings.attributes.ep = settings.attributes.ep || {};
+                settings.attributes.ep.result = result;
+                Wicket.Ajax.ajax(settings.attributes);
+            };
+
                        var checkComplete = function (frame) {
                                var result;
 
@@ -47,9 +53,7 @@
                                                }, 0);
                                        }
 
-                                       settings.attributes.ep = 
settings.attributes.ep || {};
-                                       settings.attributes.ep.result = result;
-                                       Wicket.Ajax.ajax(settings.attributes);
+                                       notifyServer(result);
                                } else {
                                        setTimeout(function() {
                                                checkComplete(frame);
@@ -57,16 +61,18 @@
                                }
                        };
 
-                       if (settings.method === 'self') {
+                       if (settings.method === 'samewindow') {
                                setTimeout(function () {
-                                       window.location.href = 
settings.downloadUrl;
+                                       
window.location.assign(settings.downloadUrl);
                                        checkComplete();
-                               }, 100);
+                               }, 10);
                        } else if (settings.method === 'newwindow') {
-                               window.open(settings.downloadUrl, 
'ajax-download');
-                               checkComplete();
+                               var wo = window.open(settings.downloadUrl, 
'ajax-download');
+                               jQuery(wo).load(function(evt) {
+                                       notifyServer(undefined);
+                               });
                        } else {
-                               var frame = 
jQuery("<iframe>").hide().prop("src", settings.downloadUrl).appendTo("body");
+                               var frame = 
jQuery("<iframe></iframe>").hide().prop("src", 
settings.downloadUrl).appendTo("body");
                                checkComplete(frame);
                        }
                }

Reply via email to