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