Allow hidden skins to show up in preferences
authorjdlrobson <jdlrobson@gmail.com>
Sat, 18 May 2019 17:19:54 +0000 (19:19 +0200)
committerJdlrobson <jrobson@wikimedia.org>
Sun, 19 May 2019 15:21:00 +0000 (15:21 +0000)
It should be possible for power users to reveal hidden preferences
using the useskin query parameter. In future this will allow us
to use wgSkipSkins to deprecate poorly supported skins for new
users whilst not hard deprecating and removing skin support for
users who strongly want to continue to use them.

Change-Id: I1bbd4a09dff72f513c9413e0f826d8db38a5e04c

includes/preferences/DefaultPreferencesFactory.php

index 1f21c1b..b18088f 100644 (file)
@@ -1294,6 +1294,23 @@ class DefaultPreferencesFactory implements PreferencesFactory {
 
                # Only show skins that aren't disabled in $wgSkipSkins
                $validSkinNames = Skin::getAllowedSkins();
+               $allInstalledSkins = Skin::getSkinNames();
+
+               // Display the installed skin the user has specifically requested via useskin=….
+               $useSkin = $context->getRequest()->getRawVal( 'useskin' );
+               if ( isset( $allInstalledSkins[$useSkin] )
+                       && $context->msg( "skinname-$useSkin" )->exists()
+               ) {
+                       $validSkinNames[$useSkin] = $useSkin;
+               }
+
+               // Display the skin if the user has set it as a preference already before it was hidden.
+               $currentUserSkin = $user->getOption( 'skin' );
+               if ( isset( $allInstalledSkins[$currentUserSkin] )
+                       && $context->msg( "skinname-$useSkin" )->exists()
+               ) {
+                       $validSkinNames[$currentUserSkin] = $currentUserSkin;
+               }
 
                foreach ( $validSkinNames as $skinkey => &$skinname ) {
                        $msg = $context->msg( "skinname-{$skinkey}" );
@@ -1505,6 +1522,14 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                 */
                $htmlForm = new $formClass( $formDescriptor, $context, 'prefs' );
 
+               // This allows users to opt-in to hidden skins. While this should be discouraged and is not
+               // discoverable, this allows users to still use hidden skins while preventing new users from
+               // adopting unsupported skins. If no useskin=… parameter was provided, it will not show up
+               // in the resulting URL.
+               $htmlForm->setAction( $context->getTitle()->getLocalURL( [
+                       'useskin' => $context->getRequest()->getRawVal( 'useskin' )
+               ] ) );
+
                $htmlForm->setModifiedUser( $user );
                $htmlForm->setId( 'mw-prefs-form' );
                $htmlForm->setAutocomplete( 'off' );