Use MediaWikiServices to cache commonly used helpers

SkinMinerva cached the ContentHandler object for better performance.
In the future the ContentHandler will be also used in the Menu,
for better readability, store ContentHandler as Service.

MediaWikiServices will initialize service on first access and cache
it for future needs. Same applies to SkinUserPageHelper,

Bug: T216152
Change-Id: Ia98dc860862360a68556272714669f0c3a13eb1e
This commit is contained in:
Piotr Miazga 2019-04-10 14:52:34 +02:00
parent 4a5c719031
commit 572ffdf25a
4 changed files with 26 additions and 35 deletions

View File

@ -0,0 +1,13 @@
<?php
use MediaWiki\MediaWikiServices;
use MediaWiki\Minerva\SkinUserPageHelper;
return [
'Minerva.ContentHandler' => function ( MediaWikiServices $services ) {
return ContentHandler::getForTitle( RequestContext::getMain()->getTitle() );
},
'Minerva.SkinUserPageHelper' => function ( MediaWikiServices $services ) {
return new SkinUserPageHelper( RequestContext::getMain()->getTitle() );
}
];

View File

@ -20,7 +20,6 @@
use MediaWiki\Minerva\MenuBuilder; use MediaWiki\Minerva\MenuBuilder;
use MediaWiki\MediaWikiServices; use MediaWiki\MediaWikiServices;
use MediaWiki\Minerva\SkinUserPageHelper;
/** /**
* Minerva: Born from the godhead of Jupiter with weapons! * Minerva: Born from the godhead of Jupiter with weapons!
@ -48,12 +47,9 @@ class SkinMinerva extends SkinTemplate {
public $skinname = 'minerva'; public $skinname = 'minerva';
/** @var string $template Name of this used template */ /** @var string $template Name of this used template */
public $template = 'MinervaTemplate'; public $template = 'MinervaTemplate';
/** @var ContentHandler Content handler of page; only access through getContentHandler */
protected $contentHandler = null;
/** @var bool Whether the page is also available in other languages or variants */ /** @var bool Whether the page is also available in other languages or variants */
protected $doesPageHaveLanguages = false; protected $doesPageHaveLanguages = false;
/** @var SkinUserPageHelper Helper class for UserPage handling */
protected $userPageHelper;
/** /**
* Returns the site name for the footer, either as a text or <img> tag * Returns the site name for the footer, either as a text or <img> tag
@ -310,19 +306,6 @@ class SkinMinerva extends SkinTemplate {
return ''; return '';
} }
/**
* Gets content handler of current title
*
* @return ContentHandler
*/
protected function getContentHandler() {
if ( $this->contentHandler === null ) {
$this->contentHandler = ContentHandler::getForTitle( $this->getTitle() );
}
return $this->contentHandler;
}
/** /**
* Takes a title and returns classes to apply to the body tag * Takes a title and returns classes to apply to the body tag
* @param Title $title * @param Title $title
@ -378,10 +361,7 @@ class SkinMinerva extends SkinTemplate {
* @return SkinUserPageHelper * @return SkinUserPageHelper
*/ */
public function getUserPageHelper() { public function getUserPageHelper() {
if ( $this->userPageHelper === null ) { return MediaWikiServices::getInstance()->getService( 'Minerva.SkinUserPageHelper' );
$this->userPageHelper = new SkinUserPageHelper( $this->getContext()->getTitle() );
}
return $this->userPageHelper;
} }
/** /**
@ -1296,7 +1276,8 @@ class SkinMinerva extends SkinTemplate {
* @return bool * @return bool
*/ */
protected function isCurrentPageContentModelEditable() { protected function isCurrentPageContentModelEditable() {
$contentHandler = $this->getContentHandler(); $contentHandler = MediaWikiServices::getInstance()
->getService( 'Minerva.ContentHandler' );
return $contentHandler->supportsDirectEditing() return $contentHandler->supportsDirectEditing()
&& $contentHandler->supportsDirectApiEditing(); && $contentHandler->supportsDirectApiEditing();

View File

@ -548,5 +548,8 @@
] ]
} }
}, },
"ServiceWiringFiles": [
"includes/ServiceWiring.php"
],
"manifest_version": 1 "manifest_version": 1
} }

View File

@ -6,28 +6,21 @@ use SkinMinerva;
use MediaWikiTestCase; use MediaWikiTestCase;
use Title; use Title;
use RequestContext; use RequestContext;
use ContentHandler;
use MediaWiki\Minerva\SkinUserPageHelper; use MediaWiki\Minerva\SkinUserPageHelper;
// FIXME: That this class exists is an indicator that at least SkinMinerva#isAllowedPageAction // FIXME: That this class exists is an indicator that at least SkinMinerva#isAllowedPageAction
// should be extracted from SkinMinerva. // should be extracted from SkinMinerva.
// phpcs:ignore MediaWiki.Files.ClassMatchesFilename.NotMatch // phpcs:ignore MediaWiki.Files.ClassMatchesFilename.NotMatch
class TestSkinMinerva extends SkinMinerva { class TestSkinMinerva extends SkinMinerva {
public function isAllowedPageAction( $action ) { public function isAllowedPageAction( $action ) {
return parent::isAllowedPageAction( $action ); return parent::isAllowedPageAction( $action );
} }
public function setContentHandler( ContentHandler $contentHandler ) {
$this->contentHandler = $contentHandler;
}
public function setDoesPageHaveLanguages( $doesPageHaveLanguages ) { public function setDoesPageHaveLanguages( $doesPageHaveLanguages ) {
$this->doesPageHaveLanguages = $doesPageHaveLanguages; $this->doesPageHaveLanguages = $doesPageHaveLanguages;
} }
public function overWriteUserPageHelper( $helper ) {
$this->userPageHelper = $helper;
}
} }
/** /**
@ -51,7 +44,7 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase {
* @return TestSkinMinerva * @return TestSkinMinerva
*/ */
private function getSkin( Title $title ) { private function getSkin( Title $title ) {
$requestContext = new RequestContext(); $requestContext = RequestContext::getMain();
$requestContext->setTitle( $title ); $requestContext->setTitle( $title );
$result = new TestSkinMinerva(); $result = new TestSkinMinerva();
@ -122,7 +115,7 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase {
$contentHandler->method( 'supportsDirectApiEditing' ) $contentHandler->method( 'supportsDirectApiEditing' )
->will( $this->returnValue( $supportsDirectApiEditing ) ); ->will( $this->returnValue( $supportsDirectApiEditing ) );
$this->skin->setContentHandler( $contentHandler ); $this->setService( 'Minerva.ContentHandler', $contentHandler );
$this->assertEquals( $expected, $this->skin->isAllowedPageAction( 'edit' ) ); $this->assertEquals( $expected, $this->skin->isAllowedPageAction( 'edit' ) );
} }
@ -140,7 +133,8 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase {
->willReturn( true ); ->willReturn( true );
$skin = $this->getSkin( Title::newFromText( 'User:Admin' ) ); $skin = $this->getSkin( Title::newFromText( 'User:Admin' ) );
$skin->overWriteUserPageHelper( $userPageHelper );
$this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper );
$this->assertFalse( $skin->isAllowedPageAction( 'talk' ) ); $this->assertFalse( $skin->isAllowedPageAction( 'talk' ) );
} }
@ -158,7 +152,7 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase {
->willReturn( false ); ->willReturn( false );
$skin = $this->getSkin( Title::newFromText( 'User:Admin' ) ); $skin = $this->getSkin( Title::newFromText( 'User:Admin' ) );
$skin->overWriteUserPageHelper( $userPageHelper ); $this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper );
$this->assertTrue( $skin->isAllowedPageAction( 'talk' ) ); $this->assertTrue( $skin->isAllowedPageAction( 'talk' ) );
} }