Merge "resourceloader: Tidy up RL to simplify ResourceLoaderEditToolbarModule"
[lhc/web/wiklou.git] / includes / resourceloader / ResourceLoader.php
index b8ec63b..1541581 100644 (file)
@@ -208,7 +208,12 @@ class ResourceLoader implements LoggerAwareInterface {
                if ( !$options['cache'] ) {
                        $result = self::applyFilter( $filter, $data, $this->config );
                } else {
-                       $key = wfGlobalCacheKey( 'resourceloader', 'filter', $filter, self::$filterCacheVersion, md5( $data ) );
+                       $key = wfGlobalCacheKey(
+                               'resourceloader',
+                               'filter',
+                               $filter,
+                               self::$filterCacheVersion, md5( $data )
+                       );
                        $cache = wfGetCache( wfIsHHVM() ? CACHE_ACCEL : CACHE_ANYTHING );
                        $cacheEntry = $cache->get( $key );
                        if ( is_string( $cacheEntry ) ) {
@@ -283,8 +288,8 @@ class ResourceLoader implements LoggerAwareInterface {
                $this->register( include "$IP/resources/Resources.php" );
                $this->register( include "$IP/resources/ResourcesOOUI.php" );
                // Register extension modules
-               Hooks::run( 'ResourceLoaderRegisterModules', array( &$this ) );
                $this->register( $config->get( 'ResourceModules' ) );
+               Hooks::run( 'ResourceLoaderRegisterModules', array( &$this ) );
 
                if ( $config->get( 'EnableJavaScriptTest' ) === true ) {
                        $this->registerTestModules();
@@ -747,18 +752,18 @@ class ResourceLoader implements LoggerAwareInterface {
 
                if ( $context->getImageObj() && $this->errors ) {
                        // We can't show both the error messages and the response when it's an image.
-                       $errorText = '';
-                       foreach ( $this->errors as $error ) {
-                               $errorText .= $error . "\n";
-                       }
-                       $response = $errorText;
+                       $response = implode( "\n\n", $this->errors );
                } elseif ( $this->errors ) {
-                       // Prepend comments indicating errors
-                       $errorText = '';
-                       foreach ( $this->errors as $error ) {
-                               $errorText .= self::makeComment( $error );
+                       $errorText = implode( "\n\n", $this->errors );
+                       $errorResponse = self::makeComment( $errorText );
+                       if ( $context->shouldIncludeScripts() ) {
+                               $errorResponse .= 'if (window.console && console.error) {'
+                                       . Xml::encodeJsCall( 'console.error', array( $errorText ) )
+                                       . "}\n";
                        }
-                       $response = $errorText . $response;
+
+                       // Prepend error info to the response
+                       $response = $errorResponse . $response;
                }
 
                $this->errors = array();
@@ -940,11 +945,11 @@ class ResourceLoader implements LoggerAwareInterface {
        protected static function formatExceptionNoComment( $e ) {
                global $wgShowExceptionDetails;
 
-               if ( $wgShowExceptionDetails ) {
-                       return $e->__toString();
-               } else {
-                       return wfMessage( 'internalerror' )->text();
+               if ( !$wgShowExceptionDetails ) {
+                       return MWExceptionHandler::getPublicLogMessage( $e );
                }
+
+               return MWExceptionHandler::getLogMessage( $e );
        }
 
        /**
@@ -1011,7 +1016,7 @@ MESSAGE;
                                                        $out .= $scripts;
                                                } elseif ( is_array( $scripts ) ) {
                                                        // ...except when $scripts is an array of URLs
-                                                       $out .= self::makeLoaderImplementScript( $name, $scripts, array(), array() );
+                                                       $out .= self::makeLoaderImplementScript( $name, $scripts, array(), array(), array() );
                                                }
                                                break;
                                        case 'styles':
@@ -1380,7 +1385,8 @@ MESSAGE;
         * @return string
         */
        public static function makeLoaderConditionalScript( $script ) {
-               return "window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n" . trim( $script ) . "\n} );";
+               return "window.RLQ = window.RLQ || []; window.RLQ.push( function () {\n" .
+                       trim( $script ) . "\n} );";
        }
 
        /**
@@ -1485,7 +1491,7 @@ MESSAGE;
                $query = self::createLoaderQuery( $context, $extraQuery );
                $script = $this->getLoadScript( $source );
 
-               return wfExpandUrl( wfAppendQuery( $script, $query ), PROTO_RELATIVE );
+               return wfAppendQuery( $script, $query );
        }
 
        /**
@@ -1513,7 +1519,7 @@ MESSAGE;
                        $only, $printable, $handheld, $extraQuery
                );
 
-               return wfExpandUrl( wfAppendQuery( $wgLoadScript, $query ), PROTO_RELATIVE );
+               return wfAppendQuery( $wgLoadScript, $query );
        }
 
        /**
@@ -1605,27 +1611,29 @@ MESSAGE;
        /**
         * Returns LESS compiler set up for use with MediaWiki
         *
+        * @since 1.22
+        * @since 1.26 added $extraVars parameter
         * @param Config $config
+        * @param array $extraVars Associative array of extra (i.e., other than the
+        *   globally-configured ones) that should be used for compilation.
         * @throws MWException
-        * @since 1.22
-        * @return lessc
+        * @return Less_Parser
         */
-       public static function getLessCompiler( Config $config ) {
+       public static function getLessCompiler( Config $config, $extraVars = array() ) {
                // When called from the installer, it is possible that a required PHP extension
                // is missing (at least for now; see bug 47564). If this is the case, throw an
                // exception (caught by the installer) to prevent a fatal error later on.
-               if ( !class_exists( 'lessc' ) ) {
-                       throw new MWException( 'MediaWiki requires the lessphp compiler' );
-               }
-               if ( !function_exists( 'ctype_digit' ) ) {
-                       throw new MWException( 'lessc requires the Ctype extension' );
+               if ( !class_exists( 'Less_Parser' ) ) {
+                       throw new MWException( 'MediaWiki requires the less.php parser' );
                }
 
-               $less = new lessc();
-               $less->setPreserveComments( true );
-               $less->setVariables( self::getLessVars( $config ) );
-               $less->setImportDir( $config->get( 'ResourceLoaderLESSImportPaths' ) );
-               return $less;
+               $parser = new Less_Parser;
+               $parser->ModifyVars( array_merge( self::getLessVars( $config ), $extraVars ) );
+               $parser->SetImportDirs( array_fill_keys( $config->get( 'ResourceLoaderLESSImportPaths' ), '' ) );
+               $parser->SetOption( 'relativeUrls', false );
+               $parser->SetCacheDir( $config->get( 'CacheDirectory' ) ?: wfTempDir() );
+
+               return $parser;
        }
 
        /**
@@ -1639,8 +1647,6 @@ MESSAGE;
                if ( !self::$lessVars ) {
                        $lessVars = $config->get( 'ResourceLoaderLESSVars' );
                        Hooks::run( 'ResourceLoaderGetLessVars', array( &$lessVars ) );
-                       // Sort by key to ensure consistent hashing for cache lookups.
-                       ksort( $lessVars );
                        self::$lessVars = $lessVars;
                }
                return self::$lessVars;