This is an automated email from the ASF dual-hosted git repository.

reiern70 pushed a commit to branch 
feature/reiern70/WICKET-6750-aborting-ajax-requests-take-II
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit c569f7129554720a0bf66664cb4c9c5983d502f5
Author: reiern70 <[email protected]>
AuthorDate: Wed Feb 26 13:36:57 2020 +0200

    [WICKET-6750] add a request monitor class that can be used operate in on 
AJAX request.
---
 .../wicket/ajax/res/js/wicket-ajax-jquery.js       | 122 ++++++++++-----------
 .../examples/ajax/builtin/FileUploadPage.java      |   7 +-
 2 files changed, 62 insertions(+), 67 deletions(-)

diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
index 8a66ad7..91125f1 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
@@ -278,20 +278,6 @@
                        }
                },
 
-               // aborts current request is there is any running
-               abort: function () {
-                       if (isUndef(this.jqXHR)) {
-                               Wicket.Log.debug("There is no executing request 
for channel " + this.name)
-                       } else {
-                               // if request has not finished yet, then abort 
it
-                               if (this.jqXHR.readyState !== 4) {
-                                       this.jqXHR.abort();
-                               } else {
-                                       Wicket.Log.debug("There is no executing 
request for channel " + this.name)
-                               }
-                       }
-               },
-
                done: function () {
                        var callback = null;
 
@@ -320,8 +306,8 @@
                        this.channels = {};
                },
 
-               // creates or retirves a channel
-               _createOrGetChanel: function (channel) {
+               // Schedules the callback to channel with given name.
+               schedule: function (channel, callback) {
                        var parsed = new Wicket.Channel(channel);
                        var c = this.channels[parsed.name];
                        if (isUndef(c)) {
@@ -330,22 +316,7 @@
                        } else {
                                c.type = parsed.type;
                        }
-                       return c;
-               },
-
-               // Schedules the callback to channel with given name.
-               schedule: function (channel, callback) {
-                       return 
this._createOrGetChanel(channel).schedule(callback);
-               },
-
-               // registers current jqXHR with channel using it
-               registerCurrentAjaxRequest: function(channel, jqXHR) {
-                       this._createOrGetChanel(channel).jqXHR = jqXHR;
-               },
-
-               // aborts the current request for channel with name channel
-               abortCurrentRequestForChannel: function(channel) {
-                       this._createOrGetChanel(channel).abort();
+                       return c.schedule(callback);
                },
 
                // Tells the ChannelManager that the current callback in 
channel with given name
@@ -365,6 +336,58 @@
        Wicket.ChannelManager.FunctionsExecuter = FunctionsExecuter;
 
        /**
+        * Channel manager maintains a map of channels.
+        */
+       Wicket.AjaxRequestMonitor = Wicket.Class.create();
+
+       Wicket.AjaxRequestMonitor.prototype = {
+               initialize: function () {
+                       this.requests = [];
+               },
+
+               init: function() {
+                       var requests = this.requests;
+                       Wicket.Event.subscribe('/ajax/call/beforeSend',
+                               function(jqEvent, attributes, jqXHR, 
errorThrown, textStatus) {
+                                       requests [attributes.ch] = jqXHR;
+                               }
+                       );
+
+                       Wicket.Event.subscribe('/ajax/call/complete',
+                               function(jqEvent, attributes, jqXHR, 
errorThrown, textStatus) {
+                                       delete requests[attributes.ch];
+                               }
+                       );
+               },
+
+               getReuest: function (channel) {
+                       var channelName = channel;
+                       // (ajax channel)
+                       if (typeof (channelName) !== 'string') {
+                               channelName = '0|s';
+                       }
+                       return this.requests[channelName];
+
+               },
+
+               abortRequest: function (channel) {
+                       var channelName = channel;
+                       // (ajax channel)
+                       if (typeof(channelName) !== 'string') {
+                               channelName = '0|s';
+                       }
+                       var jqXHR = getReuest(channelName);
+                       if (jqXHR) {
+                               try {
+                                       jqXHR.abort();
+                               } catch (exception) {
+                                       Wicket.Log.error("Couldn't abort 
current AJAX request:", exception);
+                               }
+                       }
+               }
+       };
+
+       /**
         * The Ajax.Request class encapsulates a XmlHttpRequest.
         */
        Wicket.Ajax = {};
@@ -576,6 +599,7 @@
                 */
                ajax: function (attrs) {
                        this._initializeDefaults(attrs);
+
                        var res = Wicket.channelManager.schedule(attrs.ch, 
Wicket.bind(function () {
                                this.doAjax(attrs);
                        }, this));
@@ -583,32 +607,6 @@
                },
 
                /**
-                * Aborts current AJAX request, if any is running, for channel 
@channel.
-                *
-                * WARNING! Mind that this does not implies the server will 
immediately know about
-                * request being aborted. And there is no reliable way to tell 
server to stop process
-                * started by halted request. Thus server side processing of 
request and, by consequence,
-                * Wicket's lock on page night continue. Therefore any 
following AJAX requests might need to wait at
-                * server side for lock on page to be released. Nevertheless, 
this method might prove useful, for instance,
-                * in order to abort/halt big AJAX uploads.
-                *
-                * TODO: implement some kind of client side mechanism + server 
side counterpart allowing to tell server
-                * please discard/request + release page lock?
-                *
-                * @param {String} channel - the name of the channel. If no 
parameter is provided then default channel is
-                *        assumed.
-                */
-               abortRequest: function (channel) {
-                       var attr = {};
-                       if (isUndef(channel) || typeof(channel) !== 'string') {
-                               this._initializeDefaults(attr);
-                       } else {
-                               attr.ch = channel;
-                       }
-                       
Wicket.channelManager.abortCurrentRequestForChannel(attr.ch);
-               },
-
-               /**
                 * Is an element still present for Ajax requests. 
                 */
                _isPresent: function(id) {
@@ -750,9 +748,6 @@
                                contentType: wwwFormUrlEncoded,
                                
                                beforeSend: function (jqXHR, settings) {
-                                       if (attrs.async) {
-                                               
Wicket.channelManager.registerCurrentAjaxRequest(attrs.ch, jqXHR);
-                                       }
                                        self._executeHandlers(attrs.bsh, attrs, 
jqXHR, settings);
                                        we.publish(topic.AJAX_CALL_BEFORE_SEND, 
attrs, jqXHR, settings);
 
@@ -1702,11 +1697,6 @@
 
                                return Wicket.Ajax.ajax(attrs);
                        },
-                       // aborts an AJAX request
-                       abortRequest: function(channel) {
-                               var call = new Wicket.Ajax.Call();
-                               call.abortRequest(channel);
-                       },
 
                        ajax: function(attrs) {
 
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
index f7ace30..448537f 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/FileUploadPage.java
@@ -136,7 +136,7 @@ public class FileUploadPage extends BasePage
                        @Override
                        public void renderHead(IHeaderResponse response)
                        {
-                               String script = "$('#" + 
cancelUpload.getMarkupId() +"').on('click', function() { 
Wicket.Ajax.abortRequest(); });";
+                               String script = "$('#" + 
cancelUpload.getMarkupId() +"').on('click', function() { 
window.requestMonitor.abortRequest(); });";
                                
response.render(OnDomReadyHeaderItem.forScript(script));
                        }
                };
@@ -173,6 +173,11 @@ public class FileUploadPage extends BasePage
                add(drop);
        }
 
+       @Override
+       public void renderHead(IHeaderResponse response) {
+               
response.render(OnDomReadyHeaderItem.forScript("window.requestMonitor = new 
Wicket.AjaxRequestMonitor(); window.requestMonitor.init();"));
+       }
+
        private String showCancelUploadButtonScript() {
                return "$('#" + cancelUpload.getMarkupId() + "').show();";
        }

Reply via email to