Skip to content
Snippets Groups Projects
Commit 77e5b82b authored by Christophe Matthieu's avatar Christophe Matthieu Committed by Géry Debongnie
Browse files

[IMP] web: allow js code to abort xhr

We have a need to be able to abort a pending xmlhttprequest.  This is
necessary for the longpoll system so it can restart properly.

With this commit, we simply propagate the abort method from the jquery
deferred to the deferred returned by the session rpc method.

Note that this is not documented on purpose. The reason is that we do
not want to commit on maintaining this feature.

It is kind of awkward to have a deferred which can be aborted, but once
it is chained, the abort feature is lost. So, for now, this will stay a
lower level feature used exclusively for our needs.
parent c58db317
No related branches found
No related tags found
No related merge requests found
......@@ -335,7 +335,15 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
delete options.shadow;
return self.check_session_id().then(function () {
var deferred = $.Deferred();
var aborted = false;
deferred.abort = function () {
aborted = true;
};
self.check_session_id().then(function () {
if (aborted) {
return deferred.reject('communication', $.Event(), 'abort', 'abort');
}
// TODO: remove
if (! _.isString(url)) {
_.extend(options, url);
......@@ -363,10 +371,11 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
options.session_id = self.session_id || '';
}
var p = fct(url, "call", params, options);
deferred.abort = p.abort.bind(p); // Allow to abort the rpc call
p = p.then(function (result) {
if (! shadow)
self.trigger('response');
return result;
return deferred.resolve(result);
}, function (type, error, textStatus, errorThrown) {
if (type === "server") {
if (! shadow)
......@@ -374,7 +383,7 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
if (error.code === 100) {
self.uid = false;
}
return $.Deferred().reject(error, $.Event());
return deferred.reject(error, $.Event());
} else {
if (! shadow)
self.trigger('response_failed');
......@@ -383,17 +392,18 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
message: "XmlHttpRequestError " + errorThrown,
data: {type: "xhr"+textStatus, debug: error.responseText, objects: [error, errorThrown] }
};
return $.Deferred().reject(nerror, $.Event());
return deferred.reject(nerror, $.Event());
}
});
return p.fail(function () { // Allow deferred user to disable rpc_error call in fail
p.fail(function (error, event) {
return deferred.fail(function () { // Allow deferred user to disable rpc_error call in fail
deferred.fail(function (error, event) {
if (!event.isDefaultPrevented()) {
self.trigger('error', error, event);
}
});
});
});
return deferred;
},
url: function (path, params) {
params = _.extend(params || {});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment