From 81171ab3eb6f8f82e9669585efb45fc665b65bb4 Mon Sep 17 00:00:00 2001 From: jdlrobson Date: Fri, 4 Sep 2015 11:08:14 -0700 Subject: [PATCH] Add abort method to mw.api The abort method allows you to cancel any requests currently pending in the current class. Useful for cancelling no longer needed requests due some user action (for example a user switching back to edit mode from preview or a user cancelling multiple searches across different lookup widgets) Bug: T111245 Change-Id: Ie614b05fbfbddca38ea201e90053bebdd58da949 --- resources/src/mediawiki/api.js | 12 +++++++ .../mediawiki.api/mediawiki.api.test.js | 33 +++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/resources/src/mediawiki/api.js b/resources/src/mediawiki/api.js index 43b20b8b2e..79aba7732c 100644 --- a/resources/src/mediawiki/api.js +++ b/resources/src/mediawiki/api.js @@ -79,9 +79,20 @@ options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax ); this.defaults = options; + this.requests = []; }; mw.Api.prototype = { + /** + * Abort all unfinished requests issued by this Api object. + * + * @method + */ + abort: function () { + $.each( this.requests, function ( index, request ) { + request.abort(); + } ); + }, /** * Perform API get request @@ -222,6 +233,7 @@ } } ); + this.requests.push( xhr ); // Return the Promise return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) { if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) { diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js index 803345835e..56a346fb5e 100644 --- a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js +++ b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js @@ -1,4 +1,4 @@ -( function ( mw ) { +( function ( mw, $ ) { QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( { setup: function () { this.server = this.sandbox.useFakeServer(); @@ -346,4 +346,33 @@ assert.deepEqual( data, { example: { value: 'B' } } ); } ); } ); -}( mediaWiki ) ); + + QUnit.module( 'mediawiki.api (2)', { + setup: function () { + var self = this, + requests = this.requests = []; + this.api = new mw.Api(); + this.sandbox.stub( jQuery, 'ajax', function () { + var request = $.extend( { + abort: self.sandbox.spy() + }, $.Deferred() ); + requests.push( request ); + return request; + } ); + } + } ); + + QUnit.test( '#abort', 3, function ( assert ) { + this.api.get( { + a: 1 + } ); + this.api.post( { + b: 2 + } ); + this.api.abort(); + assert.ok( this.requests.length === 2, 'Check both requests triggered' ); + $.each( this.requests, function ( i, request ) { + assert.ok( request.abort.calledOnce, 'abort request number ' + i ); + } ); + } ); +}( mediaWiki, jQuery ) ); -- 2.20.1