ResourceLoaderSkinModule: Fix SkinStyles extending of known media queries
authorTimo Tijhof <krinklemail@gmail.com>
Fri, 16 Jun 2017 19:25:41 +0000 (21:25 +0200)
committerBartosz Dziewoński <matma.rex@gmail.com>
Mon, 10 Jul 2017 17:53:00 +0000 (19:53 +0200)
If any of the styles given in its module definition (in the
'styles' or 'skinStyles' properties) used the same media queries
as the module's own CSS (e.g. 'all'), the module would fail with
"PHP Fatal error: [] operator not supported for strings" because
FileModule defaults to merging all the stylesheets into a single
string.

Fix this by ensuring they are arrays before trying to extend them.

This previously made it impossible to use $wgResourceModuleSkinStyles
for modules that use SkinModule (instead of plain FileModule), such as
the 'mediawiki.skinning.interface' module.

Bug: T168088
Change-Id: I3effcaa4982728e707fbf9efeec4e5e78fc8aab6

includes/resourceloader/ResourceLoaderSkinModule.php

index 1967a95..ca6e59f 100644 (file)
@@ -34,6 +34,7 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
        public function getStyles( ResourceLoaderContext $context ) {
                $logo = $this->getLogo( $this->getConfig() );
                $styles = parent::getStyles( $context );
+               $this->normalizeStyles( $styles );
 
                $default = !is_array( $logo ) ? $logo : $logo['1x'];
                $styles['all'][] = '.mw-wiki-logo { background-image: ' .
@@ -66,6 +67,22 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                return $styles;
        }
 
+       /**
+        * Ensure all media keys use array values.
+        *
+        * Normalises arrays returned by the ResourceLoaderFileModule::getStyles() method.
+        *
+        * @param array &$styles Associative array, keys are strings (media queries),
+        *   values are strings or arrays
+        */
+       private function normalizeStyles( &$styles ) {
+               foreach ( $styles as $key => $val ) {
+                       if ( !is_array( $val ) ) {
+                               $styles[$key] = [ $val ];
+                       }
+               }
+       }
+
        /**
         * @param Config $conf
         * @return string|array Single url if no variants are defined