jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/335450 )

Change subject: Abort individual uploads instead of all
......................................................................


Abort individual uploads instead of all

When removing an ongoing upload, abort is triggered.
That abort, however, triggers all ongoing API requests,
so it also kills other ongoing uploads (and potentially
other non-related API requests)

This will keep track of the API requests and only kill
the relevant ones.

Change-Id: I96250a6874a1e4d0fbc470e49fa4e25231a85b53
---
M resources/handlers/mw.ApiUploadFormDataHandler.js
M resources/mw.UploadWizard.js
M resources/transports/mw.FormDataTransport.js
M tests/qunit/transports/mw.FormDataTransport.test.js
4 files changed, 34 insertions(+), 13 deletions(-)

Approvals:
  MarkTraceur: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/resources/handlers/mw.ApiUploadFormDataHandler.js 
b/resources/handlers/mw.ApiUploadFormDataHandler.js
index 19f9d61..3f079dc 100644
--- a/resources/handlers/mw.ApiUploadFormDataHandler.js
+++ b/resources/handlers/mw.ApiUploadFormDataHandler.js
@@ -60,7 +60,7 @@
                                return handler.transport.upload( 
handler.upload.file, handler.upload.title.getMainText() )
                                        .progress( function ( fraction ) {
                                                if ( handler.upload.state === 
'aborted' ) {
-                                                       
handler.transport.api.abort();
+                                                       
handler.transport.abort();
                                                        return;
                                                }
 
diff --git a/resources/mw.UploadWizard.js b/resources/mw.UploadWizard.js
index 2a5684d..9af12f5 100644
--- a/resources/mw.UploadWizard.js
+++ b/resources/mw.UploadWizard.js
@@ -92,6 +92,8 @@
                        var api = new mw.Api( options );
 
                        api.ajax = function ( parameters, ajaxOptions ) {
+                               var original, override;
+
                                $.extend( parameters, {
                                        errorformat: 'html',
                                        errorlang: mw.config.get( 
'wgUserLanguage' ),
@@ -99,7 +101,11 @@
                                        formatversion: 2
                                } );
 
-                               return mw.Api.prototype.ajax.apply( this, [ 
parameters, ajaxOptions ] ).then(
+                               original = mw.Api.prototype.ajax.apply( this, [ 
parameters, ajaxOptions ] );
+
+                               // we'll attach a default error handler that 
makes sure error
+                               // output is always, reliably, in the same 
format
+                               override = original.then(
                                        null, // done handler - doesn't need 
overriding
                                        function ( code, result ) { // fail 
handler
                                                var response = { errors: [ {
@@ -123,6 +129,13 @@
                                                return $.Deferred().reject( 
code, response, response );
                                        }
                                );
+
+                               /*
+                                * After attaching (.then) our error handler, a 
new promise is
+                                * returned. The original promise had an 
'abort' method, which
+                                * we'll also want to make use of...
+                                */
+                               return override.promise( { abort: 
original.abort } );
                        };
 
                        return api;
diff --git a/resources/transports/mw.FormDataTransport.js 
b/resources/transports/mw.FormDataTransport.js
index 9a9d87f..51d0772 100644
--- a/resources/transports/mw.FormDataTransport.js
+++ b/resources/transports/mw.FormDataTransport.js
@@ -27,13 +27,19 @@
                this.maxRetries = 2;
                this.retries = 0;
                this.firstPoll = false;
+
+               // running API request
+               this.request = null;
        };
 
        OO.mixinClass( mw.FormDataTransport, OO.EventEmitter );
 
        mw.FormDataTransport.prototype.abort = function () {
                this.aborted = true;
-               this.api.abort();
+
+               if ( this.request ) {
+                       this.request.abort();
+               }
        };
 
        /**
@@ -43,10 +49,9 @@
         * @return {jQuery.Promise}
         */
        mw.FormDataTransport.prototype.post = function ( params ) {
-               var deferred = $.Deferred(),
-                       request;
+               var deferred = $.Deferred();
 
-               request = this.api.post( params, {
+               this.request = this.api.post( params, {
                        /*
                         * $.ajax is not quite equiped to handle File uploads 
with params.
                         * The most convenient way would be to submit it with a 
FormData
@@ -75,7 +80,7 @@
                } );
 
                // just pass on success & failures
-               request.then( deferred.resolve, deferred.reject );
+               this.request.then( deferred.resolve, deferred.reject );
 
                return deferred.promise();
        };
@@ -193,7 +198,6 @@
                        chunk;
 
                if ( this.aborted ) {
-                       this.api.abort();
                        return $.Deferred().reject( 'aborted', {
                                errors: [ {
                                        code: 'aborted',
@@ -359,7 +363,7 @@
                }
                params.checkstatus = true;
                params.filekey = this.filekey;
-               return this.api.post( params )
+               this.request = this.api.post( params )
                        .then( function ( response ) {
                                if ( response.upload && response.upload.result 
=== 'Poll' ) {
                                        // If concatenation takes longer than 
10 minutes give up
@@ -390,6 +394,7 @@
                        }, function ( code, result ) {
                                return $.Deferred().reject( code, result );
                        } );
-       };
 
+               return this.request;
+       };
 }( mediaWiki, jQuery, OO ) );
diff --git a/tests/qunit/transports/mw.FormDataTransport.test.js 
b/tests/qunit/transports/mw.FormDataTransport.test.js
index c47ded2..7d47991 100644
--- a/tests/qunit/transports/mw.FormDataTransport.test.js
+++ b/tests/qunit/transports/mw.FormDataTransport.test.js
@@ -40,13 +40,16 @@
        } );
 
        QUnit.test( 'abort', 3, function ( assert ) {
-               var transport = createTransport( 0, { abort: 
this.sandbox.stub() } );
+               var transport = createTransport( 0 ),
+                       request = $.Deferred().promise( { abort: 
this.sandbox.stub() } );
 
-               assert.ok( transport.api.abort.notCalled );
+               transport.request = request;
+
+               assert.ok( request.abort.notCalled );
 
                transport.abort();
 
-               assert.ok( transport.api.abort.called );
+               assert.ok( request.abort.called );
                assert.ok( transport.aborted );
        } );
 

-- 
To view, visit https://gerrit.wikimedia.org/r/335450
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I96250a6874a1e4d0fbc470e49fa4e25231a85b53
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/UploadWizard
Gerrit-Branch: master
Gerrit-Owner: Matthias Mullie <mmul...@wikimedia.org>
Gerrit-Reviewer: Bartosz DziewoƄski <matma....@gmail.com>
Gerrit-Reviewer: MarkTraceur <mholmqu...@wikimedia.org>
Gerrit-Reviewer: Matthias Mullie <mmul...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to