From 9e217bf42d73ef2dfcdecfe3a753cf8d702a18fd Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Mon, 6 Jun 2016 19:09:32 +0100 Subject: [PATCH] resourceloader: Add support for variables in WikiModule To be used for the 'site' module. This will make it easier to split up 'site' into 'site' and 'site.styles' (per T92459). Change-Id: Iaac3e458d5107e4c10c2826bd64608d5c47e8b87 --- .../ResourceLoaderWikiModule.php | 19 +++++++++++++++++-- tests/phpunit/ResourceLoaderTestCase.php | 3 +++ .../ResourceLoaderWikiModuleTest.php | 12 ++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php index a3f882531d..e3ada8ed08 100644 --- a/includes/resourceloader/ResourceLoaderWikiModule.php +++ b/includes/resourceloader/ResourceLoaderWikiModule.php @@ -61,6 +61,9 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule { // Group of module protected $group; + // Whether to enable variable expansion (e.g. "{skin}") + protected $allowVariables = false; + /** * @param array $options For back-compat, this can be omitted in favour of overwriting getPages. */ @@ -76,6 +79,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule { case 'scripts': case 'group': case 'targets': + case 'allowVariables': $this->{$member} = $option; break; } @@ -105,19 +109,30 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule { // Filter out pages from origins not allowed by the current wiki configuration. if ( $config->get( 'UseSiteJs' ) ) { foreach ( $this->scripts as $script ) { - $pages[$script] = [ 'type' => 'script' ]; + $page = $this->expandVariables( $context, $script ); + $pages[$page] = [ 'type' => 'script' ]; } } if ( $config->get( 'UseSiteCss' ) ) { foreach ( $this->styles as $style ) { - $pages[$style] = [ 'type' => 'style' ]; + $page = $this->expandVariables( $context, $style ); + $pages[$page] = [ 'type' => 'style' ]; } } return $pages; } + private function expandVariables( ResourceLoaderContext $context, $pageName ) { + if ( !$this->allowVariables ) { + return $pageName; + } + return strtr( $pageName, [ + '{skin}' => $context->getSkin() + ] ); + } + /** * Get group name * diff --git a/tests/phpunit/ResourceLoaderTestCase.php b/tests/phpunit/ResourceLoaderTestCase.php index 85bf9549cc..275ed27c2a 100644 --- a/tests/phpunit/ResourceLoaderTestCase.php +++ b/tests/phpunit/ResourceLoaderTestCase.php @@ -30,6 +30,9 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase { // For ResourceLoader::inDebugMode since it doesn't have context 'ResourceLoaderDebug' => true, + // For ResourceLoaderContext::newDummyContext() + 'DefaultSkin' => 'vector', + // Avoid influence from wgInvalidateCacheOnLocalSettingsChange 'CacheEpoch' => '20140101000000', diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php index 85834d71e7..e6bb5a764d 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php @@ -49,6 +49,12 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase { 'scripts' => [ 'MediaWiki:Common.js' ], ]; + $variableParams = [ + 'allowVariables' => true, + 'styles' => [ 'MediaWiki:Common.css', 'MediaWiki:{skin}.css' ], + 'scripts' => [ 'MediaWiki:Common.js', 'MediaWiki:{skin}.js' ], + ]; + return [ [ [], new HashConfig( $settings ), [] ], [ $params, new HashConfig( $settings ), [ @@ -67,6 +73,12 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase { ), [] ], + [ $variableParams, new HashConfig( $settings ), [ + 'MediaWiki:Common.js' => [ 'type' => 'script' ], + 'MediaWiki:vector.js' => [ 'type' => 'script' ], + 'MediaWiki:Common.css' => [ 'type' => 'style' ], + 'MediaWiki:vector.css' => [ 'type' => 'style' ] + ] ], ]; } -- 2.20.1