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