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\MediaWikiServices;
use MediaWiki\Minerva\SkinUserPageHelper;
/**
* Minerva: Born from the godhead of Jupiter with weapons!
@ -48,12 +47,9 @@ class SkinMinerva extends SkinTemplate {
public $skinname = 'minerva';
/** @var string $template Name of this used template */
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 */
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
@ -310,19 +306,6 @@ class SkinMinerva extends SkinTemplate {
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
* @param Title $title
@ -378,10 +361,7 @@ class SkinMinerva extends SkinTemplate {
* @return SkinUserPageHelper
*/
public function getUserPageHelper() {
if ( $this->userPageHelper === null ) {
$this->userPageHelper = new SkinUserPageHelper( $this->getContext()->getTitle() );
}
return $this->userPageHelper;
return MediaWikiServices::getInstance()->getService( 'Minerva.SkinUserPageHelper' );
}
/**
@ -1296,7 +1276,8 @@ class SkinMinerva extends SkinTemplate {
* @return bool
*/
protected function isCurrentPageContentModelEditable() {
$contentHandler = $this->getContentHandler();
$contentHandler = MediaWikiServices::getInstance()
->getService( 'Minerva.ContentHandler' );
return $contentHandler->supportsDirectEditing()
&& $contentHandler->supportsDirectApiEditing();

View File

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

View File

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