Fix-up for I21bb3f08e7f: ResourceLoaderModule::expandRelativePaths
[lhc/web/wiklou.git] / includes / resourceloader / ResourceLoader.php
index dacf013..31b3651 100644 (file)
@@ -110,28 +110,29 @@ class ResourceLoader implements LoggerAwareInterface {
                $skin = $context->getSkin();
                $lang = $context->getLanguage();
 
-               // Get file dependency information
+               // Batched version of ResourceLoaderModule::getFileDependencies
+               $vary = "$skin|$lang";
                $res = $dbr->select( 'module_deps', array( 'md_module', 'md_deps' ), array(
                                'md_module' => $modules,
-                               'md_skin' => $skin
+                               'md_skin' => $vary,
                        ), __METHOD__
                );
-
-               // Set modules' dependencies
+               // Prime in-object cache values for each module
                $modulesWithDeps = array();
                foreach ( $res as $row ) {
                        $module = $this->getModule( $row->md_module );
                        if ( $module ) {
-                               $module->setFileDependencies( $skin, FormatJson::decode( $row->md_deps, true ) );
+                               $module->setFileDependencies( $context, ResourceLoaderModule::expandRelativePaths(
+                                       FormatJson::decode( $row->md_deps, true )
+                               ) );
                                $modulesWithDeps[] = $row->md_module;
                        }
                }
-
                // Register the absence of a dependency row too
                foreach ( array_diff( $modules, $modulesWithDeps ) as $name ) {
                        $module = $this->getModule( $name );
                        if ( $module ) {
-                               $this->getModule( $name )->setFileDependencies( $skin, array() );
+                               $this->getModule( $name )->setFileDependencies( $context, array() );
                        }
                }
 
@@ -247,10 +248,7 @@ class ResourceLoader implements LoggerAwareInterface {
        private static function applyFilter( $filter, $data, Config $config ) {
                switch ( $filter ) {
                        case 'minify-js':
-                               return JavaScriptMinifier::minify( $data,
-                                       $config->get( 'ResourceLoaderMinifierStatementsOnOwnLine' ),
-                                       $config->get( 'ResourceLoaderMinifierMaxLineLength' )
-                               );
+                               return JavaScriptMinifier::minify( $data );
                        case 'minify-css':
                                return CSSMin::minify( $data );
                }
@@ -1003,9 +1001,13 @@ MESSAGE;
 
                // Generate output
                $isRaw = false;
+
+               $filter = $context->getOnly() === 'styles' ? 'minify-css' : 'minify-js';
+
                foreach ( $modules as $name => $module ) {
                        try {
                                $content = $module->getModuleContent( $context );
+                               $strContent = '';
 
                                // Append output
                                switch ( $context->getOnly() ) {
@@ -1013,10 +1015,10 @@ MESSAGE;
                                                $scripts = $content['scripts'];
                                                if ( is_string( $scripts ) ) {
                                                        // Load scripts raw...
-                                                       $out .= $scripts;
+                                                       $strContent = $scripts;
                                                } elseif ( is_array( $scripts ) ) {
                                                        // ...except when $scripts is an array of URLs
-                                                       $out .= self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() );
+                                                       $strContent = self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() );
                                                }
                                                break;
                                        case 'styles':
@@ -1024,10 +1026,10 @@ MESSAGE;
                                                // We no longer seperate into media, they are all combined now with
                                                // custom media type groups into @media .. {} sections as part of the css string.
                                                // Module returns either an empty array or a numerical array with css strings.
-                                               $out .= isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
+                                               $strContent = isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
                                                break;
                                        default:
-                                               $out .= self::makeLoaderImplementScript(
+                                               $strContent = self::makeLoaderImplementScript(
                                                        $name,
                                                        isset( $content['scripts'] ) ? $content['scripts'] : '',
                                                        isset( $content['styles'] ) ? $content['styles'] : array(),
@@ -1036,6 +1038,17 @@ MESSAGE;
                                                );
                                                break;
                                }
+
+                               if ( !$context->getDebug() ) {
+                                       // Don't cache private modules. This is especially important in the case
+                                       // of modules which change every time they are built, like the embedded
+                                       // user.tokens module (bug T84960).
+                                       $filterOptions = array( 'cache' => ( $module->getGroup() !== 'private' ) );
+                                       $strContent = $this->filter( $filter, $strContent, $filterOptions );
+                               }
+
+                               $out .= $strContent;
+
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                $this->logger->warning( 'Generating module package failed: {exception}', array(
@@ -1062,7 +1075,11 @@ MESSAGE;
 
                        // Set the state of modules we didn't respond to with mw.loader.implement
                        if ( count( $states ) ) {
-                               $out .= self::makeLoaderStateScript( $states );
+                               $stateScript = self::makeLoaderStateScript( $states );
+                               if ( !$context->getDebug() ) {
+                                       $stateScript = $this->filter( 'minify-js', $stateScript );
+                               }
+                               $out .= $stateScript;
                        }
                } else {
                        if ( count( $states ) ) {
@@ -1071,22 +1088,6 @@ MESSAGE;
                        }
                }
 
-               $enableFilterCache = true;
-               if ( count( $modules ) === 1 && reset( $modules ) instanceof ResourceLoaderUserTokensModule ) {
-                       // If we're building the embedded user.tokens, don't cache (T84960)
-                       $enableFilterCache = false;
-               }
-
-               if ( !$context->getDebug() ) {
-                       if ( $context->getOnly() === 'styles' ) {
-                               $out = $this->filter( 'minify-css', $out );
-                       } else {
-                               $out = $this->filter( 'minify-js', $out, array(
-                                       'cache' => $enableFilterCache
-                               ) );
-                       }
-               }
-
                return $out;
        }