summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2018-04-18 09:26:46 +0200
committerGéry Debongnie <ged@odoo.com>2018-04-18 11:43:05 +0200
commit77e5b82b7d2858b9e4d3edb8a1b44f5f754a3f0c (patch)
treeff5118adc1e11b3de840a1f72cbbd4ea5c86be68
parentc58db317329b2e7660c031aefded34e4fd8766e9 (diff)
[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.
-rw-r--r--addons/web/static/src/js/core/session.js22
1 files changed, 16 insertions, 6 deletions
diff --git a/addons/web/static/src/js/core/session.js b/addons/web/static/src/js/core/session.js
index 4760867e99f..11423eec909 100644
--- a/addons/web/static/src/js/core/session.js
+++ b/addons/web/static/src/js/core/session.js
@@ -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 || {});