Merge "build: Add "View history" scenario for Fresnel"
[lhc/web/wiklou.git] / resources / src / startup / mediawiki.js
index 65cf316..4c20e9d 100644 (file)
         */
        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: