SkinUserPageHelper: Remove global state from constructor

* Move global state parameters to new methods setContext and setTitle.

This change solves the circular dependency error for service
'SkinUserPageHelper'. The service will used in SkinOptions in the
follow-up change I014e61c6692adbbe449f1e6aa9c6ae73dbcff925.

Change-Id: I80342e5168435c5318c378e2ac8a9a3c7a28eb4c
This commit is contained in:
Fomafix 2024-03-24 09:19:59 +00:00
parent 220bf6ff89
commit 1c26798431
5 changed files with 63 additions and 53 deletions

View file

@ -94,18 +94,14 @@ return [
$title = SpecialPage::getTitleFor( 'Badtitle' );
}
$user = $context->getUser();
$userPageHelper = $services->getService( 'Minerva.SkinUserPageHelper' );
$userPageHelper = $services->getService( 'Minerva.SkinUserPageHelper' )
->setContext( $context )
->setTitle( $title->inNamespace( NS_USER_TALK ) ?
$context->getSkin()->getRelevantTitle()->getSubjectPage() :
$title
);
$languagesHelper = $services->getService( 'Minerva.LanguagesHelper' );
$relevantUserPageHelper = $title->inNamespace( NS_USER_TALK ) ?
new SkinUserPageHelper(
$services->getUserNameUtils(),
$services->getUserFactory(),
$context->getSkin()->getRelevantTitle()->getSubjectPage(),
$context
) :
$userPageHelper;
$permissions = $services->getService( 'Minerva.Permissions' )
->setContext( $context );
@ -117,14 +113,14 @@ return [
$context,
$permissions,
$skinOptions,
$relevantUserPageHelper,
$userPageHelper,
$languagesHelper,
new ServiceOptions( PageActionsMenu\ToolbarBuilder::CONSTRUCTOR_OPTIONS,
$services->getMainConfig() ),
$watchlistManager
);
if ( $skinOptions->get( SkinOptions::TOOLBAR_SUBMENU ) ) {
$overflowBuilder = $relevantUserPageHelper->isUserPage() ?
$overflowBuilder = $userPageHelper->isUserPage() ?
new PageActionsMenu\UserNamespaceOverflowBuilder(
$title,
$context,
@ -149,9 +145,7 @@ return [
'Minerva.SkinUserPageHelper' => static function ( MediaWikiServices $services ): SkinUserPageHelper {
return new SkinUserPageHelper(
$services->getUserNameUtils(),
$services->getUserFactory(),
RequestContext::getMain()->getSkin()->getRelevantTitle(),
RequestContext::getMain()
$services->getUserFactory()
);
},
'Minerva.LanguagesHelper' => static function ( MediaWikiServices $services ): LanguagesHelper {

View file

@ -170,12 +170,14 @@ final class SkinOptions {
// For some reason using $services->getService( 'SkinUserPageHelper' )
// here results in a circular dependency error which is why
// SkinUserPageHelper is being instantiated instead.
$relevantUserPageHelper = new SkinUserPageHelper(
$relevantUserPageHelper = ( new SkinUserPageHelper(
$this->userNameUtils,
$this->userFactory,
$title->inNamespace( NS_USER_TALK ) ? $title->getSubjectPage() : $title,
$mobileContext
);
$this->userFactory
) )
->setContext( $mobileContext )
->setTitle(
$title->inNamespace( NS_USER_TALK ) ? $title->getSubjectPage() : $title
);
$isUserPage = $relevantUserPageHelper->isUserPage();
$isUserPageAccessible = $relevantUserPageHelper->isUserPageAccessibleToCurrentUser();

View file

@ -701,7 +701,9 @@ class SkinMinerva extends SkinMustache {
* @return SkinUserPageHelper
*/
public function getUserPageHelper() {
return MediaWikiServices::getInstance()->getService( 'Minerva.SkinUserPageHelper' );
return MediaWikiServices::getInstance()->getService( 'Minerva.SkinUserPageHelper' )
->setContext( $this->getContext() )
->setTitle( $this->getTitle() );
}
/**

View file

@ -30,17 +30,22 @@ class SkinUserPageHelper {
/**
* @var UserNameUtils
*/
private $userNameUtils;
private UserNameUtils $userNameUtils;
/**
* @var UserFactory
*/
private $userFactory;
private UserFactory $userFactory;
/**
* @var IContextSource
*/
private IContextSource $context;
/**
* @var Title|null
*/
private $title;
private ?Title $title;
/**
* @var bool
@ -52,27 +57,34 @@ class SkinUserPageHelper {
*/
private $pageUser;
/**
* @var IContextSource|null
*/
private $context;
/**
* @param UserNameUtils $userNameUtils
* @param UserFactory $userFactory
* @param Title|null $title
* @param IContextSource|null $context
*/
public function __construct(
UserNameUtils $userNameUtils,
UserFactory $userFactory,
Title $title = null,
IContextSource $context = null
UserFactory $userFactory
) {
$this->userNameUtils = $userNameUtils;
$this->userFactory = $userFactory;
$this->title = $title;
}
/**
* @param IContextSource $context
* @return $this
*/
public function setContext( IContextSource $context ) {
$this->context = $context;
return $this;
}
/**
* @param Title|null $title
* @return $this
*/
public function setTitle( ?Title $title ) {
$this->title = $title;
return $this;
}
/**

View file

@ -24,9 +24,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$this->getServiceContainer()->getUserFactory(),
$title
$this->getServiceContainer()->getUserFactory()
);
$helper->setTitle( $title );
$this->assertFalse( $helper->isUserPage() );
}
@ -40,9 +40,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$this->getServiceContainer()->getUserFactory(),
$title
$this->getServiceContainer()->getUserFactory()
);
$helper->setTitle( $title );
$this->assertNull( $helper->getPageUser() );
$this->assertFalse( $helper->isUserPage() );
}
@ -56,9 +56,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$this->getServiceContainer()->getUserFactory(),
$title
$this->getServiceContainer()->getUserFactory()
);
$helper->setTitle( $title );
$this->assertFalse( $helper->isUserPage() );
}
@ -72,9 +72,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$this->getServiceContainer()->getUserFactory(),
$title
$this->getServiceContainer()->getUserFactory()
);
$helper->setTitle( $title );
$this->assertTrue( $helper->isUserPage() );
}
@ -88,9 +88,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$this->getServiceContainer()->getUserFactory(),
$title
$this->getServiceContainer()->getUserFactory()
);
$helper->setTitle( $title );
$this->assertFalse( $helper->isUserPage() );
}
@ -113,9 +113,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$userFactory,
$title
$userFactory
);
$helper->setTitle( $title );
$this->assertFalse( $helper->isUserPage() );
}
@ -151,9 +151,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$userFactory,
$titleMock
$userFactory
);
$helper->setTitle( $titleMock );
$helper->isUserPage();
$helper->isUserPage();
$helper->getPageUser();
@ -178,9 +178,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
->willReturn( $user );
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$userFactory,
$title
$userFactory
);
$helper->setTitle( $title );
$this->assertTrue( $helper->isUserPage() );
$this->assertEquals( $user->getId(), $helper->getPageUser()->getId() );
}
@ -209,9 +209,9 @@ class SkinUserPageHelperTest extends MediaWikiIntegrationTestCase {
->willReturn( $secondUser );
$helper = new SkinUserPageHelper(
$this->getServiceContainer()->getUserNameUtils(),
$userFactory,
$secondUserTitle
$userFactory
);
$helper->setTitle( $secondUserTitle );
$this->assertTrue( $helper->isUserPage() );
$this->assertNotEquals( $user->getId(), $helper->getPageUser()->getId() );
$this->assertNotEquals( $helper->getPageUser()->getUserPage(), $userTitle );