From 5b11fa414670cd84887a18b2c35797f2451b97d5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Mon, 26 May 2014 17:41:57 +0200 Subject: [PATCH] Completely remove skin autodiscovery Also update documentation. Bug: 65748 Change-Id: I393896281e901de2000c09c0abd16ee2a0f41e2f --- RELEASE-NOTES-1.25 | 3 + docs/skin.txt | 46 ++++++-------- includes/skins/SkinFactory.php | 110 +-------------------------------- 3 files changed, 22 insertions(+), 137 deletions(-) diff --git a/RELEASE-NOTES-1.25 b/RELEASE-NOTES-1.25 index a6e0a738d0..3f91520327 100644 --- a/RELEASE-NOTES-1.25 +++ b/RELEASE-NOTES-1.25 @@ -23,6 +23,9 @@ regularly. Below only new and removed languages are listed, as well as changes to languages because of Bugzilla reports. === Other changes in 1.25 === +* The skin autodiscovery mechanism, deprecated in MediaWiki 1.23, has been + removed. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for + migration guide for creators and users of custom skins that relied on it. == Compatibility == diff --git a/docs/skin.txt b/docs/skin.txt index 58f77cf8e0..e998ebd96d 100644 --- a/docs/skin.txt +++ b/docs/skin.txt @@ -53,40 +53,30 @@ server-side source files. This is done by editing some pages on the wiki: These can also be customised on a per-user basis, by editing [[User:/vector.css]], [[User:/vector.js]], etc. -This feature has led to a wide variety of "user styles" becoming available: -https://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles +== Custom skins == -If you want a different look for your wiki, that gallery is a good place to start. +Several custom skins are available as of 2014. -== Drop-in custom skins == +https://www.mediawiki.org/wiki/Category:All_skins -If you put a file in MediaWiki's skins directory, ending in .php, the name of -the file will automatically be added as a skin name, and the file will be -expected to contain a class called Skin with the skin class. You can then -make that skin the default by adding to LocalSettings.php: +Installing a skin requires adding its files in a subdirectory under skins/ and +adding an appropriate require_once line to LocalSettings.php, similarly to how +extensions are installed. -$wgDefaultSkin = ''; +You can then make that skin the default by adding: + $wgDefaultSkin = ''; -You can also disable dropped-in or core skins using: +Or disable it entirely by removing the require_once line. (User settings will +not be lost if it's reenabled later.) -$wgSkipSkins[] = ''; +See https://www.mediawiki.org/wiki/Manual:Skinning for more information on +writing new skins. -This technique is used by the more ambitious MediaWiki site operators, to -create complex custom skins for their wikis. It should be preferred over -editing the core Monobook skin directly. - -See https://www.mediawiki.org/wiki/Manual:Skinning for more information. - -== Extension skins == - -It is now possible (since MediaWiki 1.12) to write a skin as a standard -MediaWiki extension, enabled via LocalSettings.php. This is done by adding -it to $wgValidSkinNames, for example: - -$wgValidSkinNames['mycoolskin'] = 'MyCoolSkin'; - -and then registering a class in $wgAutoloadClasses called SkinMycoolSkin, which -derives from Skin. This technique is apparently not yet used (as of 2008) -outside the DumpHTML extension. +Until MediaWiki 1.25 it used to be possible to just put a .php file in +MediaWiki's skins/ directory, which would be loaded and expected to contain the +Skin class. This way has always been discouraged because of its limitations +(inability to add localisation messages, ResourceLoader modules, etc.) and +awkwardness in managing such skins. For information on migrating skins using +this old method, see . diff --git a/includes/skins/SkinFactory.php b/includes/skins/SkinFactory.php index fb40857740..ffbe6293f8 100644 --- a/includes/skins/SkinFactory.php +++ b/includes/skins/SkinFactory.php @@ -40,13 +40,6 @@ class SkinFactory { * @var array */ private $displayNames = array(); - /** - * Map of name => class name without "Skin" prefix, for legacy skins using the autodiscovery - * mechanism - * - * @var array - */ - private $legacySkins = array(); /** * @var SkinFactory @@ -82,66 +75,6 @@ class SkinFactory { $this->displayNames[$name] = $displayName; } - /** - * @return array - */ - private function getLegacySkinNames() { - static $skinsInitialised = false; - - if ( !$skinsInitialised || !count( $this->legacySkins ) ) { - # Get a list of available skins - # Build using the regular expression '^(.*).php$' - # Array keys are all lower case, array value keep the case used by filename - # - wfProfileIn( __METHOD__ . '-init' ); - - global $wgStyleDirectory; - - $skinDir = dir( $wgStyleDirectory ); - - if ( $skinDir !== false && $skinDir !== null ) { - # while code from www.php.net - while ( false !== ( $file = $skinDir->read() ) ) { - // Skip non-PHP files, hidden files, and '.dep' includes - $matches = array(); - - if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) { - $aSkin = $matches[1]; - - // Explicitly disallow loading core skins via the autodiscovery mechanism. - // - // They should be loaded already (in a non-autodicovery way), but old files might still - // exist on the server because our MW version upgrade process is widely documented as - // requiring just copying over all files, without removing old ones. - // - // This is one of the reasons we should have never used autodiscovery in the first - // place. This hack can be safely removed when autodiscovery is gone. - if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) { - wfLogWarning( - "An old copy of the $aSkin skin was found in your skins/ directory. " . - "You should remove it to avoid problems in the future." . - "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details." - ); - continue; - } - - wfLogWarning( - "A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " . - "The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " . - "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this." - ); - $this->legacySkins[strtolower( $aSkin )] = $aSkin; - } - } - $skinDir->close(); - } - $skinsInitialised = true; - wfProfileOut( __METHOD__ . '-init' ); - } - return $this->legacySkins; - - } - /** * Returns an associative array of: * skin name => human readable name @@ -149,43 +82,7 @@ class SkinFactory { * @return array */ public function getSkinNames() { - return array_merge( - $this->getLegacySkinNames(), - $this->displayNames - ); - } - - /** - * Get a legacy skin which uses the autodiscovery mechanism. - * - * @param string $name - * @return Skin|bool False if the skin couldn't be constructed - */ - private function getLegacySkin( $name ) { - $skinNames = $this->getLegacySkinNames(); - if ( !isset( $skinNames[$name] ) ) { - return false; - } - $skinName = $skinNames[$name]; - $className = "Skin{$skinName}"; - - # Grab the skin class and initialise it. - if ( !class_exists( $className ) ) { - global $wgStyleDirectory; - require_once "{$wgStyleDirectory}/{$skinName}.php"; - - # Check if we got it - if ( !class_exists( $className ) ) { - # DO NOT die if the class isn't found. This breaks maintenance - # scripts and can cause a user account to be unrecoverable - # except by SQL manipulation if a previously valid skin name - # is no longer valid. - return false; - } - } - $skin = new $className( $name ); - return $skin; - + return $this->displayNames; } /** @@ -197,11 +94,6 @@ class SkinFactory { */ public function makeSkin( $name ) { if ( !isset( $this->factoryFunctions[$name] ) ) { - // Check the legacy autodiscovery method of skin loading - $legacy = $this->getLegacySkin( $name ); - if ( $legacy ) { - return $legacy; - } throw new SkinException( "No registered builder available for $name." ); } $skin = call_user_func( $this->factoryFunctions[$name], $name ); -- 2.20.1