*/
function fnv132( str ) {
var hash = 0x811C9DC5,
- i;
+ i = 0;
/* eslint-disable no-bitwise */
- for ( i = 0; i < str.length; i++ ) {
+ for ( ; i < str.length; i++ ) {
hash += ( hash << 1 ) + ( hash << 4 ) + ( hash << 7 ) + ( hash << 8 ) + ( hash << 24 );
hash ^= str.charCodeAt( i );
}
* @private
* @class
*/
- StringSet = window.Set || function StringSet() {
+ StringSet = window.Set || function () {
var set = Object.create( null );
- this.add = function ( value ) {
- set[ value ] = true;
- };
- this.has = function ( value ) {
- return value in set;
+ return {
+ add: function ( value ) {
+ set[ value ] = true;
+ },
+ has: function ( value ) {
+ return value in set;
+ }
};
};
}
* 'dependencies': ['required.foo', 'bar.also', ...]
* 'group': 'somegroup', (or) null
* 'source': 'local', (or) 'anotherwiki'
- * 'skip': 'return !!window.Example', (or) null
+ * 'skip': 'return !!window.Example', (or) null, (or) boolean result of skip
* 'module': export Object
*
* // Set from execute() or mw.loader.state()
* 'state': 'registered', 'loaded', 'loading', 'ready', 'error', or 'missing'
*
* // Optionally added at run-time by mw.loader.implement()
- * 'skipped': true
* 'script': closure, array of urls, or string
* 'style': { ... } (see #execute)
* 'messages': { 'key': 'value', ... }
/**
* @private
- * @param {Array} modules List of module names
+ * @param {string[]} modules List of module names
* @return {string} Hash of concatenated version hashes.
*/
function getCombinedVersion( modules ) {
* execute the module or job now.
*
* @private
- * @param {Array} modules Names of modules to be checked
+ * @param {string[]} modules Names of modules to be checked
* @return {boolean} True if all modules are in state 'ready', false otherwise
*/
function allReady( modules ) {
- var i;
- for ( i = 0; i < modules.length; i++ ) {
+ var i = 0;
+ for ( ; i < modules.length; i++ ) {
if ( mw.loader.getState( modules[ i ] ) !== 'ready' ) {
return false;
}
* @return {boolean} True if no modules are in state 'error' or 'missing', false otherwise
*/
function anyFailed( modules ) {
- var i, state;
- for ( i = 0; i < modules.length; i++ ) {
+ var state,
+ i = 0;
+ for ( ; i < modules.length; i++ ) {
state = mw.loader.getState( modules[ i ] );
if ( state === 'error' || state === 'missing' ) {
return true;
throw new Error( 'Unknown dependency: ' + module );
}
- if ( registry[ module ].skip !== null ) {
+ if ( typeof registry[ module ].skip === 'string' ) {
// eslint-disable-next-line no-new-func
- skip = new Function( registry[ module ].skip );
- registry[ module ].skip = null;
- if ( skip() ) {
- registry[ module ].skipped = true;
+ skip = ( new Function( registry[ module ].skip )() );
+ registry[ module ].skip = !!skip;
+ if ( skip ) {
registry[ module ].dependencies = [];
setAndPropagate( module, 'ready' );
return;
* @throws {Error} If an unregistered module or a dependency loop is encountered
*/
function resolve( modules ) {
- var i, resolved = [];
- for ( i = 0; i < modules.length; i++ ) {
+ var resolved = [],
+ i = 0;
+ for ( ; i < modules.length; i++ ) {
sortDependencies( modules[ i ], resolved );
}
return resolved;
* @return {Array} List of dependencies.
*/
function resolveStubbornly( modules ) {
- var i, saved, resolved = [];
- for ( i = 0; i < modules.length; i++ ) {
+ var saved,
+ resolved = [],
+ i = 0;
+ for ( ; i < modules.length; i++ ) {
saved = resolved.slice();
try {
sortDependencies( modules[ i ], resolved );
if ( script.parentNode ) {
script.parentNode.removeChild( script );
}
- script = null;
if ( callback ) {
callback();
callback = null;
* @param {string[]} batch
*/
function batchRequest( batch ) {
- var reqBase, splits, maxQueryLength, b, bSource, bGroup,
+ var reqBase, splits, b, bSource, bGroup,
source, group, i, modules, sourceLoadScript,
currReqBase, currReqBaseLength, moduleMap, currReqModules, l,
lastDotIndex, prefix, suffix, bytesAdded;
lang: mw.config.get( 'wgUserLanguage' ),
debug: mw.config.get( 'debug' )
};
- maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', 2000 );
// Split module list by source and by group.
splits = Object.create( null );
modules[ i ].length + 3; // '%7C'.length == 3
// If the url would become too long, create a new one, but don't create empty requests
- if ( maxQueryLength > 0 && currReqModules.length && l + bytesAdded > maxQueryLength ) {
+ if ( currReqModules.length && l + bytesAdded > mw.loader.maxQueryLength ) {
// Dispatch what we've got...
doRequest();
// .. and start again.
moduleMap = Object.create( null );
currReqModules = [];
- mw.track( 'resourceloader.splitRequest', { maxQueryLength: maxQueryLength } );
+ mw.track( 'resourceloader.splitRequest', { maxQueryLength: mw.loader.maxQueryLength } );
}
if ( !moduleMap[ prefix ] ) {
moduleMap[ prefix ] = [];
*/
moduleRegistry: registry,
+ /**
+ * Exposed for testing and debugging only.
+ *
+ * @see #batchRequest
+ * @property
+ * @private
+ */
+ maxQueryLength: $VARS.maxQueryLength,
+
/**
* @inheritdoc #newStyleTag
* @method
* @private
*/
work: function () {
- var q, batch, implementations, sourceModules;
-
- batch = [];
+ var implementations, sourceModules,
+ batch = [],
+ q = 0;
// Appends a list of modules from the queue to the batch
- for ( q = 0; q < queue.length; q++ ) {
+ for ( ; q < queue.length; q++ ) {
// Only load modules which are registered
if ( queue[ q ] in registry && registry[ queue[ q ] ].state === 'registered' ) {
// Prevent duplicate entries
return;
}
} catch ( e ) {
- mw.trackError( 'resourceloader.exception', {
- exception: e,
- source: 'store-localstorage-init'
- } );
+ // Perhaps localStorage was disabled by the user, or got corrupted.
+ // See point 3 and 4 below. (T195647)
}
// If we get here, one of four things happened: