MarkTraceur has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/178207

Change subject: Replace FDT callbacks with OOJS events
......................................................................

Replace FDT callbacks with OOJS events

I think this is much cleaner.

Bug: T77124
Change-Id: I8513b7360271300efd478db8e98292623d306aa8
---
M UploadWizard.php
M resources/mw.ApiUploadFormDataHandler.js
M resources/mw.FormDataTransport.js
3 files changed, 58 insertions(+), 40 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UploadWizard 
refs/changes/07/178207/1

diff --git a/UploadWizard.php b/UploadWizard.php
index 1f5dc63..e3e46e4 100644
--- a/UploadWizard.php
+++ b/UploadWizard.php
@@ -99,6 +99,10 @@
 
 $wgResourceModules['ext.uploadWizard.formDataTransport'] = array(
        'scripts' => 'mw.FormDataTransport.js',
+
+       'dependencies' => array(
+               'oojs',
+       ),
 ) + $uploadWizardModuleInfo;
 
 $wgResourceModules['ext.uploadWizard.iFrameTransport'] = array(
diff --git a/resources/mw.ApiUploadFormDataHandler.js 
b/resources/mw.ApiUploadFormDataHandler.js
index 22a7aa5..eb2ff09 100644
--- a/resources/mw.ApiUploadFormDataHandler.js
+++ b/resources/mw.ApiUploadFormDataHandler.js
@@ -20,15 +20,12 @@
                this.transport = new mw.FormDataTransport(
                        this.$form[0].action,
                        this.formData,
-                       this.upload,
-                       function ( fraction ) {
-                               handler.upload.setTransportProgress( fraction );
-                       },
-                       function ( result ) {
-                               handler.upload.setTransported( result );
-                       }
-               );
-
+                       this.upload
+               ).on( 'progress', function ( fraction ) {
+                       handler.upload.setTransportProgress( fraction );
+               } ).on( 'transported', function ( result ) {
+                       handler.upload.setTransported( result );
+               } );
        };
 
        mw.ApiUploadFormDataHandler.prototype = {
diff --git a/resources/mw.FormDataTransport.js 
b/resources/mw.FormDataTransport.js
index efa4fc2..95b9a93 100644
--- a/resources/mw.FormDataTransport.js
+++ b/resources/mw.FormDataTransport.js
@@ -1,19 +1,20 @@
-( function ( mw, $ ) {
+( function ( mw, $, oo ) {
        /**
-        * Represents a "transport" for files to upload; using html5 FormData.
+        * @class mw.FormDataTransport
+        * Represents a "transport" for files to upload; using HTML5 FormData.
+        * @extends oo.EventEmitter
         *
-        * @param form            jQuery selector for HTML form with selected 
file
-        * @param formData        object with additinal form fields required 
for upload api call
-        * @param progressCb    callback to execute when we've started.
-        * @param transportedCb callback to execute when we've finished the 
upload
+        * @constructor
+        * @param {string} postUrl URL to post to.
+        * @param {Object} formData Additional form fields required for upload 
api call
+        * @param {mw.UploadWizardUpload} uploadObject Stupidly included object 
that is controlling the upload details
         */
-
-       mw.FormDataTransport = function ( postUrl, formData, uploadObject, 
progressCb, transportedCb ) {
+       mw.FormDataTransport = function ( postUrl, formData, uploadObject ) {
                var profile = $.client.profile();
 
+               oo.EventEmitter.call( this );
+
                this.formData = formData;
-               this.progressCb = progressCb;
-               this.transportedCb = transportedCb;
                this.uploadObject = uploadObject;
 
                this.postUrl = postUrl;
@@ -36,6 +37,8 @@
                this.insufficientFormDataSupport = profile.name === 'firefox' 
&& profile.versionNumber < 7;
        };
 
+       oo.inheritClass( mw.FormDataTransport, oo.EventEmitter );
+
        mw.FormDataTransport.prototype = {
                upload: function () {
                        var formData,
@@ -54,23 +57,25 @@
                        } else {
                                this.xhr = new XMLHttpRequest();
                                this.xhr.addEventListener('load', function 
(evt) {
-                                       transport.parseResponse(evt, 
transport.transportedCb);
+                                       transport.emitParsedResponse( evt );
                                }, false);
                                this.xhr.addEventListener('error', function 
(evt) {
-                                       transport.parseResponse(evt, 
transport.transportedCb);
+                                       transport.emitParsedResponse( evt );
                                }, false);
-                               this.xhr.upload.addEventListener('progress', 
function (evt) {
+
+                               this.xhr.upload.addEventListener( 'progress', 
function ( evt ) {
                                        if ( transport.uploadObject.state === 
'aborted' ) {
                                                transport.xhr.abort();
                                                return;
                                        }
-                                       if (evt.lengthComputable) {
+
+                                       if ( evt.lengthComputable ) {
                                                var progress = 
parseFloat(evt.loaded / evt.total );
-                                               transport.progressCb(progress);
+                                               transport.emit( 'progress', 
progress );
                                        }
                                }, false);
                                this.xhr.addEventListener('abort', function 
(evt) {
-                                       transport.parseResponse(evt, 
transport.transportedCb);
+                                       transport.emitParsedResponse( evt );
                                }, false);
 
                                formData = new FormData();
@@ -122,7 +127,7 @@
                                        }
                                        if (response.upload && 
response.upload.result === 'Success') {
                                                //upload finished and can be 
unstashed later
-                                               
transport.transportedCb(response);
+                                               transport.emit( 'transported', 
response );
                                        } else if (response.upload && 
response.upload.result === 'Poll') {
                                                //Server not ready, wait for 3 
seconds
                                                setTimeout(function () {
@@ -139,7 +144,7 @@
                                                if (transport.maxRetries > 0 && 
transport.retries >= transport.maxRetries) {
                                                        mw.log.warn( 'Max 
retries exceeded on unknown response' );
                                                        //upload failed, raise 
response
-                                                       
transport.transportedCb(response);
+                                                       transport.emit( 
'transported', response );
                                                } else {
                                                        mw.log( 'Retry #' + 
transport.retries + ' on unknown response' );
                                                        setTimeout(function () {
@@ -154,7 +159,7 @@
                                transport.retries++;
                                if (transport.maxRetries > 0 && 
transport.retries >= transport.maxRetries) {
                                        mw.log.warn( 'Max retries exceeded on 
error event' );
-                                       transport.parseResponse(evt, 
transport.transportedCb);
+                                       transport.emitParsedResponse( evt );
                                } else {
                                        mw.log( 'Retry #' + transport.retries + 
' on error event' );
                                        setTimeout(function () {
@@ -162,17 +167,17 @@
                                        }, 3000);
                                }
                        }, false);
-                       this.xhr.upload.addEventListener('progress', function 
(evt) {
+                       this.xhr.upload.addEventListener( 'progress', function 
( evt ) {
                                if ( transport.uploadObject.state === 'aborted' 
) {
                                        transport.xhr.abort();
                                }
-                               if (evt.lengthComputable) {
+                               if ( evt.lengthComputable ) {
                                        var progress = parseFloat( offset + 
evt.loaded ) / bytesAvailable;
-                                       transport.progressCb(progress);
+                                       transport.emit( 'progress', progress );
                                }
-                       }, false);
+                       }, false );
                        this.xhr.addEventListener('abort', function (evt) {
-                               transport.parseResponse(evt, 
transport.transportedCb);
+                               transport.emitParsedResponse( evt );
                        }, false);
 
                        if (this.insufficientFormDataSupport) {
@@ -229,10 +234,10 @@
                                        if (response.upload && 
response.upload.result === 'Poll') {
                                                //If concatenation takes longer 
than 10 minutes give up
                                                if ( ( ( new Date() ).getTime() 
- transport.firstPoll ) > 10 * 60 * 1000 ) {
-                                                       
transport.transportedCb({
+                                                       transport.emit( 
'transported', {
                                                                code: 
'server-error',
                                                                info: 'unknown 
server error'
-                                                       });
+                                                       } );
                                                //Server not ready, wait for 3 
more seconds
                                                } else {
                                                        if ( 
response.upload.stage === undefined && window.console ) {
@@ -249,14 +254,14 @@
                                                        }
                                                }
                                        } else {
-                                               
transport.transportedCb(response);
+                                               transport.emit( 'transported', 
response );
                                        }
                                } )
                                .fail( function (status, response) {
-                                       transport.transportedCb(response);
+                                       transport.emit( 'transported', response 
);
                                } );
                },
-               parseResponse: function (evt, callback) {
+               parseResponse: function ( evt, cb ) {
                        var response;
                        try {
                                response = $.parseJSON(evt.target.responseText);
@@ -268,7 +273,19 @@
                                        }
                                };
                        }
-                       callback(response);
+
+                       cb( response );
+               },
+
+               /**
+                * Emits a 'transported' event with an object indicating status,
+                * parsed from JSON in the event body.
+                * @param {Event} evt The response event.
+                */
+               emitParsedResponse: function ( evt ) {
+                       this.parseResponse( evt, function ( response ) {
+                               this.emit( 'transported', response );
+                       } );
                },
                geckoFormData: function () {
                        var formData, onload,
@@ -344,4 +361,4 @@
                        return formData;
                }
        };
-}( mediaWiki, jQuery ) );
+}( mediaWiki, jQuery, OO ) );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8513b7360271300efd478db8e98292623d306aa8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/UploadWizard
Gerrit-Branch: master
Gerrit-Owner: MarkTraceur <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to