From 18f948831f34ab06c187a58cb9cee5343015e926 Mon Sep 17 00:00:00 2001 From: Trevor Parscal Date: Mon, 20 Sep 2010 21:54:15 +0000 Subject: [PATCH] Using new group feature of ResourceLoaderModule objects rather than ugly hacking when generating ResourceLoader requests in output page. --- includes/OutputPage.php | 71 +++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 14b27b80b0..9dc9baffdd 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -2290,45 +2290,48 @@ class OutputPage { 'skin' => $wgUser->getSkin()->getSkinName(), 'only' => $only, ); - $moduleGroups = array( null => array(), 'user' => array() ); + // Remove duplicate module requests + $modules = array_unique( (array) $modules ); + // Sort module names so requests are more uniform + sort( $modules ); + // Create keyed-by-group list of module objects from modules list + $groups = array(); foreach ( (array) $modules as $name ) { - $moduleGroups[strpos( $name, 'user' ) === 0 ? 'user' : null][] = $name; + $module = ResourceLoader::getModule( $name ); + $group = $module->getGroup(); + if ( !isset( $groups[$group] ) ) { + $groups[$group] = array(); + } + $groups[$group][$name] = $module; } $links = ''; - foreach ( $moduleGroups as $group => $modules ) { - if ( count( $modules ) ) { - sort( $modules ); - $query['modules'] = implode( '|', array_unique( (array) $modules ) ); - if ( $group === 'user' && $wgUser->isLoggedIn() ) { - $query['user'] = $wgUser->getName(); - } - // Users might change their stuff on-wiki like site or user pages, or user preferences; we need to find - // the highest timestamp of these user-changable modules so we can ensure cache misses upon change + foreach ( $groups as $group => $modules ) { + $query['modules'] = implode( '|', array_keys( $modules ) ); + // Special handling for user group + if ( $group === 'user' && $wgUser->isLoggedIn() ) { + $query['user'] = $wgUser->getName(); + } + // Special handling for user and site groups; because users might change their stuff on-wiki like site or + // user pages, or user preferences; we need to find the highest timestamp of these user-changable modules so + // we can ensure cache misses on change + if ( $group === 'user' || $group === 'site' ) { + // Create a fake request based on the one we are about to make so modules return correct times + $request = new ResourceLoaderContext( new FauxRequest( $query ) ); + // Get the maximum timestamp $timestamp = 0; - foreach ( $modules as $name ) { - $module = ResourceLoader::getModule( $name ); - if ( - $module instanceof ResourceLoaderWikiModule || - $module instanceof ResourceLoaderUserOptionsModule - ) { - $timestamp = max( - $timestamp, - $module->getModifiedTime( new ResourceLoaderContext( new FauxRequest( $query ) ) ) - ); - } - } - // Add a version parameter if any of the modules were user-changable - if ( $timestamp ) { - $query['version'] = wfTimestamp( TS_ISO_8601, round( $timestamp, -2 ) ); - } - // Make queries uniform in order - ksort( $query ); - // Automatically select style/script elements - if ( $only === 'styles' ) { - $links .= Html::linkedStyle( wfAppendQuery( $wgLoadScript, $query ) ) . "\n"; - } else { - $links .= Html::linkedScript( wfAppendQuery( $wgLoadScript, $query ) ) . "\n"; + foreach ( $modules as $module ) { + $timestamp = max( $timestamp, $module->getModifiedTime( $request ) ); } + // Add a version parameter so cache will break when things change + $query['version'] = wfTimestamp( TS_ISO_8601, round( $timestamp, -2 ) ); + } + // Make queries uniform in order + ksort( $query ); + // Automatically select style/script elements + if ( $only === 'styles' ) { + $links .= Html::linkedStyle( wfAppendQuery( $wgLoadScript, $query ) ) . "\n"; + } else { + $links .= Html::linkedScript( wfAppendQuery( $wgLoadScript, $query ) ) . "\n"; } } return $links; -- 2.20.1