diff --git a/RELEASE-NOTES-1.35 b/RELEASE-NOTES-1.35 index 4ec4846aa95..46276b0677a 100644 --- a/RELEASE-NOTES-1.35 +++ b/RELEASE-NOTES-1.35 @@ -1051,6 +1051,8 @@ because of Phabricator reports. GuzzleHttpRequest now require the timeout and connectTimeout options to always be specified, otherwise a deprecation warning will be raised. Most callers should use HttpRequestFactory which always sets these options. +* Linker::normaliseSpecialPage() has been deprecated, instead make use of + LinkRenderer::normalizeTarget(). * … === Other changes in 1.35 === diff --git a/includes/DummyLinker.php b/includes/DummyLinker.php index 785bab5535d..70cbd1769d9 100644 --- a/includes/DummyLinker.php +++ b/includes/DummyLinker.php @@ -1,5 +1,7 @@ getLinkRenderer(); + return $linkRenderer->normalizeTarget( $title ); } public function makeExternalImage( $url, $alt = '' ) { diff --git a/includes/Linker.php b/includes/Linker.php index fdad75f63ca..b0a4d0371e8 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -202,19 +202,14 @@ class Linker { /** * @since 1.16.3 + * @deprecated since 1.35, use LinkRenderer::normalizeTarget() * @param LinkTarget $target * @return LinkTarget */ public static function normaliseSpecialPage( LinkTarget $target ) { - if ( $target->getNamespace() == NS_SPECIAL && !$target->isExternal() ) { - list( $name, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()-> - resolveAlias( $target->getDBkey() ); - if ( $name ) { - return SpecialPage::getTitleValueFor( $name, $subpage, $target->getFragment() ); - } - } - - return $target; + wfDeprecated( __METHOD__, '1.35' ); + $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); + return $linkRenderer->normalizeTarget( $target ); } /** @@ -467,8 +462,9 @@ class Linker { } } } elseif ( isset( $frameParams['link-title'] ) && $frameParams['link-title'] !== '' ) { + $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); $mtoParams['custom-title-link'] = Title::newFromLinkTarget( - self::normaliseSpecialPage( $frameParams['link-title'] ) + $linkRenderer->normalizeTarget( $frameParams['link-title'] ) ); } elseif ( !empty( $frameParams['no-link'] ) ) { // No link diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 4a11ecb9af5..4301baa16a3 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -489,7 +489,8 @@ return [ return new LinkRendererFactory( $services->getTitleFormatter(), $services->getLinkCache(), - $services->getNamespaceInfo() + $services->getNamespaceInfo(), + $services->getSpecialPageFactory() ); }, diff --git a/includes/linker/LinkRenderer.php b/includes/linker/LinkRenderer.php index 4daf10a7582..e5d9d42c4b8 100644 --- a/includes/linker/LinkRenderer.php +++ b/includes/linker/LinkRenderer.php @@ -25,10 +25,11 @@ use Hooks; use Html; use HtmlArmor; use LinkCache; -use Linker; use MediaWiki\MediaWikiServices; +use MediaWiki\SpecialPage\SpecialPageFactory; use NamespaceInfo; use Sanitizer; +use SpecialPage; use Title; use TitleFormatter; @@ -82,16 +83,27 @@ class LinkRenderer { private $runLegacyBeginHook = true; /** + * @var SpecialPageFactory + */ + private $specialPageFactory; + + /** + * @internal For use by LinkRendererFactory * @param TitleFormatter $titleFormatter * @param LinkCache $linkCache * @param NamespaceInfo $nsInfo + * @param SpecialPageFactory $specialPageFactory */ public function __construct( - TitleFormatter $titleFormatter, LinkCache $linkCache, NamespaceInfo $nsInfo + TitleFormatter $titleFormatter, + LinkCache $linkCache, + NamespaceInfo $nsInfo, + SpecialPageFactory $specialPageFactory ) { $this->titleFormatter = $titleFormatter; $this->linkCache = $linkCache; $this->nsInfo = $nsInfo; + $this->specialPageFactory = $specialPageFactory; } /** @@ -427,12 +439,22 @@ class LinkRenderer { /** * Normalizes the provided target * - * @todo move the code from Linker actually here + * @internal For use by deprecated Linker & DummyLinker + * ::normaliseSpecialPage() methods * @param LinkTarget $target * @return LinkTarget */ - private function normalizeTarget( LinkTarget $target ) { - return Linker::normaliseSpecialPage( $target ); + public function normalizeTarget( LinkTarget $target ) { + if ( $target->getNamespace() == NS_SPECIAL && !$target->isExternal() ) { + list( $name, $subpage ) = $this->specialPageFactory->resolveAlias( + $target->getDBkey() + ); + if ( $name ) { + return SpecialPage::getTitleValueFor( $name, $subpage, $target->getFragment() ); + } + } + + return $target; } /** diff --git a/includes/linker/LinkRendererFactory.php b/includes/linker/LinkRendererFactory.php index eeb28b5560c..765264c56f2 100644 --- a/includes/linker/LinkRendererFactory.php +++ b/includes/linker/LinkRendererFactory.php @@ -21,6 +21,7 @@ namespace MediaWiki\Linker; use LinkCache; +use MediaWiki\SpecialPage\SpecialPageFactory; use NamespaceInfo; use TitleFormatter; use User; @@ -47,23 +48,36 @@ class LinkRendererFactory { private $nsInfo; /** + * @var SpecialPageFactory + */ + private $specialPageFactory; + + /** + * @internal For use by core ServiceWiring * @param TitleFormatter $titleFormatter * @param LinkCache $linkCache * @param NamespaceInfo $nsInfo + * @param SpecialPageFactory $specialPageFactory */ public function __construct( - TitleFormatter $titleFormatter, LinkCache $linkCache, NamespaceInfo $nsInfo + TitleFormatter $titleFormatter, + LinkCache $linkCache, + NamespaceInfo $nsInfo, + SpecialPageFactory $specialPageFactory ) { $this->titleFormatter = $titleFormatter; $this->linkCache = $linkCache; $this->nsInfo = $nsInfo; + $this->specialPageFactory = $specialPageFactory; } /** * @return LinkRenderer */ public function create() { - return new LinkRenderer( $this->titleFormatter, $this->linkCache, $this->nsInfo ); + return new LinkRenderer( + $this->titleFormatter, $this->linkCache, $this->nsInfo, $this->specialPageFactory + ); } /** diff --git a/tests/phpunit/includes/linker/LinkRendererFactoryTest.php b/tests/phpunit/includes/linker/LinkRendererFactoryTest.php index f77bfac8158..77fe38675cd 100644 --- a/tests/phpunit/includes/linker/LinkRendererFactoryTest.php +++ b/tests/phpunit/includes/linker/LinkRendererFactoryTest.php @@ -3,6 +3,7 @@ use MediaWiki\Linker\LinkRenderer; use MediaWiki\Linker\LinkRendererFactory; use MediaWiki\MediaWikiServices; +use MediaWiki\SpecialPage\SpecialPageFactory; use PHPUnit\Framework\MockObject\MockObject; /** @@ -25,6 +26,11 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase { */ private $nsInfo; + /** + * @var SpecialPageFactory + */ + private $specialPageFactory; + public function setUp() : void { parent::setUp(); @@ -32,6 +38,7 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase { $this->titleFormatter = $services->getTitleFormatter(); $this->linkCache = $services->getLinkCache(); $this->nsInfo = $services->getNamespaceInfo(); + $this->specialPageFactory = $services->getSpecialPageFactory(); } public static function provideCreateFromLegacyOptions() { @@ -63,8 +70,9 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase { * @dataProvider provideCreateFromLegacyOptions */ public function testCreateFromLegacyOptions( $options, $func, $val ) { - $factory = - new LinkRendererFactory( $this->titleFormatter, $this->linkCache, $this->nsInfo ); + $factory = new LinkRendererFactory( + $this->titleFormatter, $this->linkCache, $this->nsInfo, $this->specialPageFactory + ); $linkRenderer = $factory->createFromLegacyOptions( $options ); @@ -73,20 +81,22 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase { } public function testCreate() { - $factory = - new LinkRendererFactory( $this->titleFormatter, $this->linkCache, $this->nsInfo ); + $factory = new LinkRendererFactory( + $this->titleFormatter, $this->linkCache, $this->nsInfo, $this->specialPageFactory + ); $this->assertInstanceOf( LinkRenderer::class, $factory->create() ); } public function testCreateForUser() { /** @var MockObject|User $user */ $user = $this->getMockBuilder( User::class ) - ->setMethods( [ 'getStubThreshold' ] )->getMock(); + ->onlyMethods( [ 'getStubThreshold' ] )->getMock(); $user->expects( $this->once() ) ->method( 'getStubThreshold' ) ->willReturn( 15 ); - $factory = - new LinkRendererFactory( $this->titleFormatter, $this->linkCache, $this->nsInfo ); + $factory = new LinkRendererFactory( + $this->titleFormatter, $this->linkCache, $this->nsInfo, $this->specialPageFactory + ); $linkRenderer = $factory->createForUser( $user ); $this->assertInstanceOf( LinkRenderer::class, $linkRenderer ); $this->assertEquals( 15, $linkRenderer->getStubThreshold() ); diff --git a/tests/phpunit/includes/linker/LinkRendererTest.php b/tests/phpunit/includes/linker/LinkRendererTest.php index a46bbf69807..74e1c46bcf4 100644 --- a/tests/phpunit/includes/linker/LinkRendererTest.php +++ b/tests/phpunit/includes/linker/LinkRendererTest.php @@ -142,6 +142,7 @@ class LinkRendererTest extends MediaWikiLangTestCase { $wanCache = $services->getMainWANObjectCache(); $titleFormatter = $services->getTitleFormatter(); $nsInfo = $services->getNamespaceInfo(); + $specialPageFactory = $services->getSpecialPageFactory(); $linkCache = new LinkCache( $titleFormatter, $wanCache, $nsInfo ); $foobarTitle = new TitleValue( NS_MAIN, 'FooBar' ); $redirectTitle = new TitleValue( NS_MAIN, 'Redirect' ); @@ -166,7 +167,7 @@ class LinkRendererTest extends MediaWikiLangTestCase { 0 // redir ); - $linkRenderer = new LinkRenderer( $titleFormatter, $linkCache, $nsInfo ); + $linkRenderer = new LinkRenderer( $titleFormatter, $linkCache, $nsInfo, $specialPageFactory ); $linkRenderer->setStubThreshold( 0 ); $this->assertSame( '',