Alex Monk has uploaded a new change for review.

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

Change subject: Use mw.Api to run requests rather than our own stuff in 
ve.init.mw.Target
......................................................................

Use mw.Api to run requests rather than our own stuff in ve.init.mw.Target

Bug: T58659
Change-Id: I18162f04c50f48606378aed62ee99fccdc3159f6
---
M modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
M modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
M modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
M modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js
M modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
M modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
M modules/ve-mw/init/ve.init.mw.LinkCache.js
M modules/ve-mw/init/ve.init.mw.Target.js
M modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js
M modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js
M modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js
M modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js
M modules/ve-mw/ui/widgets/ve.ui.MWMediaSearchWidget.js
M modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
14 files changed, 68 insertions(+), 112 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/48/186548/1

diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
index 9839271..2fd70c6 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
@@ -57,12 +57,12 @@
                wikitext = mw.html.element( tagName, attrs, new mw.html.Raw( 
extsrc ) );
 
        if ( !this.constructor.static.rendersEmpty && extsrc.trim() !== '' ) {
-               xhr = ve.init.target.constructor.static.apiRequest( {
+               xhr = new mw.Api().post( {
                        action: 'visualeditor',
                        paction: 'parsefragment',
                        page: mw.config.get( 'wgRelevantPageName' ),
                        wikitext: wikitext
-               }, { type: 'POST' } )
+               } )
                        .done( this.onParseSuccess.bind( this, deferred ) )
                        .fail( this.onParseError.bind( this, deferred ) );
                return deferred.promise( { abort: xhr.abort } );
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
index c61e439..2c85a63 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js
@@ -81,7 +81,7 @@
 ve.ce.MWImageNode.prototype.generateContents = function () {
        var xhr, deferred = $.Deferred();
 
-       xhr = ve.init.target.constructor.static.apiRequest( {
+       xhr = new mw.Api().get( {
                action: 'query',
                prop: 'imageinfo',
                iiprop: 'url',
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
index 2475fe5..9f87613 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js
@@ -76,13 +76,13 @@
 /** */
 ve.ce.MWTransclusionNode.prototype.generateContents = function ( config ) {
        var xhr, deferred = $.Deferred();
-       xhr = ve.init.target.constructor.static.apiRequest( {
+       xhr = new mw.Api().post( {
                action: 'visualeditor',
                paction: 'parsefragment',
                page: mw.config.get( 'wgRelevantPageName' ),
                wikitext: ( config && config.wikitext ) || 
this.model.getWikitext(),
                pst: 1
-       }, { type: 'POST' } )
+       } )
                .done( this.onParseSuccess.bind( this, deferred ) )
                .fail( this.onParseError.bind( this, deferred ) );
 
diff --git a/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js 
b/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js
index dd60447..2e5dca4 100644
--- a/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js
+++ b/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js
@@ -231,14 +231,14 @@
        };
 
        ve.dm.MWTransclusionModel.prototype.fetchRequest = function ( titles, 
specs, queue ) {
-               return ve.init.target.constructor.static.apiRequest( {
+               var xhr = new mw.Api().get( {
                        action: 'templatedata',
                        titles: titles.join( '|' ),
                        lang: mw.config.get( 'wgUserLanguage' ),
                        redirects: '1'
-               } )
-                       .done( this.fetchRequestDone.bind( this, titles, specs 
) )
-                       .always( this.fetchRequestAlways.bind( this, queue ) );
+               } ).done( this.fetchRequestDone.bind( this, titles, specs ) );
+               xhr.always( this.fetchRequestAlways.bind( this, queue, xhr ) );
+               return xhr;
        };
 
        ve.dm.MWTransclusionModel.prototype.fetchRequestDone = function ( 
titles, specs, data ) {
@@ -278,7 +278,7 @@
                }
        };
 
-       ve.dm.MWTransclusionModel.prototype.fetchRequestAlways = function ( 
queue, data, textStatus, jqXHR ) {
+       ve.dm.MWTransclusionModel.prototype.fetchRequestAlways = function ( 
queue, jqXHR ) {
                // Prune completed request
                var index = ve.indexOf( jqXHR, this.requests );
                if ( index !== -1 ) {
diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js 
b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
index 7d48e1a..85feaaf 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js
@@ -201,16 +201,12 @@
        // On the first call set off an async call to update the scalable's
        // original dimensions from the API.
        if ( ve.init.target ) {
-               ve.init.target.constructor.static.apiRequest(
-                       {
-                               action: 'query',
-                               prop: 'imageinfo',
-                               indexpageids: '1',
-                               iiprop: 'size|mediatype',
-                               titles: filename
-                       },
-                       { type: 'POST' }
-               )
+               new mw.Api().post( {
+                       prop: 'imageinfo',
+                       indexpageids: '1',
+                       iiprop: 'size|mediatype',
+                       titles: filename
+               } )
                .done( function ( response ) {
                        var page = response.query && 
response.query.pages[response.query.pageids[0]],
                                info = page && page.imageinfo && 
page.imageinfo[0];
diff --git a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js 
b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
index f1b3da9..f40b3af 100644
--- a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
+++ b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js
@@ -1612,11 +1612,11 @@
                }
 
                if ( prefSaysShow ) {
-                       ve.init.target.constructor.static.apiRequest( {
+                       new mw.Api().post( {
                                action: 'options',
                                token: mw.user.tokens.get( 'editToken' ),
                                change: 'visualeditor-hidebetawelcome=1'
-                       }, { type: 'POST' } );
+                       } );
 
                // No need to set a cookie every time for logged-in users that 
have already
                // set the hidebetawelcome=1 preference, but only if this isn't 
a one-off
diff --git a/modules/ve-mw/init/ve.init.mw.LinkCache.js 
b/modules/ve-mw/init/ve.init.mw.LinkCache.js
index 9590f85..701a1b5 100644
--- a/modules/ve-mw/init/ve.init.mw.LinkCache.js
+++ b/modules/ve-mw/init/ve.init.mw.LinkCache.js
@@ -173,7 +173,7 @@
                this.queue = [];
                while ( queue.length ) {
                        subqueue = queue.splice( 0, 50 ).map( normalizeTitle );
-                       ve.init.target.constructor.static.apiRequest( {
+                       new mw.Api().get( {
                                action: 'query',
                                prop: 'info|pageprops',
                                ppprop: 'disambiguation',
diff --git a/modules/ve-mw/init/ve.init.mw.Target.js 
b/modules/ve-mw/init/ve.init.mw.Target.js
index 2c2b6f4..8086afc 100644
--- a/modules/ve-mw/init/ve.init.mw.Target.js
+++ b/modules/ve-mw/init/ve.init.mw.Target.js
@@ -295,59 +295,6 @@
 /* Static Methods */
 
 /**
- * Send an AJAX request to the MediaWiki API.
- *
- * This method has special behavior for certain options. If the request type 
is POST, then
- * contentType will default to multipart/form-data. If the content type is 
multipart/form-data,
- * then the necessary emulation will be performed to make this content type 
actually work.
- *
- * @param {Object} data Query string parameters (for GET requests) or POST 
data (for POST requests)
- * @param {Object} [settings] Additional AJAX settings, or overrides of 
default settings
- * @returns {jqXHR} Return value of $.ajax()
- */
-ve.init.mw.Target.static.apiRequest = function ( data, settings ) {
-       var key, formData;
-       data = ve.extendObject( {
-               format: 'json',
-               uselang: mw.config.get( 'wgUserLanguage' )
-       }, data );
-       settings = ve.extendObject( {
-               url: mw.util.wikiScript( 'api' ),
-               dataType: 'json',
-               type: 'GET',
-               // Wait up to 100 seconds
-               timeout: 100000
-       }, settings );
-
-       // If multipart/form-data has been requested and emulation is possible, 
emulate it
-       if (
-               settings.type === 'POST' && window.FormData && (
-                       settings.contentType === undefined ||
-                       settings.contentType === 'multipart/form-data'
-               )
-       ) {
-               formData = new FormData();
-               for ( key in data ) {
-                       formData.append( key, data[key] );
-               }
-               settings.data = formData;
-               // Prevent jQuery from mangling our FormData object
-               settings.processData = false;
-               // Prevent jQuery from overriding the Content-Type header
-               settings.contentType = false;
-       } else {
-               settings.data = data;
-               if ( settings.contentType === 'multipart/form-data' ) {
-                       // We were asked to emulate but can't, so drop the 
Content-Type header, otherwise
-                       // it'll be wrong and the server will fail to decode 
the POST body
-                       delete settings.contentType;
-               }
-       }
-
-       return $.ajax( settings );
-};
-
-/**
  * Take a target document with a possibly relative base URL, and modify it to 
be absolute.
  * The base URL of the target document is resolved using the base URL of the 
source document.
  * @param {HTMLDocument} targetDoc Document whose base URL should be resolved
@@ -532,14 +479,13 @@
  *
  * @static
  * @method
- * @param {Object} jqXHR
- * @param {string} status Text status message
- * @param {Mixed} error HTTP status text
+ * @param {string} errorText Status text from mw.Api
+ * @param {Object} error Object containing xhr, textStatus and exception keys
  * @fires loadError
  */
-ve.init.mw.Target.onLoadError = function ( jqXHR, status, error ) {
+ve.init.mw.Target.onLoadError = function ( errorText, error ) {
        this.loading = false;
-       this.emit( 'loadError', jqXHR, status, error );
+       this.emit( 'loadError', error.xhr, error.textStatus, error.exception );
 };
 
 /**
@@ -1022,9 +968,9 @@
        // Load DOM
        start = ve.now();
 
-       xhr = this.constructor.static.apiRequest( data );
+       xhr = new mw.Api().get( data );
        this.loading = xhr.then(
-               function ( data, status, jqxhr ) {
+               function ( data, jqxhr ) {
                        target.events.track( 'performance.system.domLoad', {
                                bytes: $.byteLength( jqxhr.responseText ),
                                duration: ve.now() - start,
@@ -1087,13 +1033,13 @@
 
        html = EasyDeflate.deflate( this.getHtml( doc ) );
 
-       xhr = this.constructor.static.apiRequest( {
+       xhr = new mw.Api().post( {
                action: 'visualeditor',
                paction: 'serializeforcache',
                html: html,
                page: this.pageName,
                oldid: this.revid
-       }, { type: 'POST' } )
+       } )
                .done( function ( response ) {
                        var trackData = { duration: ve.now() - start };
                        if ( response.visualeditor && typeof 
response.visualeditor.cachekey === 'string' ) {
@@ -1161,7 +1107,7 @@
        data = ve.extendObject( {}, options, { format: 'json' } );
 
        function ajaxRequest( cachekey ) {
-               var start = ve.now();
+               var start = ve.now(), fullEventName;
                if ( typeof cachekey === 'string' ) {
                        data.cachekey = cachekey;
                } else {
@@ -1170,33 +1116,47 @@
                        // If using the cache key fails, we'll come back here 
with cachekey still set
                        delete data.cachekey;
                }
-               return target.constructor.static.apiRequest( data, { type: 
'POST' } )
-                       .then( function ( response, status, jqxhr ) {
-                               var fullEventName, eventData = {
-                                       bytes: $.byteLength( jqxhr.responseText 
),
-                                       duration: ve.now() - start,
-                                       parsoid: jqxhr.getResponseHeader( 
'X-Parsoid-Performance' )
-                               };
-                               if ( response.error && response.error.code === 
'badcachekey' ) {
-                                       // Log the failure if eventName was set
+               return new mw.Api().post( data )
+                       .then(
+                               function ( response, jqxhr ) {
+                                       var eventData = {
+                                               bytes: $.byteLength( 
jqxhr.responseText ),
+                                               duration: ve.now() - start,
+                                               parsoid: 
jqxhr.getResponseHeader( 'X-Parsoid-Performance' )
+                                       };
+
+                                       // Log data about the request if 
eventName was set
                                        if ( eventName ) {
-                                               fullEventName = 
'performance.system.' + eventName + '.badCacheKey';
+                                               fullEventName = 
'performance.system.' + eventName +
+                                                       ( typeof cachekey === 
'string' ? '.withCacheKey' : '.withoutCacheKey' );
                                                target.events.track( 
fullEventName, eventData );
+                                       }
+                                       return jqxhr;
+                               },
+                               function ( errorName, errorObject ) {
+                                       var eventData;
+                                       if ( errorObject && errorObject.xhr ) {
+                                               eventData = {
+                                                       bytes: $.byteLength( 
errorObject.xhr.responseText ),
+                                                       duration: ve.now() - 
start,
+                                                       parsoid: 
errorObject.xhr.getResponseHeader( 'X-Parsoid-Performance' )
+                                               };
+
+                                               if ( eventName ) {
+                                                       if ( errorName === 
'badcachekey' ) {
+                                                               fullEventName = 
'performance.system.' + eventName + '.badCacheKey';
+                                                       } else {
+                                                               fullEventName = 
'performance.system.' + eventName + '.withoutCacheKey';
+                                                       }
+                                                       target.events.track( 
fullEventName, eventData );
+                                               }
                                        }
                                        // This cache key is evidently bad, 
clear it
                                        target.clearPreparedCacheKey();
                                        // Try again without a cache key
                                        return ajaxRequest( null );
                                }
-
-                               // Log data about the request if eventName was 
set
-                               if ( eventName ) {
-                                       fullEventName = 'performance.system.' + 
eventName +
-                                               ( typeof cachekey === 'string' 
? '.withCacheKey' : '.withoutCacheKey' );
-                                       target.events.track( fullEventName, 
eventData );
-                               }
-                               return jqxhr;
-                       } );
+                       );
        }
 
        // If we successfully get prepared wikitext, then invoke ajaxRequest() 
with the cache key,
diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js 
b/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js
index d6c7d0b..58dbc07 100644
--- a/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js
+++ b/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js
@@ -915,7 +915,7 @@
                } ];
 
        if ( !this.fileRepoPromise ) {
-               this.fileRepoPromise = 
ve.init.target.constructor.static.apiRequest( {
+               this.fileRepoPromise = new mw.Api().get( {
                        action: 'query',
                        meta: 'filerepoinfo'
                } ).then(
diff --git a/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js 
b/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js
index 6a7761c..f74c86c 100644
--- a/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js
+++ b/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js
@@ -161,7 +161,7 @@
 ve.ui.MWLanguagesPage.prototype.getAllLanguageItems = function () {
        var deferred = $.Deferred();
        // TODO: Detect paging token if results exceed limit
-       ve.init.target.constructor.static.apiRequest( {
+       new mw.Api().get( {
                action: 'visualeditor',
                paction: 'getlanglinks',
                page: mw.config.get( 'wgPageName' )
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js
index 01c58dd..7f221eb 100644
--- a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js
+++ b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js
@@ -50,7 +50,7 @@
  * @inheritdoc
  */
 ve.ui.MWCategoryInputWidget.prototype.getLookupRequest = function () {
-       return ve.init.target.constructor.static.apiRequest( {
+       return new mw.Api().get( {
                action: 'query',
                generator: 'allcategories',
                gacmin: 1,
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js
index 08b1111..9262362 100644
--- a/modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js
+++ b/modules/ve-mw/ui/widgets/ve.ui.MWLinkTargetInputWidget.js
@@ -38,7 +38,7 @@
        this.lookupMenu.$element.addClass( 've-ui-mwLinkTargetInputWidget-menu' 
);
 
        this.interwikiPrefixes = [];
-       this.interwikiPrefixesPromise = 
ve.init.target.constructor.static.apiRequest( {
+       this.interwikiPrefixesPromise = new mw.Api().get( {
                action: 'query',
                meta: 'siteinfo',
                siprop: 'interwikimap'
@@ -132,7 +132,7 @@
                                        }]
                                } } ).promise( promiseAbortObject );
                        } else {
-                               req = 
ve.init.target.constructor.static.apiRequest( {
+                               req = new mw.Api().get( {
                                        action: 'query',
                                        generator: 'prefixsearch',
                                        gpssearch: widget.value,
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWMediaSearchWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWMediaSearchWidget.js
index f1fcf88..77d3e1c 100644
--- a/modules/ve-mw/ui/widgets/ve.ui.MWMediaSearchWidget.js
+++ b/modules/ve-mw/ui/widgets/ve.ui.MWMediaSearchWidget.js
@@ -165,7 +165,7 @@
                                };
                        }
                        this.query.pushPending();
-                       request = ve.init.target.constructor.static.apiRequest( 
{
+                       request = new mw.Api().get( {
                                action: 'query',
                                generator: 'search',
                                gsrsearch: value,
diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js 
b/modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
index 77ae3f1..136ada3 100644
--- a/modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
+++ b/modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
@@ -76,7 +76,7 @@
                value = value.slice( 1 );
        }
 
-       return ve.init.target.constructor.static.apiRequest( {
+       return new mw.Api().get( {
                action: 'opensearch',
                search: value,
                suggest: ''

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I18162f04c50f48606378aed62ee99fccdc3159f6
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Alex Monk <[email protected]>

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

Reply via email to