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