X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=resources%2Fsrc%2Fmediawiki%2Fmediawiki.js;h=dd3d6dee644c57a3965ab908a1ca46d607e7cabf;hb=7e2e2db806f621c61851bc9df32e398a5a6d345e;hp=9c8fe70bdedaf2aec1886156f7024aaa5bed330c;hpb=52546163af81a588f3104d447657f24d071aa53f;p=lhc%2Fweb%2Fwiklou.git diff --git a/resources/src/mediawiki/mediawiki.js b/resources/src/mediawiki/mediawiki.js index 9c8fe70bde..dd3d6dee64 100644 --- a/resources/src/mediawiki/mediawiki.js +++ b/resources/src/mediawiki/mediawiki.js @@ -7,7 +7,9 @@ * @alternateClassName mediaWiki * @singleton */ -/*jshint latedef:false */ + +/* eslint-disable no-use-before-define */ + ( function ( $ ) { 'use strict'; @@ -31,7 +33,7 @@ * @return {string} hash as an seven-character base 36 string */ function fnv132( str ) { - /*jshint bitwise:false */ + /* eslint-disable no-bitwise */ var hash = 0x811C9DC5, i; @@ -46,6 +48,7 @@ } return hash; + /* eslint-enable no-bitwise */ } StringSet = window.Set || ( function () { @@ -325,12 +328,15 @@ var text; if ( !this.exists() ) { - // Use as text if key does not exist - if ( this.format === 'escaped' || this.format === 'parse' ) { - // format 'escaped' and 'parse' need to have the brackets and key html escaped - return mw.html.escape( '<' + this.key + '>' ); - } - return '<' + this.key + '>'; + // Use ⧼key⧽ as text if key does not exist + // Err on the side of safety, ensure that the output + // is always html safe in the event the message key is + // missing, since in that case its highly likely the + // message key is user-controlled. + // '⧼' is used instead of '<' to side-step any + // double-escaping issues. + // (Keep synchronised with Message::toString() in PHP.) + return '⧼' + mw.html.escape( this.key ) + '⧽'; } if ( this.format === 'plain' || this.format === 'text' || this.format === 'parse' ) { @@ -460,9 +466,9 @@ log.deprecate = !Object.defineProperty ? function ( obj, key, val ) { obj[ key ] = val; } : function ( obj, key, val, msg, logName ) { + var logged = new StringSet(); logName = logName || key; msg = 'Use of "' + logName + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' ); - var logged = new StringSet(); function uniqueTrace() { var trace = new Error().stack; if ( logged.has( trace ) ) { @@ -1109,7 +1115,7 @@ } if ( registry[ module ].skip !== null ) { - /*jshint evil:true */ + // eslint-disable-next-line no-new-func skip = new Function( registry[ module ].skip ); registry[ module ].skip = null; if ( skip() ) { @@ -1149,7 +1155,7 @@ ) ); } - unresolved.add( module ); + unresolved.add( module ); sortDependencies( deps[ i ], resolved, unresolved ); } } @@ -1162,6 +1168,7 @@ * @private * @param {string[]} modules Array of string module names * @return {Array} List of dependencies, including 'module'. + * @throws {Error} If an unregistered module or a dependency loop is encountered */ function resolve( modules ) { var resolved = []; @@ -1294,9 +1301,9 @@ } ); }; - implicitDependencies = ( $.inArray( module, legacyModules ) !== -1 ) - ? [] - : legacyModules; + implicitDependencies = ( $.inArray( module, legacyModules ) !== -1 ) ? + [] : + legacyModules; if ( module === 'user' ) { // Implicit dependency on the site module. Not real dependency because @@ -1304,9 +1311,9 @@ implicitDependencies.push( 'site' ); } - legacyWait = implicitDependencies.length - ? mw.loader.using( implicitDependencies ) - : $.Deferred().resolve(); + legacyWait = implicitDependencies.length ? + mw.loader.using( implicitDependencies ) : + $.Deferred().resolve(); legacyWait.always( function () { try { @@ -1635,9 +1642,9 @@ prefix = modules[ i ].substr( 0, lastDotIndex ); suffix = modules[ i ].slice( lastDotIndex + 1 ); - bytesAdded = hasOwn.call( moduleMap, prefix ) - ? suffix.length + 3 // '%2C'.length == 3 - : modules[ i ].length + 3; // '%7C'.length == 3 + bytesAdded = hasOwn.call( moduleMap, prefix ) ? + suffix.length + 3 : // '%2C'.length == 3 + modules[ i ].length + 3; // '%7C'.length == 3 // If the url would become too long, create a new one, // but don't create empty requests @@ -1777,6 +1784,7 @@ return true; } ); asyncEval( implementations, function ( err ) { + var failed; // Not good, the cached mw.loader.implement calls failed! This should // never happen, barring ResourceLoader bugs, browser bugs and PEBKACs. // Depending on how corrupt the string is, it is likely that some @@ -1791,7 +1799,7 @@ mw.track( 'resourceloader.exception', { exception: err, source: 'store-eval' } ); // Re-add the failed ones that are still pending back to the batch - var failed = $.grep( sourceModules, function ( module ) { + failed = $.grep( sourceModules, function ( module ) { return registry[ module ].state === 'loading'; } ); batchRequest( failed ); @@ -1986,8 +1994,12 @@ deferred.fail( error ); } - // Resolve entire dependency map - dependencies = resolve( dependencies ); + try { + // Resolve entire dependency map + dependencies = resolve( dependencies ); + } catch ( e ) { + return deferred.reject( e ).promise(); + } if ( allReady( dependencies ) ) { // Run ready immediately deferred.resolve( mw.loader.require ); @@ -2326,7 +2338,7 @@ // Partial descriptor // (e.g. skipped module, or style module with state=ready) $.inArray( undefined, [ descriptor.script, descriptor.style, - descriptor.messages, descriptor.templates ] ) !== -1 + descriptor.messages, descriptor.templates ] ) !== -1 ) { // Decline to store return false;