1 ( function ( mw
, OO
, $ ) {
3 * @class mw.ForeignUpload
6 * Used to represent an upload in progress on the frontend.
8 * Subclassed to upload to a foreign API, with no other goodies. Use
9 * this for a generic foreign image repository on your wiki farm.
11 * Note you can provide the {@link #target target} or not - if the first argument is
12 * an object, we assume you want the default, and treat it as apiconfig
16 * @param {string} [target] Used to set up the target
17 * wiki. If not remote, this class behaves identically to mw.Upload (unless further subclassed)
18 * Use the same names as set in $wgForeignFileRepos for this. Also,
19 * make sure there is an entry in the $wgForeignUploadTargets array for this name.
20 * @param {Object} [apiconfig] Passed to the constructor of mw.ForeignApi or mw.Api, as needed.
22 function ForeignUpload( target
, apiconfig
) {
24 validTargets
= mw
.config
.get( 'wgForeignUploadTargets' ),
27 if ( typeof target
=== 'object' ) {
28 // target probably wasn't passed in, it must
34 // * Use the given `target` first;
35 // * If not given, fall back to default (first) ForeignUploadTarget;
36 // * If none is configured, fall back to local uploads.
37 this.target
= target
|| validTargets
[ 0 ] || 'local';
39 // Now we have several different options.
40 // If the local wiki is the target, then we can skip a bunch of steps
41 // and just return an mw.Api object, because we don't need any special
42 // configuration for that.
43 // However, if the target is a remote wiki, we must check the API
44 // to confirm that the target is one that this site is configured to
46 if ( this.target
=== 'local' ) {
47 // If local uploads were requested, but they are disabled, fail.
48 if ( !mw
.config
.get( 'wgEnableUploads' ) ) {
49 this.apiPromise
= $.Deferred().reject( 'uploaddisabledtext' );
51 // We'll ignore the CORS and centralauth stuff if the target is
53 this.apiPromise
= $.Deferred().resolve( new mw
.Api( apiconfig
) );
57 this.apiPromise
= api
.get( {
60 friprop
: [ 'name', 'scriptDirUrl', 'canUpload' ]
61 } ).then( function ( data
) {
63 repos
= data
.query
.repos
;
65 // First pass - try to find the passed-in target and check
66 // that it's configured for uploads.
70 // Skip repos that are not our target, or if they
71 // are the target, cannot be uploaded to.
72 if ( repo
.name
=== upload
.target
&& repo
.canUpload
=== '' ) {
73 return new mw
.ForeignApi(
74 repo
.scriptDirUrl
+ '/api.php',
80 return $.Deferred().reject( 'upload-foreign-cant-upload' );
84 // Build the upload object without an API - this class overrides the
85 // actual API call methods to wait for the apiPromise to resolve
87 mw
.Upload
.call( this, null );
89 if ( this.target
!== 'local' ) {
90 // Keep these untranslated. We don't know the content language of the foreign wiki, best to
91 // stick to English in the text.
92 this.setComment( 'Cross-wiki upload from ' + location
.host
);
96 OO
.inheritClass( ForeignUpload
, mw
.Upload
);
99 * @property {string} target
100 * Used to specify the target repository of the upload.
102 * If you set this to something that isn't 'local', you must be sure to
103 * add that target to $wgForeignUploadTargets in LocalSettings, and the
104 * repository must be set up to use CORS and CentralAuth.
106 * Most wikis use "shared" to refer to Wikimedia Commons, we assume that
107 * in this class and in the messages linked to it.
109 * Defaults to the first available foreign upload target,
110 * or to local uploads if no foreign target is configured.
116 ForeignUpload
.prototype.getApi = function () {
117 return this.apiPromise
;
121 * Override from mw.Upload to make sure the API info is found and allowed
123 ForeignUpload
.prototype.upload = function () {
125 return this.apiPromise
.then( function ( api
) {
127 return mw
.Upload
.prototype.upload
.call( upload
);
132 * Override from mw.Upload to make sure the API info is found and allowed
134 ForeignUpload
.prototype.uploadToStash = function () {
136 return this.apiPromise
.then( function ( api
) {
138 return mw
.Upload
.prototype.uploadToStash
.call( upload
);
142 mw
.ForeignUpload
= ForeignUpload
;
143 }( mediaWiki
, OO
, jQuery
) );