-/*global OO*/
+/*global OO */
( function ( mw, $ ) {
/**
- * This is a factory for MessagePoster objects, which allows a pluggable to way to script leaving a
- * talk page message.
+ * Factory for MessagePoster objects. This provides a pluggable to way to script the action
+ * of adding a message to someone's talk page.
*
* @class mw.messagePoster.factory
* @singleton
*/
- function MwMessagePosterFactory() {
- this.api = new mw.Api();
+ function MessagePosterFactory() {
this.contentModelToClass = {};
}
- OO.initClass( MwMessagePosterFactory );
+ OO.initClass( MessagePosterFactory );
// Note: This registration scheme is currently not compatible with LQT, since that doesn't
- // have its own content model, just islqttalkpage. LQT pages will be passed to the wikitext
+ // have its own content model, just islqttalkpage. LQT pages will be passed to the wikitext
// MessagePoster.
/**
- * Registers a MessagePoster subclass for a given content model.
+ * Register a MessagePoster subclass for a given content model.
*
* @param {string} contentModel Content model of pages this MessagePoster can post to
- * @param {Function} messagePosterConstructor Constructor for MessagePoster
+ * @param {Function} constructor Constructor of a MessagePoster subclass
*/
- MwMessagePosterFactory.prototype.register = function ( contentModel, messagePosterConstructor ) {
+ MessagePosterFactory.prototype.register = function ( contentModel, constructor ) {
if ( this.contentModelToClass[ contentModel ] !== undefined ) {
- throw new Error( 'The content model \'' + contentModel + '\' is already registered.' );
+ throw new Error( 'Content model "' + contentModel + '" is already registered' );
}
- this.contentModelToClass[ contentModel ] = messagePosterConstructor;
+ this.contentModelToClass[ contentModel ] = constructor;
};
/**
- * Unregisters a given content model
- * This is exposed for testing and should not normally be needed.
+ * Unregister a given content model.
+ * This is exposed for testing and should not normally be used.
*
* @param {string} contentModel Content model to unregister
*/
- MwMessagePosterFactory.prototype.unregister = function ( contentModel ) {
+ MessagePosterFactory.prototype.unregister = function ( contentModel ) {
delete this.contentModelToClass[ contentModel ];
};
/**
- * Creates a MessagePoster, given a title. A promise for this is returned.
- * This works by determining the content model, then loading the corresponding
- * module (which will register the MessagePoster class), and finally constructing it.
+ * Create a MessagePoster for given a title.
*
- * This does not require the message and should be called as soon as possible, so it does the
- * API and ResourceLoader requests in the background.
+ * A promise for this is returned. It works by determining the content model, then loading
+ * the corresponding module (which registers the MessagePoster class), and finally constructing
+ * an object for the given title.
+ *
+ * This does not require the message and should be called as soon as possible, so that the
+ * API and ResourceLoader requests run in the background.
*
* @param {mw.Title} title Title that will be posted to
+ * @param {string} [apiUrl] api.php URL if the title is on another wiki
* @return {jQuery.Promise} Promise resolving to a mw.messagePoster.MessagePoster.
* For failure, rejected with up to three arguments:
*
* - error Error explanation
* - details Further error details
*/
- MwMessagePosterFactory.prototype.create = function ( title ) {
- var pageId, page, contentModel, moduleName,
- factory = this;
+ MessagePosterFactory.prototype.create = function ( title, apiUrl ) {
+ var factory = this,
+ api = apiUrl ? new mw.ForeignApi( apiUrl ) : new mw.Api();
- return this.api.get( {
+ return api.get( {
action: 'query',
prop: 'info',
- indexpageids: 1,
+ indexpageids: true,
titles: title.getPrefixedDb()
- } ).then( function ( result ) {
- if ( result.query.pageids && result.query.pageids.length > 0 ) {
- pageId = result.query.pageids[ 0 ];
- page = result.query.pages[ pageId ];
-
- contentModel = page.contentmodel;
- moduleName = 'mediawiki.messagePoster.' + contentModel;
- return mw.loader.using( moduleName ).then( function () {
- return factory.createForContentModel(
- contentModel,
- title
- );
- }, function () {
- return $.Deferred().reject( 'failed-to-load-module', 'Failed to load the \'' + moduleName + '\' module' );
- } );
- } else {
+ } ).then( function ( data ) {
+ var pageId, page, contentModel, moduleName;
+ if ( !data.query.pageids[ 0 ] ) {
return $.Deferred().reject( 'unexpected-response', 'Unexpected API response' );
}
- }, function ( errorCode, details ) {
- return $.Deferred().reject( 'content-model-query-failed', errorCode, details );
- } ).promise();
+ pageId = data.query.pageids[ 0 ];
+ page = data.query.pages[ pageId ];
+
+ contentModel = page.contentmodel;
+ moduleName = 'mediawiki.messagePoster.' + contentModel;
+ return mw.loader.using( moduleName ).then( function () {
+ return factory.createForContentModel(
+ contentModel,
+ title,
+ api
+ );
+ }, function () {
+ return $.Deferred().reject( 'failed-to-load-module', 'Failed to load "' + moduleName + '"' );
+ } );
+ }, function ( error, details ) {
+ return $.Deferred().reject( 'content-model-query-failed', error, details );
+ } );
};
/**
* Creates a MessagePoster instance, given a title and content model
*
* @private
- *
* @param {string} contentModel Content model of title
* @param {mw.Title} title Title being posted to
+ * @param {mw.Api} api mw.Api instance that the instance should use
* @return {mw.messagePoster.MessagePoster}
*
*/
- MwMessagePosterFactory.prototype.createForContentModel = function ( contentModel, title ) {
- return new this.contentModelToClass[ contentModel ]( title );
+ MessagePosterFactory.prototype.createForContentModel = function ( contentModel, title, api ) {
+ return new this.contentModelToClass[ contentModel ]( title, api );
};
mw.messagePoster = {
- factory: new MwMessagePosterFactory()
+ factory: new MessagePosterFactory()
};
}( mediaWiki, jQuery ) );