Followup r95753 per CR: prevent extensions from making isMovable() return true for...
[lhc/web/wiklou.git] / includes / resourceloader / ResourceLoaderStartUpModule.php
index 206affd..436a569 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 class ResourceLoaderStartUpModule extends ResourceLoaderModule {
-       
+
        /* Protected Members */
 
        protected $modifiedTime = array();
@@ -35,9 +35,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        protected function getConfig( $context ) {
                global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
                        $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
-                       $wgVariantArticlePath, $wgActionPaths, $wgUseAjax, $wgVersion, 
+                       $wgVariantArticlePath, $wgActionPaths, $wgUseAjax, $wgVersion,
                        $wgEnableAPI, $wgEnableWriteAPI, $wgDBname, $wgEnableMWSuggest,
-                       $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath, $wgProto,
+                       $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
                        $wgCookiePrefix, $wgResourceLoaderMaxQueryLength, $wgLegacyJavaScriptGlobals;
 
                // Pre-process information
@@ -55,14 +55,24 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                );
                $mainPage = Title::newMainPage();
 
-               // Build wgNamespaceIds
-               // A complete key-value pair object mapping localized, canonical and aliases for namespaces
-               // to their numerical ids (case insensitive and with underscores)
+               /**
+                * Namespace related preparation
+                * - wgNamespaceIds: Key-value pairs of all localized, canonical and aliases for namespaces.
+                * - wgCaseSensitiveNamespaces: Array of namespaces that are case-sensitive.
+                */
                $namespaceIds = $wgContLang->getNamespaceIds();
+               $caseSensitiveNamespaces = array();
                foreach( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
                        $namespaceIds[$wgContLang->lc( $name )] = $index;
+                       if ( !MWNamespace::isCapitalized( $index ) ) {
+                               $caseSensitiveNamespaces[] = $index;
+                       }
                }
 
+
+               $serverBits = wfParseUrl( $wgServer );
+               $protocol = $serverBits ? $serverBits['scheme'] : 'http';
+
                // Build list of variables
                $vars = array(
                        'wgLoadScript' => $wgLoadScript,
@@ -98,21 +108,22 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgFileCanRotate' => BitmapHandler::canRotate(),
                        'wgAvailableSkins' => Skin::getSkinNames(),
                        'wgExtensionAssetsPath' => $wgExtensionAssetsPath,
-                       'wgProto' => $wgProto,
+                       'wgProto' => $protocol,
                        // MediaWiki sets cookies to have this prefix by default
                        'wgCookiePrefix' => $wgCookiePrefix,
                        'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
                        'wgLegacyJavaScriptGlobals' => $wgLegacyJavaScriptGlobals,
+                       'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
                );
                if ( $wgUseAjax && $wgEnableMWSuggest ) {
                        $vars['wgMWSuggestTemplate'] = SearchEngine::getMWSuggestTemplate();
                }
-               
+
                wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) );
-               
+
                return $vars;
        }
-       
+
        /**
         * Gets registration code for all modules
         *
@@ -122,10 +133,15 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        public static function getModuleRegistrations( ResourceLoaderContext $context ) {
                global $wgCacheEpoch;
                wfProfileIn( __METHOD__ );
-               
+
                $out = '';
                $registrations = array();
                $resourceLoader = $context->getResourceLoader();
+
+               // Register sources
+               $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
+
+               // Register modules
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
                        // Support module loader scripts
@@ -133,9 +149,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        if ( $loader !== false ) {
                                $deps = $module->getDependencies();
                                $group = $module->getGroup();
-                               $version = wfTimestamp( TS_ISO_8601_BASIC, 
+                               $source = $module->getSource();
+                               $version = wfTimestamp( TS_ISO_8601_BASIC,
                                        $module->getModifiedTime( $context ) );
-                               $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $loader );
+                               $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
                        }
                        // Automatically register module
                        else {
@@ -143,27 +160,33 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
                                $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
                                $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
-                               // Modules without dependencies or a group pass two arguments (name, timestamp) to 
+                               // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
                                // mw.loader.register()
-                               if ( !count( $module->getDependencies() && $module->getGroup() === null ) ) {
+                               if ( !count( $module->getDependencies() && $module->getGroup() === null && $module->getSource() === 'local' ) ) {
                                        $registrations[] = array( $name, $mtime );
                                }
-                               // Modules with dependencies but no group pass three arguments 
+                               // Modules with dependencies but no group or foreign source pass three arguments
                                // (name, timestamp, dependencies) to mw.loader.register()
-                               else if ( $module->getGroup() === null ) {
+                               elseif ( $module->getGroup() === null && $module->getSource() === 'local' ) {
                                        $registrations[] = array(
                                                $name, $mtime,  $module->getDependencies() );
                                }
-                               // Modules with dependencies pass four arguments (name, timestamp, dependencies, group) 
+                               // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
                                // to mw.loader.register()
-                               else {
+                               else if ( $module->getSource() === 'local' ) {
                                        $registrations[] = array(
                                                $name, $mtime,  $module->getDependencies(), $module->getGroup() );
                                }
+                               // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+                               // to mw.loader.register()
+                               else {
+                                       $registrations[] = array(
+                                               $name, $mtime, $module->getDependencies(), $module->getGroup(), $module->getSource() );
+                               }
                        }
                }
                $out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
-               
+
                wfProfileOut( __METHOD__ );
                return $out;
        }
@@ -183,15 +206,15 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // The core modules:
                        $modules = array( 'jquery', 'mediawiki' );
                        wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$modules ) );
-                       
+
                        // Get the latest version
-                       $version = 0;                                   
+                       $version = 0;
                        foreach ( $modules as $moduleName ) {
                                $version = max( $version,
                                        $context->getResourceLoader()->getModule( $moduleName )->getModifiedTime( $context )
                                );
                        }
-                       // Build load query for StartupModules 
+                       // Build load query for StartupModules
                        $query = array(
                                'modules' => ResourceLoader::makePackedModulesString( $modules ),
                                'only' => 'scripts',
@@ -242,7 +265,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                $this->modifiedTime[$hash] = filemtime( "$IP/resources/startup.js" );
                // ATTENTION!: Because of the line above, this is not going to cause
-               // infinite recursion - think carefully before making changes to this 
+               // infinite recursion - think carefully before making changes to this
                // code!
                $time = wfTimestamp( TS_UNIX, $wgCacheEpoch );
                foreach ( $loader->getModuleNames() as $name ) {