Merge "Make "/*@noflip*/ /*@embed*/" annotation work"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 29 Aug 2014 19:45:06 +0000 (19:45 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 29 Aug 2014 19:45:06 +0000 (19:45 +0000)
1  2 
includes/OutputPage.php
includes/resourceloader/ResourceLoaderFileModule.php

diff --combined includes/OutputPage.php
@@@ -449,14 -449,15 +449,14 @@@ class OutputPage extends ContextSource 
         * @param string $version Style version of the file. Defaults to $wgStyleVersion
         */
        public function addScriptFile( $file, $version = null ) {
 -              global $wgStylePath, $wgStyleVersion;
                // See if $file parameter is an absolute URL or begins with a slash
                if ( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
                        $path = $file;
                } else {
 -                      $path = "{$wgStylePath}/common/{$file}";
 +                      $path = $this->getConfig()->get( 'StylePath' ) . "/common/{$file}";
                }
                if ( is_null( $version ) ) {
 -                      $version = $wgStyleVersion;
 +                      $version = $this->getConfig()->get( 'StyleVersion' );
                }
                $this->addScript( Html::linkedScript( wfAppendQuery( $path, $version ) ) );
        }
         * @return bool True if cache-ok headers was sent.
         */
        public function checkLastModified( $timestamp ) {
 -              global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
 -
                if ( !$timestamp || $timestamp == '19700101000000' ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED, NO TIMESTAMP\n" );
                        return false;
                }
 -              if ( !$wgCachePages ) {
 +              $config = $this->getConfig();
 +              if ( !$config->get( 'CachePages' ) ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED\n" );
                        return false;
                }
                $modifiedTimes = array(
                        'page' => $timestamp,
                        'user' => $this->getUser()->getTouched(),
 -                      'epoch' => $wgCacheEpoch
 +                      'epoch' => $config->get( 'CacheEpoch' )
                );
 -              if ( $wgUseSquid ) {
 +              if ( $config->get( 'UseSquid' ) ) {
                        // bug 44570: the core page itself may not change, but resources might
 -                      $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $wgSquidMaxage );
 +                      $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $config->get( 'SquidMaxage' ) );
                }
                wfRunHooks( 'OutputPageCheckLastModified', array( &$modifiedTimes ) );
  
         *        default links
         */
        public function setFeedAppendQuery( $val ) {
 -              global $wgAdvertisedFeedTypes;
 -
                $this->mFeedLinks = array();
  
 -              foreach ( $wgAdvertisedFeedTypes as $type ) {
 +              foreach ( $this->getConfig()->get( 'AdvertisedFeedTypes' ) as $type ) {
                        $query = "feed=$type";
                        if ( is_string( $val ) ) {
                                $query .= '&' . $val;
         * @param string $href URL
         */
        public function addFeedLink( $format, $href ) {
 -              global $wgAdvertisedFeedTypes;
 -
 -              if ( in_array( $format, $wgAdvertisedFeedTypes ) ) {
 +              if ( in_array( $format, $this->getConfig()->get( 'AdvertisedFeedTypes' ) ) ) {
                        $this->mFeedLinks[$format] = $href;
                }
        }
  
                # Fetch existence plus the hiddencat property
                $dbr = wfGetDB( DB_SLAVE );
 +              $fields = array( 'page_id', 'page_namespace', 'page_title', 'page_len',
 +                      'page_is_redirect', 'page_latest', 'pp_value' );
 +
 +              if ( $this->getConfig()->get( 'ContentHandlerUseDB' ) ) {
 +                      $fields[] = 'page_content_model';
 +              }
 +
                $res = $dbr->select( array( 'page', 'page_props' ),
 -                      array( 'page_id', 'page_namespace', 'page_title', 'page_len',
 -                              'page_is_redirect', 'page_latest', 'pp_value' ),
 +                      $fields,
                        $lb->constructSet( 'page', $dbr ),
                        __METHOD__,
                        array(),
         * @deprecated since 1.24, use addParserOutputMetadata() instead.
         * @param ParserOutput $parserOutput
         */
 -      public function addParserOutputNoText( &$parserOutput ) {
 +      public function addParserOutputNoText( $parserOutput ) {
                $this->addParserOutputMetadata( $parserOutput );
        }
  
         * @since 1.24
         * @param ParserOutput $parserOutput
         */
 -      public function addParserOutputMetadata( &$parserOutput ) {
 +      public function addParserOutputMetadata( $parserOutput ) {
                $this->mLanguageLinks += $parserOutput->getLanguageLinks();
                $this->addCategoryLinks( $parserOutput->getCategories() );
                $this->mNewSectionLink = $parserOutput->getNewSection();
                }
  
                // Hooks registered in the object
 -              global $wgParserOutputHooks;
 +              $parserOutputHooks = $this->getConfig()->get( 'ParserOutputHooks' );
                foreach ( $parserOutput->getOutputHooks() as $hookInfo ) {
                        list( $hookName, $data ) = $hookInfo;
 -                      if ( isset( $wgParserOutputHooks[$hookName] ) ) {
 -                              call_user_func( $wgParserOutputHooks[$hookName], $this, $parserOutput, $data );
 +                      if ( isset( $parserOutputHooks[$hookName] ) ) {
 +                              call_user_func( $parserOutputHooks[$hookName], $this, $parserOutput, $data );
                        }
                }
  
         * @since 1.24
         * @param ParserOutput $parserOutput
         */
 -      public function addParserOutputContent( &$parserOutput ) {
 +      public function addParserOutputContent( $parserOutput ) {
                $this->addParserOutputText( $parserOutput );
  
                $this->addModules( $parserOutput->getModules() );
         * @since 1.24
         * @param ParserOutput $parserOutput
         */
 -      public function addParserOutputText( &$parserOutput ) {
 +      public function addParserOutputText( $parserOutput ) {
                $text = $parserOutput->getText();
                wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
                $this->addHTML( $text );
         *
         * @param ParserOutput $parserOutput
         */
 -      function addParserOutput( &$parserOutput ) {
 +      function addParserOutput( $parserOutput ) {
                $this->addParserOutputMetadata( $parserOutput );
                $parserOutput->setTOCEnabled( $this->mEnableTOC );
  
         * @return array
         */
        function getCacheVaryCookies() {
 -              global $wgCookiePrefix, $wgCacheVaryCookies;
                static $cookies;
                if ( $cookies === null ) {
 +                      $config = $this->getConfig();
                        $cookies = array_merge(
                                array(
 -                                      "{$wgCookiePrefix}Token",
 -                                      "{$wgCookiePrefix}LoggedOut",
 +                                      $config->get( 'CookiePrefix' ) . 'Token',
 +                                      $config->get( 'CookiePrefix' ) . 'LoggedOut',
                                        "forceHTTPS",
                                        session_name()
                                ),
 -                              $wgCacheVaryCookies
 +                              $config->get( 'CacheVaryCookies' )
                        );
                        wfRunHooks( 'GetCacheVaryCookies', array( $this, &$cookies ) );
                }
         * @return string
         */
        public function getFrameOptions() {
 -              global $wgBreakFrames, $wgEditPageFrameOptions;
 -              if ( $wgBreakFrames ) {
 +              $config = $this->getConfig();
 +              if ( $config->get( 'BreakFrames' ) ) {
                        return 'DENY';
 -              } elseif ( $this->mPreventClickjacking && $wgEditPageFrameOptions ) {
 -                      return $wgEditPageFrameOptions;
 +              } elseif ( $this->mPreventClickjacking && $config->get( 'EditPageFrameOptions' ) ) {
 +                      return $config->get( 'EditPageFrameOptions' );
                }
                return false;
        }
         * Send cache control HTTP headers
         */
        public function sendCacheControl() {
 -              global $wgUseSquid, $wgUseESI, $wgUseETag, $wgSquidMaxage, $wgUseXVO;
 -
                $response = $this->getRequest()->response();
 -              if ( $wgUseETag && $this->mETag ) {
 +              $config = $this->getConfig();
 +              if ( $config->get( 'UseETag' ) && $this->mETag ) {
                        $response->header( "ETag: $this->mETag" );
                }
  
                # maintain different caches for logged-in users and non-logged in ones
                $response->header( $this->getVaryHeader() );
  
 -              if ( $wgUseXVO ) {
 +              if ( $config->get( 'UseXVO' ) ) {
                        # Add an X-Vary-Options header for Squid with Wikimedia patches
                        $response->header( $this->getXVO() );
                }
  
                if ( $this->mEnableClientCache ) {
                        if (
 -                              $wgUseSquid && session_id() == '' && !$this->isPrintable() &&
 +                              $config->get( 'UseSquid' ) && session_id() == '' && !$this->isPrintable() &&
                                $this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies()
                        ) {
 -                              if ( $wgUseESI ) {
 +                              if ( $config->get( 'UseESI' ) ) {
                                        # We'll purge the proxy cache explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
                                        # Surrogate-Control controls our Squid, Cache-Control downstream caches
                                        wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
 -                                      $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage
 +                                      $response->header( 'Surrogate-Control: max-age=' . $config->get( 'SquidMaxage' )
                                                . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
         * the object, let's actually output it:
         */
        public function output() {
 -              global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP,
 -                      $wgResponsiveImages;
 +              global $wgLanguageCode;
  
                if ( $this->mDoNothing ) {
                        return;
                wfProfileIn( __METHOD__ );
  
                $response = $this->getRequest()->response();
 +              $config = $this->getConfig();
  
                if ( $this->mRedirect != '' ) {
                        # Standards require redirect URLs to be absolute
  
                        if ( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
                                if ( $code == '301' || $code == '303' ) {
 -                                      if ( !$wgDebugRedirects ) {
 +                                      if ( !$config->get( 'DebugRedirects' ) ) {
                                                $message = HttpStatus::getMessage( $code );
                                                $response->header( "HTTP/1.1 $code $message" );
                                        }
                                        $this->mLastModified = wfTimestamp( TS_RFC2822 );
                                }
 -                              if ( $wgVaryOnXFP ) {
 +                              if ( $config->get( 'VaryOnXFP' ) ) {
                                        $this->addVaryHeader( 'X-Forwarded-Proto' );
                                }
                                $this->sendCacheControl();
  
                                $response->header( "Content-Type: text/html; charset=utf-8" );
 -                              if ( $wgDebugRedirects ) {
 +                              if ( $config->get( 'DebugRedirects' ) ) {
                                        $url = htmlspecialchars( $redirect );
                                        print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
                                        print "<p>Location: <a href=\"$url\">$url</a></p>\n";
                # Buffer output; final headers may depend on later processing
                ob_start();
  
 -              $response->header( "Content-type: $wgMimeType; charset=UTF-8" );
 +              $response->header( 'Content-type: ' . $config->get( 'MimeType' ) . '; charset=UTF-8' );
                $response->header( 'Content-language: ' . $wgLanguageCode );
  
                // Avoid Internet Explorer "compatibility view" in IE 8-10, so that
                        );
  
                        // Support for high-density display images if enabled
 -                      if ( $wgResponsiveImages ) {
 +                      if ( $config->get( 'ResponsiveImages' ) ) {
                                $coreModules[] = 'mediawiki.hidpi';
                        }
  
@@@ -2496,9 -2497,9 +2496,9 @@@ $template
         * @param int $lag Slave lag
         */
        public function showLagWarning( $lag ) {
 -              global $wgSlaveLagWarning, $wgSlaveLagCritical;
 -              if ( $lag >= $wgSlaveLagWarning ) {
 -                      $message = $lag < $wgSlaveLagCritical
 +              $config = $this->getConfig();
 +              if ( $lag >= $config->get( 'SlaveLagWarning' ) ) {
 +                      $message = $lag < $config->get( 'SlaveLagCritical' )
                                ? 'lag-warn-normal'
                                : 'lag-warn-high';
                        $wrap = Html::rawElement( 'div', array( 'class' => "mw-{$message}" ), "\n$1\n" );
         * @return string The doctype, opening "<html>", and head element.
         */
        public function headElement( Skin $sk, $includeStyle = true ) {
 -              global $wgContLang, $wgMimeType;
 +              global $wgContLang;
  
                $userdir = $this->getLanguage()->getDir();
                $sitedir = $wgContLang->getDir();
                        $ret .= "$openHead\n";
                }
  
 -              if ( !Html::isXmlMimeType( $wgMimeType ) ) {
 +              if ( !Html::isXmlMimeType( $this->getConfig()->get( 'MimeType' ) ) ) {
                        // Add <meta charset="UTF-8">
                        // This should be before <title> since it defines the charset used by
                        // text including the text inside <title>.
         */
        public function getResourceLoader() {
                if ( is_null( $this->mResourceLoader ) ) {
 -                      $this->mResourceLoader = new ResourceLoader();
 +                      $this->mResourceLoader = new ResourceLoader( $this->getConfig() );
                }
                return $this->mResourceLoader;
        }
        protected function makeResourceLoaderLink( $modules, $only, $useESI = false,
                array $extraQuery = array(), $loadCall = false
        ) {
 -              global $wgResourceLoaderUseESI;
 -
                $modules = (array)$modules;
  
                $links = array(
                // Create keyed-by-source and then keyed-by-group list of module objects from modules list
                $sortedModules = array();
                $resourceLoader = $this->getResourceLoader();
 +              $resourceLoaderUseESI = $this->getConfig()->get( 'ResourceLoaderUseESI' );
                foreach ( $modules as $name ) {
                        $module = $resourceLoader->getModule( $name );
                        # Check that we're allowed to include this module on this page
                                $moduleContext = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
                                $url = $resourceLoader->createLoaderURL( $source, $moduleContext, $extraQuery );
  
 -                              if ( $useESI && $wgResourceLoaderUseESI ) {
 +                              if ( $useESI && $resourceLoaderUseESI ) {
                                        $esi = Xml::element( 'esi:include', array( 'src' => $url ) );
                                        if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
                                                $link = Html::inlineStyle( $esi );
         * @return string HTML fragment
         */
        function getHeadScripts() {
 -              global $wgResourceLoaderExperimentalAsyncLoading;
 -
                // Startup - this will immediately load jquery and mediawiki modules
                $links = array();
                $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
                        );
                }
  
 -              if ( $wgResourceLoaderExperimentalAsyncLoading ) {
 +              if ( $this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
                        $links[] = $this->getScriptsForBottomQueue( true );
                }
  
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
 -              global $wgAllowUserJs;
 -
                // Scripts and messages "only" requests marked for bottom inclusion
                // If we're in the <head>, use load() calls rather than <script src="..."> tags
                // Messages should go first
                );
  
                // Add user JS if enabled
 -              if ( $wgAllowUserJs
 +              if ( $this->getConfig()->get( 'AllowUserJs' )
                        && $this->getUser()->isLoggedIn()
                        && $this->getTitle()
                        && $this->getTitle()->isJsSubpage()
         * @return string
         */
        function getBottomScripts() {
 -              global $wgResourceLoaderExperimentalAsyncLoading;
 -
                // Optimise jQuery ready event cross-browser.
                // This also enforces $.isReady to be true at </body> which fixes the
                // mw.loader bug in Firefox with using document.write between </body>
                // and the DOMContentReady event (bug 47457).
                $html = Html::inlineScript( 'window.jQuery && jQuery.ready();' );
  
 -              if ( !$wgResourceLoaderExperimentalAsyncLoading ) {
 +              if ( !$this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
                        $html .= $this->getScriptsForBottomQueue( false );
                }
  
         * @return array Array in format "link name or number => 'link html'".
         */
        public function getHeadLinksArray() {
 -              global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
 -                      $wgSitename, $wgVersion,
 -                      $wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
 -                      $wgDisableLangConversion, $wgCanonicalLanguageLinks,
 -                      $wgRightsPage, $wgRightsUrl;
 +              global $wgVersion;
  
                $tags = array();
 +              $config = $this->getConfig();
  
                $canonicalUrl = $this->mCanonicalUrl;
  
                }
  
                # Universal edit button
 -              if ( $wgUniversalEditButton && $this->isArticleRelated() ) {
 +              if ( $config->get( 'UniversalEditButton' ) && $this->isArticleRelated() ) {
                        $user = $this->getUser();
                        if ( $this->getTitle()->quickUserCan( 'edit', $user )
                                && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
                # should not matter, but Konqueror (3.5.9 at least) incorrectly
                # uses whichever one appears later in the HTML source. Make sure
                # apple-touch-icon is specified first to avoid this.
 -              if ( $wgAppleTouchIcon !== false ) {
 +              if ( $config->get( 'AppleTouchIcon' ) !== false ) {
                        $tags['apple-touch-icon'] = Html::element( 'link', array(
                                'rel' => 'apple-touch-icon',
 -                              'href' => $wgAppleTouchIcon
 +                              'href' => $config->get( 'AppleTouchIcon' )
                        ) );
                }
  
 -              if ( $wgFavicon !== false ) {
 +              if ( $config->get( 'Favicon' ) !== false ) {
                        $tags['favicon'] = Html::element( 'link', array(
                                'rel' => 'shortcut icon',
 -                              'href' => $wgFavicon
 +                              'href' => $config->get( 'Favicon' )
                        ) );
                }
  
                        'title' => $this->msg( 'opensearch-desc' )->inContentLanguage()->text(),
                ) );
  
 -              if ( $wgEnableAPI ) {
 +              if ( $config->get( 'EnableAPI' ) ) {
                        # Real Simple Discovery link, provides auto-discovery information
                        # for the MediaWiki API (and potentially additional custom API
                        # support such as WordPress or Twitter-compatible APIs for a
                }
  
                # Language variants
 -              if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks ) {
 +              if ( !$config->get( 'DisableLangConversion' ) ) {
                        $lang = $this->getTitle()->getPageLanguage();
                        if ( $lang->hasVariants() ) {
 -
 -                              $urlvar = $lang->getURLVariant();
 -
 -                              if ( !$urlvar ) {
 -                                      $variants = $lang->getVariants();
 -                                      foreach ( $variants as $_v ) {
 -                                              $tags["variant-$_v"] = Html::element( 'link', array(
 -                                                      'rel' => 'alternate',
 -                                                      'hreflang' => wfBCP47( $_v ),
 -                                                      'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
 -                                              );
 -                                      }
 -                              } else {
 -                                      $canonicalUrl = $this->getTitle()->getLocalURL();
 +                              $variants = $lang->getVariants();
 +                              foreach ( $variants as $_v ) {
 +                                      $tags["variant-$_v"] = Html::element( 'link', array(
 +                                              'rel' => 'alternate',
 +                                              'hreflang' => wfBCP47( $_v ),
 +                                              'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
 +                                      );
                                }
                        }
 +                      # x-default link per https://support.google.com/webmasters/answer/189077?hl=en
 +                      $tags["variant-x-default"] = Html::element( 'link', array(
 +                              'rel' => 'alternate',
 +                              'hreflang' => 'x-default',
 +                              'href' => $this->getTitle()->getLocalURL() ) );
                }
  
                # Copyright
                $copyright = '';
 -              if ( $wgRightsPage ) {
 -                      $copy = Title::newFromText( $wgRightsPage );
 +              if ( $config->get( 'RightsPage' ) ) {
 +                      $copy = Title::newFromText( $config->get( 'RightsPage' ) );
  
                        if ( $copy ) {
                                $copyright = $copy->getLocalURL();
                        }
                }
  
 -              if ( !$copyright && $wgRightsUrl ) {
 -                      $copyright = $wgRightsUrl;
 +              if ( !$copyright && $config->get( 'RightsUrl' ) ) {
 +                      $copyright = $config->get( 'RightsUrl' );
                }
  
                if ( $copyright ) {
                }
  
                # Feeds
 -              if ( $wgFeed ) {
 +              if ( $config->get( 'Feed' ) ) {
                        foreach ( $this->getSyndicationLinks() as $format => $link ) {
                                # Use the page name for the title.  In principle, this could
                                # lead to issues with having the same name for different feeds
                        # like to promote instead of the RC feed (maybe like a "Recent New Articles"
                        # or "Breaking news" one). For this, we see if $wgOverrideSiteFeed is defined.
                        # If so, use it instead.
 -                      if ( $wgOverrideSiteFeed ) {
 -                              foreach ( $wgOverrideSiteFeed as $type => $feedUrl ) {
 +                      $sitename = $config->get( 'Sitename' );
 +                      if ( $config->get( 'OverrideSiteFeed' ) ) {
 +                              foreach ( $config->get( 'OverrideSiteFeed' ) as $type => $feedUrl ) {
                                        // Note, this->feedLink escapes the url.
                                        $tags[] = $this->feedLink(
                                                $type,
                                                $feedUrl,
 -                                              $this->msg( "site-{$type}-feed", $wgSitename )->text()
 +                                              $this->msg( "site-{$type}-feed", $sitename )->text()
                                        );
                                }
                        } elseif ( !$this->getTitle()->isSpecial( 'Recentchanges' ) ) {
                                $rctitle = SpecialPage::getTitleFor( 'Recentchanges' );
 -                              foreach ( $wgAdvertisedFeedTypes as $format ) {
 +                              foreach ( $config->get( 'AdvertisedFeedTypes' ) as $format ) {
                                        $tags[] = $this->feedLink(
                                                $format,
                                                $rctitle->getLocalURL( array( 'feed' => $format ) ),
                                                # For grep: 'site-rss-feed', 'site-atom-feed'
 -                                              $this->msg( "site-{$format}-feed", $wgSitename )->text()
 +                                              $this->msg( "site-{$format}-feed", $sitename )->text()
                                        );
                                }
                        }
                }
  
                # Canonical URL
 -              global $wgEnableCanonicalServerLink;
 -              if ( $wgEnableCanonicalServerLink ) {
 +              if ( $config->get( 'EnableCanonicalServerLink' ) ) {
                        if ( $canonicalUrl !== false ) {
                                $canonicalUrl = wfExpandUrl( $canonicalUrl, PROTO_CANONICAL );
                        } else {
                if ( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
                        # If wanted, and the interface is right-to-left, flip the CSS
                        $style_css = CSSJanus::transform( $style_css, true, false );
+               } else {
+                       $style_css = CSSJanus::nullTransform( $style_css );
                }
                $this->mInlineStyles .= Html::inlineStyle( $style_css ) . "\n";
        }
         * @return string
         */
        public function buildCssLinks() {
 -              global $wgAllowUserCss, $wgContLang;
 +              global $wgContLang;
  
                $this->getSkin()->setupSkinUserCss( $this );
  
                $moduleStyles[] = 'user.groups';
  
                // Per-user custom styles
 -              if ( $wgAllowUserCss && $this->getTitle()->isCssSubpage() && $this->userCanPreview() ) {
 +              if ( $this->getConfig()->get( 'AllowUserCss' ) && $this->getTitle()->isCssSubpage() && $this->userCanPreview() ) {
                        // We're on a preview of a CSS subpage
                        // Exclude this page from the user module in case it's in there (bug 26283)
                        $link = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
                        $previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
                        if ( $this->getLanguage()->getDir() !== $wgContLang->getDir() ) {
                                $previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
+                       } else {
+                               $previewedCSS = CSSJanus::nullTransform( $previewedCSS );
                        }
                        $otherTags .= Html::inlineStyle( $previewedCSS ) . "\n";
                } else {
                        substr( $style, 0, 6 ) == 'https:' ) {
                        $url = $style;
                } else {
 -                      global $wgStylePath, $wgStyleVersion;
 -                      $url = $wgStylePath . '/' . $style . '?' . $wgStyleVersion;
 +                      $config = $this->getConfig();
 +                      $url = $config->get( 'StylePath' ) . '/' . $style . '?' . $config->get( 'StyleVersion' );
                }
  
                $link = Html::linkedStyle( $url, $media );
@@@ -859,7 -859,7 +859,7 @@@ class ResourceLoaderFileModule extends 
                }
  
                if ( $this->getStyleSheetLang( $localPath ) === 'less' ) {
 -                      $style = $this->compileLESSFile( $localPath );
 +                      $style = $this->compileLessFile( $localPath );
                        $this->hasGeneratedStyles = true;
                } else {
                        $style = file_get_contents( $localPath );
  
                if ( $flip ) {
                        $style = CSSJanus::transform( $style, true, false );
+               } else {
+                       $style = CSSJanus::nullTransform( $style );
                }
                $localDir = dirname( $localPath );
                $remoteDir = dirname( $remotePath );
                return $this->targets;
        }
  
 -      /**
 -       * Generate a cache key for a LESS file.
 -       *
 -       * The cache key varies on the file name and the names and values of global
 -       * LESS variables.
 -       *
 -       * @since 1.22
 -       * @param string $fileName File name of root LESS file.
 -       * @return string Cache key
 -       */
 -      protected function getLESSCacheKey( $fileName ) {
 -              $vars = json_encode( ResourceLoader::getLESSVars( $this->getConfig() ) );
 -              $hash = md5( $fileName . $vars );
 -              return wfMemcKey( 'resourceloader', 'less', $hash );
 -      }
 -
        /**
         * Compile a LESS file into CSS.
         *
 -       * If invalid, returns replacement CSS source consisting of the compilation
 -       * error message encoded as a comment. To save work, we cache a result object
 -       * which comprises the compiled CSS and the names & mtimes of the files
 -       * that were processed. lessphp compares the cached & current mtimes and
 -       * recompiles as necessary.
 +       * Keeps track of all used files and adds them to localFileRefs.
         *
         * @since 1.22
 -       * @throws Exception If Less encounters a parse error
 -       * @throws MWException If Less compilation returns unexpection result
 +       * @throws Exception If lessc encounters a parse error
         * @param string $fileName File path of LESS source
         * @return string CSS source
         */
 -      protected function compileLESSFile( $fileName ) {
 -              $key = $this->getLESSCacheKey( $fileName );
 -              $cache = wfGetCache( CACHE_ANYTHING );
 -
 -              // The input to lessc. Either an associative array representing the
 -              // cached results of a previous compilation, or the string file name if
 -              // no cache result exists.
 -              $source = $cache->get( $key );
 -              if ( !is_array( $source ) || !isset( $source['root'] ) ) {
 -                      $source = $fileName;
 -              }
 -
 +      protected function compileLessFile( $fileName ) {
                $compiler = ResourceLoader::getLessCompiler( $this->getConfig() );
 -              $result = null;
 -
 -              $result = $compiler->cachedCompile( $source );
 -
 -              if ( !is_array( $result ) ) {
 -                      throw new MWException( 'LESS compiler result has type '
 -                              . gettype( $result ) . '; array expected.' );
 -              }
 -
 -              $this->localFileRefs += array_keys( $result['files'] );
 -              $cache->set( $key, $result );
 -              return $result['compiled'];
 +              $result = $compiler->compileFile( $fileName );
 +              $this->localFileRefs += array_keys( $compiler->allParsedFiles() );
 +              return $result;
        }
  }