diff --git a/includes/language/LanguageConverter.php b/includes/language/LanguageConverter.php index 694976b06ea..ff6cea0aad2 100644 --- a/includes/language/LanguageConverter.php +++ b/includes/language/LanguageConverter.php @@ -286,17 +286,19 @@ abstract class LanguageConverter implements ILanguageConverter { * @return string The preferred language code */ public function getPreferredVariant() { - global $wgDefaultLanguageVariant, $wgUser; + global $wgDefaultLanguageVariant; $req = $this->getURLVariant(); Hooks::runner()->onGetLangPreferredVariant( $req ); - // NOTE: For calls from Setup.php, wgUser or the session might not be set yet (T235360) + $user = RequestContext::getMain()->getUser(); + // NOTE: For some calls there may not be a context user or session that is safe + // to use, see (T235360) // Use case: During autocreation, UserNameUtils::isUsable is called which uses interface // messages for reserved usernames. - if ( $wgUser && $wgUser->isSafeToLoad() && $wgUser->isRegistered() && !$req ) { - $req = $this->getUserVariant( $wgUser ); + if ( $user->isSafeToLoad() && $user->isRegistered() && !$req ) { + $req = $this->getUserVariant( $user ); } elseif ( !$req ) { $req = $this->getHeaderVariant(); } diff --git a/tests/phpunit/languages/LanguageConverterTest.php b/tests/phpunit/languages/LanguageConverterTest.php index 4feef7b9f0f..64a76657478 100644 --- a/tests/phpunit/languages/LanguageConverterTest.php +++ b/tests/phpunit/languages/LanguageConverterTest.php @@ -19,10 +19,9 @@ class LanguageConverterTest extends MediaWikiLangTestCase { * @param User $user */ private function setContextUser( User $user ) { - // TODO stop using the deprecated global here, and convert - // LanguageConverter to use RequestContext or dependency injection - global $wgUser; - $wgUser = $user; + // LanguageConverter::getPreferredVariant() reads the user from + // RequestContext::getMain(), so set it occordingly + RequestContext::getMain()->setUser( $user ); } protected function setUp() : void { @@ -31,8 +30,8 @@ class LanguageConverterTest extends MediaWikiLangTestCase { $this->setMwGlobals( [ 'wgDefaultLanguageVariant' => false, - 'wgUser' => new User, ] ); + $this->setContextUser( new User ); $this->lang = $this->createMock( Language::class ); $this->lang->method( 'getNsText' )->with( NS_MEDIAWIKI )->willReturn( 'MediaWiki' );