Skin: Make skins aware of their registered skin name
[lhc/web/wiklou.git] / includes / skins / Skin.php
index 6834ca5..f92a66f 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @defgroup Skins Skins
  */
  * @ingroup Skins
  */
 abstract class Skin extends ContextSource {
+       /**
+        * @var string|null
+        */
        protected $skinname = null;
+
        protected $mRelevantTitle = null;
        protected $mRelevantUser = null;
 
@@ -93,7 +99,7 @@ abstract class Skin extends ContextSource {
        static function normalizeKey( $key ) {
                global $wgDefaultSkin, $wgFallbackSkin;
 
-               $skinNames = Skin::getSkinNames();
+               $skinNames = self::getSkinNames();
 
                // Make keys lowercase for case-insensitive matching.
                $skinNames = array_change_key_case( $skinNames, CASE_LOWER );
@@ -132,7 +138,17 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * @return string Skin name
+        * @since 1.31
+        * @param string|null $skinname
+        */
+       public function __construct( $skinname = null ) {
+               if ( is_string( $skinname ) ) {
+                       $this->skinname = $skinname;
+               }
+       }
+
+       /**
+        * @return string|null Skin name
         */
        public function getSkinName() {
                return $this->skinname;
@@ -447,7 +463,7 @@ abstract class Skin extends ContextSource {
         * "<body>" tag, skins can override it if they have a need to add in any
         * body attributes or classes of their own.
         * @param OutputPage $out
-        * @param array $bodyAttrs
+        * @param array &$bodyAttrs
         */
        function addToBodyAttributes( $out, &$bodyAttrs ) {
                // does nothing by default
@@ -1213,7 +1229,7 @@ abstract class Skin extends ContextSource {
        /**
         * make sure we have some title to operate on
         *
-        * @param Title $title
+        * @param Title &$title
         * @param string $name
         */
        static function checkTitle( &$title, $name ) {
@@ -1259,7 +1275,7 @@ abstract class Skin extends ContextSource {
                };
 
                if ( $wgEnableSidebarCache ) {
-                       $cache = ObjectCache::getMainWANInstance();
+                       $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                        $sidebar = $cache->getWithSetCallback(
                                $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ),
                                MessageCache::singleton()->isDisabled()
@@ -1284,7 +1300,7 @@ abstract class Skin extends ContextSource {
         *
         * This is just a wrapper around addToSidebarPlain() for backwards compatibility
         *
-        * @param array $bar
+        * @param array &$bar
         * @param string $message
         */
        public function addToSidebar( &$bar, $message ) {
@@ -1294,7 +1310,7 @@ abstract class Skin extends ContextSource {
        /**
         * Add content from plain text
         * @since 1.17
-        * @param array $bar
+        * @param array &$bar
         * @param string $text
         * @return array
         */
@@ -1373,8 +1389,8 @@ abstract class Skin extends ContextSource {
                                        $bar[$heading][] = array_merge( [
                                                'text' => $text,
                                                'href' => $href,
-                                               'id' => 'n-' . Sanitizer::escapeId( strtr( $line[1], ' ', '-' ), 'noninitial' ),
-                                               'active' => false
+                                               'id' => Sanitizer::escapeIdForAttribute( 'n-' . strtr( $line[1], ' ', '-' ) ),
+                                               'active' => false,
                                        ], $extraAttribs );
                                } else {
                                        continue;
@@ -1505,29 +1521,27 @@ abstract class Skin extends ContextSource {
                        $notice = $msg->plain();
                }
 
-               $cache = wfGetCache( CACHE_ANYTHING );
-               // Use the extra hash appender to let eg SSL variants separately cache.
-               $key = $cache->makeKey( $name . $wgRenderHashAppend );
-               $cachedNotice = $cache->get( $key );
-               if ( is_array( $cachedNotice ) ) {
-                       if ( md5( $notice ) == $cachedNotice['hash'] ) {
-                               $notice = $cachedNotice['html'];
-                       } else {
-                               $needParse = true;
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $parsed = $cache->getWithSetCallback(
+                       // Use the extra hash appender to let eg SSL variants separately cache
+                       // Key is verified with md5 hash of unparsed wikitext
+                       $cache->makeKey( $name, $wgRenderHashAppend, md5( $notice ) ),
+                       // TTL in seconds
+                       600,
+                       function () use ( $notice ) {
+                               return $this->getOutput()->parse( $notice );
                        }
-               } else {
-                       $needParse = true;
-               }
-
-               if ( $needParse ) {
-                       $parsed = $this->getOutput()->parse( $notice );
-                       $cache->set( $key, [ 'html' => $parsed, 'hash' => md5( $notice ) ], 600 );
-                       $notice = $parsed;
-               }
+               );
 
-               $notice = Html::rawElement( 'div', [ 'id' => 'localNotice',
-                       'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ], $notice );
-               return $notice;
+               return Html::rawElement(
+                       'div',
+                       [
+                               'id' => 'localNotice',
+                               'lang' => $wgContLang->getHtmlCode(),
+                               'dir' => $wgContLang->getDir()
+                       ],
+                       $parsed
+               );
        }
 
        /**