From 51eede02837a3a9d378cb35fa7c27a9f4e8e5f4e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Mon, 5 Jun 2017 19:32:23 +0200 Subject: [PATCH] Restore the ability to set $wgResourceModuleSkinStyles for 'oojs-ui-core.styles' In c8ad83310f425433791102e8a958397f2d701b65, 'oojs-ui-core.styles' was changed to use ResourceLoaderOOUIFileModule instead of plain ResourceLoaderFileModule. This had the unintended consequence that ResourceLoader::isFileModule() no longer returned true for it, and this $wgResourceModuleSkinStyles no longer worked, breaking styling in Vector. Additionally, the new ResourceLoaderOOUIFileModule did not respect the skinScripts/skinStyles options passed in the module definition (therefore also those from $wgResourceModuleSkinStyles). Merging them turns out to be a major pain, but it can be done. Bug: T167042 Change-Id: I7547bbe996467745c1f0b168b40f27eb95c6238d --- includes/resourceloader/ResourceLoader.php | 7 +++- .../ResourceLoaderOOUIFileModule.php | 39 ++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index d144987b60..767046b302 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -573,7 +573,12 @@ class ResourceLoader implements LoggerAwareInterface { return false; } $info = $this->moduleInfos[$name]; - if ( isset( $info['object'] ) || isset( $info['class'] ) ) { + if ( + isset( $info['object'] ) || + // This special case is dumb, but we need $wgResourceModuleSkinStyles + // to work for 'oojs-ui-core.styles'. See T167042. + ( isset( $info['class'] ) && $info['class'] !== 'ResourceLoaderOOUIFileModule' ) + ) { return false; } return true; diff --git a/includes/resourceloader/ResourceLoaderOOUIFileModule.php b/includes/resourceloader/ResourceLoaderOOUIFileModule.php index 135efa705c..e97e074201 100644 --- a/includes/resourceloader/ResourceLoaderOOUIFileModule.php +++ b/includes/resourceloader/ResourceLoaderOOUIFileModule.php @@ -29,10 +29,18 @@ class ResourceLoaderOOUIFileModule extends ResourceLoaderFileModule { public function __construct( $options = [] ) { if ( isset( $options[ 'themeScripts' ] ) ) { - $options['skinScripts'] = $this->getSkinSpecific( $options[ 'themeScripts' ], 'scripts' ); + $skinScripts = $this->getSkinSpecific( $options[ 'themeScripts' ], 'scripts' ); + if ( !isset( $options['skinScripts'] ) ) { + $options['skinScripts'] = []; + } + $this->extendSkinSpecific( $options['skinScripts'], $skinScripts ); } if ( isset( $options[ 'themeStyles' ] ) ) { - $options['skinStyles'] = $this->getSkinSpecific( $options[ 'themeStyles' ], 'styles' ); + $skinStyles = $this->getSkinSpecific( $options[ 'themeStyles' ], 'styles' ); + if ( !isset( $options['skinStyles'] ) ) { + $options['skinStyles'] = []; + } + $this->extendSkinSpecific( $options['skinStyles'], $skinStyles ); } parent::__construct( $options ); @@ -60,4 +68,31 @@ class ResourceLoaderOOUIFileModule extends ResourceLoaderFileModule { }, array_values( $themes ) ) ); } + + /** + * Prepend the $extraSkinSpecific assoc. array to the $skinSpecific assoc. array. + * Both of them represent a 'skinScripts' or 'skinStyles' definition. + * + * @param array &$skinSpecific + * @param array $extraSkinSpecific + */ + private function extendSkinSpecific( &$skinSpecific, $extraSkinSpecific ) { + // For each skin where skinStyles/skinScripts are defined, add our ones at the beginning + foreach ( $skinSpecific as $skin => $files ) { + if ( !is_array( $files ) ) { + $files = [ $files ]; + } + if ( isset( $extraSkinSpecific[$skin] ) ) { + $skinSpecific[$skin] = array_merge( [ $extraSkinSpecific[$skin] ], $files ); + } elseif ( isset( $extraSkinSpecific['default'] ) ) { + $skinSpecific[$skin] = array_merge( [ $extraSkinSpecific['default'] ], $files ); + } + } + // Add our remaining skinStyles/skinScripts for skins that did not have them defined + foreach ( $extraSkinSpecific as $skin => $file ) { + if ( !isset( $skinSpecific[$skin] ) ) { + $skinSpecific[$skin] = $file; + } + } + } } -- 2.20.1