From 2db3feb596245c22b7b5b83fc869d5ead7c94c6a Mon Sep 17 00:00:00 2001
From: diosmosis <benakamoorthi@fastmail.fm>
Date: Fri, 22 Aug 2014 12:53:19 -0700
Subject: [PATCH] Add another test for multiple aborts called on piwikApi
 angular object and refactor code changes made to piwik-api.js.

---
 .../angularjs/common/services/piwik-api.js    | 22 +++++++++----------
 .../common/services/piwik-api_spec.js         | 17 ++++++++++++++
 2 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/plugins/CoreHome/angularjs/common/services/piwik-api.js b/plugins/CoreHome/angularjs/common/services/piwik-api.js
index 69b9623658..aed0f7695b 100644
--- a/plugins/CoreHome/angularjs/common/services/piwik-api.js
+++ b/plugins/CoreHome/angularjs/common/services/piwik-api.js
@@ -42,13 +42,11 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo
      * @return $promise
      */
     function send () {
-
-        var deferred = $q.defer();
-        var requestHandle = deferred;
+        var deferred = $q.defer(),
+            requestPromise = deferred.promise;
 
         var onError = function (message) {
             deferred.reject(message);
-            requestHandle = null;
         };
 
         var onSuccess = function (response) {
@@ -67,11 +65,9 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo
                 } else {
                     onError(null);
                 }
-
             } else {
                 deferred.resolve(response);
             }
-            requestHandle = null;
         };
 
         var headers = {
@@ -86,25 +82,27 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo
             responseType: format,
             params: _mixinDefaultGetParams(getParams),
             data: $.param(getPostParams(postParams)),
-            timeout: deferred.promise,
+            timeout: requestPromise,
             headers: headers
         };
 
         $http(ajaxCall).success(onSuccess).error(onError);
 
+        // we can't modify requestPromise directly and add an abort method since for some reason it gets
+        // removed after then/finally/catch is called.
         var request = {
             then: function () {
-                deferred.promise.then.apply(deferred.promise, arguments);
+                requestPromise.then.apply(requestPromise, arguments);
                 return this;
             },
 
             'finally': function () {
-                deferred.promise['finally'].apply(deferred.promise, arguments);
+                requestPromise['finally'].apply(requestPromise, arguments);
                 return this;
             },
 
-            'catch': function () { // TODO: cleanup deferred.promise references
-                deferred.promise['catch'].apply(deferred.promise, arguments);
+            'catch': function () {
+                requestPromise['catch'].apply(requestPromise, arguments);
                 return this;
             },
 
@@ -176,6 +174,8 @@ angular.module('piwikApp.service').factory('piwikApi', function ($http, $q, $roo
         allRequests.forEach(function (request) {
             request.abort();
         });
+
+        allRequests = [];
     };
 
     /**
diff --git a/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js b/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js
index f5033333d3..278861c283 100644
--- a/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js
+++ b/plugins/CoreHome/angularjs/common/services/piwik-api_spec.js
@@ -57,6 +57,23 @@ describe('piwikApiClient', function () {
         $httpBackend.flush();
     });
 
+    it("should not fail when multiple aborts are issued", function (done) {
+        var request = piwikApi.fetch({
+            method: "SomePlugin.action"
+        }).then(function (response) {
+            done(new Error("Aborted request succeeded!"));
+        }).catch(function (ex) {
+            done(ex);
+        });
+
+        request.abort();
+        request.abort();
+
+        $httpBackend.flush();
+
+        request.abort();
+    });
+
     it("should send multiple requests concurrently when fetch is called more than once", function (done) {
         var request1Done, request2Done;
 
-- 
GitLab