Merge "Tablesorter: Replace wgContentLanguage by wgPageContentLanguage"
[lhc/web/wiklou.git] / includes / resourceloader / ResourceLoaderFileModule.php
index 671098e..e6c9bd0 100644 (file)
@@ -143,15 +143,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected $hasGeneratedStyles = false;
 
-       /**
-        * @var array Cache for mtime
-        * @par Usage:
-        * @code
-        * array( [hash] => [mtime], [hash] => [mtime], ... )
-        * @endcode
-        */
-       protected $modifiedTime = array();
-
        /**
         * @var array Place where readStyleFile() tracks file dependencies
         * @par Usage:
@@ -281,8 +272,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        $this->{$member} = $option;
                                        break;
                                // Single strings
-                               case 'group':
                                case 'position':
+                                       $this->isPositionDefined = true;
+                               case 'group':
                                case 'skipFunction':
                                        $this->{$member} = (string)$option;
                                        break;
@@ -486,10 +478,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
        /**
         * Gets list of names of modules this module depends on.
-        *
+        * @param ResourceLoaderContext context
         * @return array List of module names
         */
-       public function getDependencies() {
+       public function getDependencies( ResourceLoaderContext $context = null ) {
                return $this->dependencies;
        }
 
@@ -522,7 +514,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Get the last modified timestamp of this module.
+        * Helper method to gather file mtimes for getDefinitionSummary.
         *
         * Last modified timestamps are calculated from the highest last modified
         * timestamp of this module's constituent files as well as the files it
@@ -530,16 +522,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * calculations on files relevant to the given language, skin and debug
         * mode.
         *
-        * @param ResourceLoaderContext $context Context in which to calculate
-        *     the modified time
-        * @return int UNIX timestamp
         * @see ResourceLoaderModule::getFileDependencies
+        * @param ResourceLoaderContext $context
+        * @return array
         */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               if ( isset( $this->modifiedTime[$context->getHash()] ) ) {
-                       return $this->modifiedTime[$context->getHash()];
-               }
-
+       protected function getFileMtimes( ResourceLoaderContext $context ) {
                $files = array();
 
                // Flatten style files into $files
@@ -578,22 +565,13 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                // entry point Less file we already know about.
                $files = array_values( array_unique( $files ) );
 
-               // If a module is nothing but a list of dependencies, we need to avoid
-               // giving max() an empty array
-               if ( count( $files ) === 0 ) {
-                       $this->modifiedTime[$context->getHash()] = 1;
-                       return $this->modifiedTime[$context->getHash()];
-               }
-
-               $filesMtime = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
-
-               $this->modifiedTime[$context->getHash()] = max(
-                       $filesMtime,
-                       $this->getMsgBlobMtime( $context->getLanguage() ),
-                       $this->getDefinitionMtime( $context )
-               );
-
-               return $this->modifiedTime[$context->getHash()];
+               // Don't max() because older files are significant.
+               // While the associated file names are significant, that is already taken care of by the
+               // definition summary. Avoid creating an array keyed by file path here because those are
+               // absolute file paths. Including that would needlessly cause global cache invalidation
+               // when the MediaWiki installation path changes (which is quite common in cases like
+               // Wikimedia where the installation path reflects the MediaWiki branch name).
+               return array_map( array( __CLASS__, 'safeFilemtime' ), $files );
        }
 
        /**
@@ -604,6 +582,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                $summary = parent::getDefinitionSummary( $context );
+
+               $options = array();
                foreach ( array(
                        'scripts',
                        'debugScripts',
@@ -619,18 +599,24 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        'group',
                        'position',
                        'skipFunction',
+                       // FIXME: localBasePath includes the MediaWiki installation path and
+                       // needlessly causes cache invalidation.
                        'localBasePath',
                        'remoteBasePath',
                        'debugRaw',
                        'raw',
                ) as $member ) {
-                       $summary[$member] = $this->{$member};
+                       $options[$member] = $this->{$member};
                };
+
+               $summary[] = array(
+                       'options' => $options,
+                       'fileMtimes' => $this->getFileMTimes( $context ),
+                       'msgBlobMtime' => $this->getMsgBlobMtime( $context->getLanguage() ),
+               );
                return $summary;
        }
 
-       /* Protected Methods */
-
        /**
         * @param string|ResourceLoaderFilePath $path
         * @return string