mw.loader: Guard against Object.prototype keys as module names
[lhc/web/wiklou.git] / resources / src / mediawiki / mediawiki.js
index bb91663..c8f5506 100644 (file)
                        function sortDependencies( module, resolved, unresolved ) {
                                var n, deps, len, skip;
 
-                               if ( registry[module] === undefined ) {
+                               if ( !hasOwn.call( registry, module ) ) {
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
 
                                // Build a list of modules which are in one of the specified states
                                for ( s = 0; s < states.length; s += 1 ) {
                                        for ( m = 0; m < modules.length; m += 1 ) {
-                                               if ( registry[modules[m]] === undefined ) {
+                                               if ( !hasOwn.call( registry, modules[m] ) ) {
                                                        // Module does not exist
                                                        if ( states[s] === 'unregistered' ) {
                                                                // OK, undefined
                                var key, value, media, i, urls, cssHandle, checkCssHandles,
                                        cssHandlesRegistered = false;
 
-                               if ( registry[module] === undefined ) {
+                               if ( !hasOwn.call( registry, module ) ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
                                } else if ( registry[module].state === 'registered' ) {
                                        throw new Error( 'Module has not been requested from the server yet: ' + module );
                                        // Appends a list of modules from the queue to the batch
                                        for ( q = 0; q < queue.length; q += 1 ) {
                                                // Only request modules which are registered
-                                               if ( registry[queue[q]] !== undefined && registry[queue[q]].state === 'registered' ) {
+                                               if ( hasOwn.call( registry, queue[q] ) && registry[queue[q]].state === 'registered' ) {
                                                        // Prevent duplicate entries
                                                        if ( $.inArray( queue[q], batch ) === -1 ) {
                                                                batch[batch.length] = queue[q];
                                        for ( b = 0; b < batch.length; b += 1 ) {
                                                bSource = registry[batch[b]].source;
                                                bGroup = registry[batch[b]].group;
-                                               if ( splits[bSource] === undefined ) {
+                                               if ( !hasOwn.call( splits, bSource ) ) {
                                                        splits[bSource] = {};
                                                }
-                                               if ( splits[bSource][bGroup] === undefined ) {
+                                               if ( !hasOwn.call( splits[bSource], bGroup ) ) {
                                                        splits[bSource][bGroup] = [];
                                                }
                                                bSourceGroup = splits[bSource][bGroup];
                                                                prefix = modules[i].substr( 0, lastDotIndex );
                                                                suffix = modules[i].slice( lastDotIndex + 1 );
 
-                                                               bytesAdded = moduleMap[prefix] !== undefined
+                                                               bytesAdded = hasOwn.call( moduleMap, prefix )
                                                                        ? suffix.length + 3 // '%2C'.length == 3
                                                                        : modules[i].length + 3; // '%7C'.length == 3
 
                                                                        async = true;
                                                                        l = currReqBaseLength + 9;
                                                                }
-                                                               if ( moduleMap[prefix] === undefined ) {
+                                                               if ( !hasOwn.call( moduleMap, prefix ) ) {
                                                                        moduleMap[prefix] = [];
                                                                }
                                                                moduleMap[prefix].push( suffix );
                                                return true;
                                        }
 
-                                       if ( sources[id] !== undefined ) {
+                                       if ( hasOwn.call( sources, id ) ) {
                                                throw new Error( 'source already registered: ' + id );
                                        }
 
                                        if ( typeof module !== 'string' ) {
                                                throw new Error( 'module must be a string, not a ' + typeof module );
                                        }
-                                       if ( registry[module] !== undefined ) {
+                                       if ( hasOwn.call( registry, module ) ) {
                                                throw new Error( 'module already registered: ' + module );
                                        }
                                        // List the module as registered
                                                throw new Error( 'templates must be an object, not a ' + typeof templates );
                                        }
                                        // Automatically register module
-                                       if ( registry[module] === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) ) {
                                                mw.loader.register( module );
                                        }
                                        // Check for duplicate implementation
-                                       if ( registry[module] !== undefined && registry[module].script !== undefined ) {
+                                       if ( hasOwn.call( registry, module ) && registry[module].script !== undefined ) {
                                                throw new Error( 'module already implemented: ' + module );
                                        }
                                        // Attach components
                                        // an array of unrelated modules, whereas the modules passed to
                                        // using() are related and must all be loaded.
                                        for ( filtered = [], m = 0; m < modules.length; m += 1 ) {
-                                               module = registry[modules[m]];
-                                               if ( module !== undefined ) {
+                                               if ( hasOwn.call( registry, modules[m] ) ) {
+                                                       module = registry[modules[m]];
                                                        if ( $.inArray( module.state, ['error', 'missing'] ) === -1 ) {
                                                                filtered[filtered.length] = modules[m];
                                                        }
                                                }
                                                return;
                                        }
-                                       if ( registry[module] === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) ) {
                                                mw.loader.register( module );
                                        }
                                        if ( $.inArray( state, ['ready', 'error', 'missing'] ) !== -1
                                 *  in the registry.
                                 */
                                getVersion: function ( module ) {
-                                       if ( !registry[module] || registry[module].version === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) || registry[module].version === undefined ) {
                                                return null;
                                        }
                                        return formatVersionNumber( registry[module].version );
                                 *  in the registry.
                                 */
                                getState: function ( module ) {
-                                       if ( !registry[module] || registry[module].state === undefined ) {
+                                       if ( !hasOwn.call( registry, module ) || registry[module].state === undefined ) {
                                                return null;
                                        }
                                        return registry[module].state;
                                         * @return {string|null} Module key or null if module does not exist
                                         */
                                        getModuleKey: function ( module ) {
-                                               return typeof registry[module] === 'object' ?
+                                               return hasOwn.call( registry, module ) ?
                                                        ( module + '@' + registry[module].version ) : null;
                                        },