diff --git a/addons/web/static/src/js/core/session.js b/addons/web/static/src/js/core/session.js index 4760867e99ffa7c12375026795043848f6f554ba..11423eec90900127522bbddcb7e15ef727a0f2a8 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 || {});