diff --git a/docs/config-schema.yaml b/docs/config-schema.yaml index 5c395f3b265..0ddb330bb47 100644 --- a/docs/config-schema.yaml +++ b/docs/config-schema.yaml @@ -3202,6 +3202,11 @@ config-schema: via the `useskin` query parameter. To uninstall a skin, remove its inclusion from LocalSettings.php. @see \SkinFactory::getAllowedSkins + ResourceLoaderClientPreferences: + default: false + description: |- + Whether skins support client side (anonymous) preferences. + @see RL/ClientHtml DisableOutputCompression: default: false description: 'Disable output compression (enabled by default if zlib is available)' diff --git a/includes/MainConfigNames.php b/includes/MainConfigNames.php index f646db27a5e..e43782cc7db 100644 --- a/includes/MainConfigNames.php +++ b/includes/MainConfigNames.php @@ -1990,6 +1990,12 @@ class MainConfigNames { */ public const SkipSkins = 'SkipSkins'; + /** + * Name constant for the ResourceLoaderClientPreferences setting, for use with Config::get() + * @see MainConfigSchema::ResourceLoaderClientPreferences + */ + public const ResourceLoaderClientPreferences = 'ResourceLoaderClientPreferences'; + /** * Name constant for the DisableOutputCompression setting, for use with Config::get() * @see MainConfigSchema::DisableOutputCompression diff --git a/includes/MainConfigSchema.php b/includes/MainConfigSchema.php index 5ba0d91f210..e9162b4961a 100644 --- a/includes/MainConfigSchema.php +++ b/includes/MainConfigSchema.php @@ -5152,6 +5152,15 @@ class MainConfigSchema { 'type' => 'map', ]; + /** + * Whether skins support client side (anonymous) preferences. + * + * @see RL/ClientHtml + */ + public const ResourceLoaderClientPreferences = [ + 'default' => false, + ]; + /** * Disable output compression (enabled by default if zlib is available) */ diff --git a/includes/ResourceLoader/ClientHtml.php b/includes/ResourceLoader/ClientHtml.php index 45563c9681b..4ca1ebd12ba 100644 --- a/includes/ResourceLoader/ClientHtml.php +++ b/includes/ResourceLoader/ClientHtml.php @@ -21,6 +21,7 @@ namespace MediaWiki\ResourceLoader; use Html; +use MediaWiki\MainConfigNames; use Wikimedia\WrappedString; use Wikimedia\WrappedStringList; @@ -289,6 +290,15 @@ RLPAGEMODULES = {$pageModulesJson}; "; } + $config = $this->resourceLoader->getConfig(); + $user = $this->context->getUserIdentity(); + $isAnon = !$user || !$user->isRegistered(); + // This code is only loaded for anonymous users. Logged in users should use preferences. + if ( $config->get( MainConfigNames::ResourceLoaderClientPreferences ) && $isAnon ) { + $script .= $this->getClientSidePreferencesScript( + $config->get( MainConfigNames::CookiePrefix ) + ); + } if ( !$this->context->getDebug() ) { $script = ResourceLoader::filter( 'minify-js', $script, [ 'cache' => false ] ); } @@ -383,6 +393,32 @@ RLPAGEMODULES = {$pageModulesJson}; return $ret; } + /** + * Adds ability for anonymous users to change classes on document.documentElement + * + * @param string $cookiePrefix + * @return string + */ + private function getClientSidePreferencesScript( string $cookiePrefix ) { + return << 'fallback', 'SkipSkins' => [ ], + 'ResourceLoaderClientPreferences' => false, 'DisableOutputCompression' => false, 'FragmentMode' => [ 0 => 'html5', diff --git a/includes/config-vars.php b/includes/config-vars.php index 7fd6b85fffd..44874039ce4 100644 --- a/includes/config-vars.php +++ b/includes/config-vars.php @@ -1974,6 +1974,12 @@ $wgFallbackSkin = null; */ $wgSkipSkins = null; +/** + * Config variable stub for the ResourceLoaderClientPreferences setting, for use by phpdoc and IDEs. + * @see MediaWiki\MainConfigSchema::ResourceLoaderClientPreferences + */ +$wgResourceLoaderClientPreferences = null; + /** * Config variable stub for the DisableOutputCompression setting, for use by phpdoc and IDEs. * @see MediaWiki\MainConfigSchema::DisableOutputCompression diff --git a/tests/phpunit/includes/ResourceLoader/ClientHtmlTest.php b/tests/phpunit/includes/ResourceLoader/ClientHtmlTest.php index 3455810d8eb..42f7aa50468 100644 --- a/tests/phpunit/includes/ResourceLoader/ClientHtmlTest.php +++ b/tests/phpunit/includes/ResourceLoader/ClientHtmlTest.php @@ -348,7 +348,9 @@ class ClientHtmlTest extends \PHPUnit\Framework\TestCase { } private static function makeContext( $extraQuery = [] ) { - $conf = new HashConfig( [] ); + $conf = new HashConfig( [ + 'ResourceLoaderClientPreferences' => false + ] ); return new Context( new ResourceLoader( $conf, null, null, [ 'loadScript' => '/w/load.php',