Treat anonymouse user IP pages as UserPages

Ensure SkinUserPageHelper::isUserPage() returns true for user pages
that are IP addresses.

Also adds the page-action menu to all user pages.

Bug: T220114
Change-Id: I3703899bc9ff0042c74260d36f48a388b78b0b6b
This commit is contained in:
Jan Drewniak 2019-05-23 11:55:21 +02:00
parent 3598618390
commit 7af32bc309
4 changed files with 78 additions and 22 deletions

View File

@ -234,10 +234,7 @@ class SkinMinerva extends SkinTemplate {
return $this->skinOptions->get( SkinOptions::OPTION_OVERFLOW_SUBMENU );
}
if (
!in_array( $action, $config->get( 'MinervaPageActions' ) )
|| ( $this->getUserPageHelper()->isUserPage() && !$title->exists() )
) {
if ( !in_array( $action, $config->get( 'MinervaPageActions' ) ) ) {
return false;
}

View File

@ -46,33 +46,50 @@ class SkinUserPageHelper {
}
/**
* Fetch user data and store locally for perfomance improvement
* Fetch user data and store locally for performance improvement
* @return User|null
*/
private function fetchData() {
if ( $this->fetchedData === false ) {
if ( $this->title->inNamespace( NS_USER ) && !$this->title->isSubpage() ) {
$pageUserId = User::idFromName( $this->title->getText() );
if ( $pageUserId ) {
$this->pageUser = User::newFromId( $pageUserId );
}
$this->pageUser = $this->buildPageUserObject( $this->title );
}
$this->fetchedData = true;
}
return $this->pageUser;
}
/**
* Return new User object based on username or IP address.
* @param Title $title
* @return User|null
*/
private function buildPageUserObject( Title $title ) {
$titleText = $title->getText();
if ( User::isIP( $titleText ) ) {
return User::newFromAnyId( null, $titleText, null );
}
$pageUserId = User::idFromName( $titleText );
if ( $pageUserId ) {
return User::newFromId( $pageUserId );
}
return null;
}
/**
* @return User|null
*/
public function getPageUser() {
$this->fetchData();
return $this->pageUser;
return $this->fetchData();
}
/**
* @return bool
*/
public function isUserPage() {
$this->fetchData();
return $this->pageUser !== null;
return $this->fetchData() !== null;
}
}

View File

@ -128,15 +128,11 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase {
->disableOriginalConstructor()
->getMock();
$userPageHelper->expects( $this->once() )
->method( 'isUserPage' )
->willReturn( true );
$skin = $this->getSkin( Title::newFromText( 'User:Admin' ) );
$this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper );
$this->assertFalse( $skin->isAllowedPageAction( 'talk' ) );
$this->assertTrue( $skin->isAllowedPageAction( 'talk' ) );
}
/**
@ -147,11 +143,21 @@ class SkinMinervaPageActionsTest extends MediaWikiTestCase {
->disableOriginalConstructor()
->getMock();
$userPageHelper->expects( $this->once() )
->method( 'isUserPage' )
->willReturn( false );
$skin = $this->getSkin( Title::newFromText( 'A_test_page' ) );
$this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper );
$skin = $this->getSkin( Title::newFromText( 'User:Admin' ) );
$this->assertTrue( $skin->isAllowedPageAction( 'talk' ) );
}
/**
* @covers SkinMinerva::isAllowedPageAction
*/
public function testPageActionsWhenOnAnonUserPage() {
$userPageHelper = $this->getMockBuilder( SkinUserPageHelper::class )
->disableOriginalConstructor()
->getMock();
$skin = $this->getSkin( Title::newFromText( 'User:1.1.1.1' ) );
$this->setService( 'Minerva.SkinUserPageHelper', $userPageHelper );
$this->assertTrue( $skin->isAllowedPageAction( 'talk' ) );

View File

@ -35,6 +35,42 @@ class SkinUserPageHelperTest extends MediaWikiTestCase {
$this->assertEquals( false, $helper->isUserPage() );
}
/**
* @covers ::isUserPage
* @covers ::fetchData
* @covers ::buildPageUserObject
*/
public function testTitleisAnIP() {
$title = Title::newFromText( 'User:127.0.0.1' );
$helper = new SkinUserPageHelper( $title );
$this->assertEquals( true, $helper->isUserPage() );
}
/**
* @covers ::isUserPage
* @covers ::fetchData
* @covers ::buildPageUserObject
*/
public function testTitleIsIPRange() {
$title = Title::newFromText( 'User:127.0.0.1/24' );
$helper = new SkinUserPageHelper( $title );
$this->assertEquals( false, $helper->isUserPage() );
}
/**
* @covers ::isUserPage
* @covers ::fetchData
* @covers ::buildPageUserObject
*/
public function testTitleIsFakeUserPage() {
$title = Title::newFromText( 'User:Fake user' );
$helper = new SkinUserPageHelper( $title );
$this->assertEquals( false, $helper->isUserPage() );
}
/**
* @covers ::fetchData
*/