Merge "resourceloader: Use UserIdentity in some cases"
This commit is contained in:
commit
4f15011bb1
7 changed files with 78 additions and 10 deletions
|
|
@ -20,6 +20,8 @@
|
|||
*/
|
||||
|
||||
use MediaWiki\MediaWikiServices;
|
||||
use MediaWiki\User\UserFactory;
|
||||
use MediaWiki\User\UserIdentity;
|
||||
|
||||
/**
|
||||
* A mutable version of ResourceLoaderContext.
|
||||
|
|
@ -48,6 +50,8 @@ class DerivativeResourceLoaderContext extends ResourceLoaderContext {
|
|||
protected $skin = self::INHERIT_VALUE;
|
||||
/** @var int|string|null */
|
||||
protected $user = self::INHERIT_VALUE;
|
||||
/** @var int|UserIdentity|null|false */
|
||||
protected $userIdentity = self::INHERIT_VALUE;
|
||||
/** @var int|User|null */
|
||||
protected $userObj = self::INHERIT_VALUE;
|
||||
/** @var int */
|
||||
|
|
@ -129,6 +133,25 @@ class DerivativeResourceLoaderContext extends ResourceLoaderContext {
|
|||
return $this->user;
|
||||
}
|
||||
|
||||
public function getUserIdentity(): ?UserIdentity {
|
||||
if ( $this->userIdentity === self::INHERIT_VALUE ) {
|
||||
return $this->context->getUserIdentity();
|
||||
}
|
||||
if ( $this->userIdentity === false ) {
|
||||
$username = $this->getUser();
|
||||
if ( $username === null ) {
|
||||
// Anonymous user
|
||||
$this->userIdentity = null;
|
||||
} else {
|
||||
// Use provided username if valid
|
||||
$this->userIdentity = MediaWikiServices::getInstance()
|
||||
->getUserFactory()
|
||||
->newFromName( $username, UserFactory::RIGOR_VALID );
|
||||
}
|
||||
}
|
||||
return $this->userIdentity;
|
||||
}
|
||||
|
||||
public function getUserObj(): User {
|
||||
if ( $this->userObj === self::INHERIT_VALUE ) {
|
||||
return $this->context->getUserObj();
|
||||
|
|
@ -152,6 +175,7 @@ class DerivativeResourceLoaderContext extends ResourceLoaderContext {
|
|||
$this->hash = null;
|
||||
// Clear getUserObj cache
|
||||
$this->userObj = null;
|
||||
$this->userIdentity = false;
|
||||
}
|
||||
|
||||
public function getDebug(): int {
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@
|
|||
use MediaWiki\Logger\LoggerFactory;
|
||||
use MediaWiki\MediaWikiServices;
|
||||
use MediaWiki\Page\PageReferenceValue;
|
||||
use MediaWiki\User\UserFactory;
|
||||
use MediaWiki\User\UserIdentity;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
/**
|
||||
|
|
@ -81,6 +83,8 @@ class ResourceLoaderContext implements MessageLocalizer {
|
|||
protected $hash;
|
||||
/** @var User|null */
|
||||
protected $userObj;
|
||||
/** @var UserIdentity|null|false */
|
||||
protected $userIdentity = false;
|
||||
/** @var ResourceLoaderImage|false */
|
||||
protected $imageObj;
|
||||
|
||||
|
|
@ -261,6 +265,31 @@ class ResourceLoaderContext implements MessageLocalizer {
|
|||
->page( PageReferenceValue::localReference( NS_SPECIAL, 'Badtitle/ResourceLoaderContext' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the possibly-cached UserIdentity object for the specified username
|
||||
*
|
||||
* This will be null on most requests,
|
||||
* except for load.php requests that have a 'user' parameter set.
|
||||
*
|
||||
* @since 1.38
|
||||
* @return UserIdentity|null
|
||||
*/
|
||||
public function getUserIdentity(): ?UserIdentity {
|
||||
if ( $this->userIdentity === false ) {
|
||||
$username = $this->getUser();
|
||||
if ( $username === null ) {
|
||||
// Anonymous user
|
||||
$this->userIdentity = null;
|
||||
} else {
|
||||
// Use provided username if valid
|
||||
$this->userIdentity = MediaWikiServices::getInstance()
|
||||
->getUserFactory()
|
||||
->newFromName( $username, UserFactory::RIGOR_VALID );
|
||||
}
|
||||
}
|
||||
return $this->userIdentity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the possibly-cached User object for the specified username
|
||||
*
|
||||
|
|
|
|||
|
|
@ -37,17 +37,18 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
|
|||
* @return array[]
|
||||
*/
|
||||
protected function getPages( ResourceLoaderContext $context ) {
|
||||
$config = $this->getConfig();
|
||||
$user = $context->getUserObj();
|
||||
if ( !$user->isRegistered() ) {
|
||||
$user = $context->getUserIdentity();
|
||||
if ( !$user || !$user->isRegistered() ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Use localised/normalised variant to ensure $excludepage matches
|
||||
$userPage = $user->getUserPage()->getPrefixedDBkey();
|
||||
$config = $this->getConfig();
|
||||
$pages = [];
|
||||
|
||||
if ( $config->get( 'AllowUserJs' ) ) {
|
||||
$titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
|
||||
// Use localised/normalised variant to ensure $excludepage matches
|
||||
$userPage = $titleFormatter->getPrefixedDBkey( new TitleValue( NS_USER, $user->getName() ) );
|
||||
$pages["$userPage/common.js"] = [ 'type' => 'script' ];
|
||||
$pages["$userPage/" . $context->getSkin() . '.js'] = [ 'type' => 'script' ];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
|
|||
$user = $context->getUserObj();
|
||||
|
||||
$tokens = [
|
||||
// Replacement is tricky - T287542
|
||||
'patrolToken' => $user->getEditToken( 'patrol' ),
|
||||
'watchToken' => $user->getEditToken( 'watch' ),
|
||||
'csrfToken' => $user->getEditToken(),
|
||||
|
|
|
|||
|
|
@ -38,17 +38,18 @@ class ResourceLoaderUserStylesModule extends ResourceLoaderWikiModule {
|
|||
* @return array[]
|
||||
*/
|
||||
protected function getPages( ResourceLoaderContext $context ) {
|
||||
$config = $this->getConfig();
|
||||
$user = $context->getUserObj();
|
||||
if ( !$user->isRegistered() ) {
|
||||
$user = $context->getUserIdentity();
|
||||
if ( !$user || !$user->isRegistered() ) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Use localised/normalised variant to ensure $excludepage matches
|
||||
$userPage = $user->getUserPage()->getPrefixedDBkey();
|
||||
$config = $this->getConfig();
|
||||
$pages = [];
|
||||
|
||||
if ( $config->get( 'AllowUserCss' ) ) {
|
||||
$titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
|
||||
// Use localised/normalised variant to ensure $excludepage matches
|
||||
$userPage = $titleFormatter->getPrefixedDBkey( new TitleValue( NS_USER, $user->getName() ) );
|
||||
$pages["$userPage/common.css"] = [ 'type' => 'style' ];
|
||||
$pages["$userPage/" . $context->getSkin() . '.css'] = [ 'type' => 'style' ];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
<?php
|
||||
|
||||
use MediaWiki\User\UserIdentity;
|
||||
|
||||
/**
|
||||
* @group ResourceLoader
|
||||
* @covers DerivativeResourceLoaderContext
|
||||
|
|
@ -66,17 +68,24 @@ class DerivativeResourceLoaderContextTest extends MediaWikiIntegrationTestCase {
|
|||
|
||||
public function testChangeUserObj() {
|
||||
$user = $this->createMock( User::class );
|
||||
$userIdentity = $this->createMock( UserIdentity::class );
|
||||
$parent = $this->createMock( ResourceLoaderContext::class );
|
||||
$parent
|
||||
->expects( $this->once() )
|
||||
->method( 'getUserObj' )
|
||||
->willReturn( $user );
|
||||
$parent
|
||||
->expects( $this->once() )
|
||||
->method( 'getUserIdentity' )
|
||||
->willReturn( $userIdentity );
|
||||
|
||||
$derived = new DerivativeResourceLoaderContext( $parent );
|
||||
$this->assertSame( $derived->getUserObj(), $user, 'inherit from parent' );
|
||||
$this->assertSame( $derived->getUserIdentity(), $userIdentity, 'inherit from parent' );
|
||||
|
||||
$derived->setUser( null );
|
||||
$this->assertNotSame( $derived->getUserObj(), $user, 'different' );
|
||||
$this->assertNull( $derived->getUserIdentity(), 'no user identity' );
|
||||
}
|
||||
|
||||
public function testChangeDebug() {
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ class ResourceLoaderContextTest extends PHPUnit\Framework\TestCase {
|
|||
$this->assertEquals( 'qqx|fallback|0|||||||', $ctx->getHash() );
|
||||
$this->assertSame( [], $ctx->getReqBase() );
|
||||
$this->assertInstanceOf( User::class, $ctx->getUserObj() );
|
||||
$this->assertNull( $ctx->getUserIdentity() );
|
||||
}
|
||||
|
||||
public function testDummy() {
|
||||
|
|
@ -134,12 +135,14 @@ class ResourceLoaderContextTest extends PHPUnit\Framework\TestCase {
|
|||
$ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [] ) );
|
||||
$this->assertSame( null, $ctx->getUser() );
|
||||
$this->assertFalse( $ctx->getUserObj()->isRegistered() );
|
||||
$this->assertNull( $ctx->getUserIdentity() );
|
||||
|
||||
$ctx = new ResourceLoaderContext( $this->getResourceLoader(), new FauxRequest( [
|
||||
'user' => 'Example'
|
||||
] ) );
|
||||
$this->assertSame( 'Example', $ctx->getUser() );
|
||||
$this->assertEquals( 'Example', $ctx->getUserObj()->getName() );
|
||||
$this->assertEquals( 'Example', $ctx->getUserIdentity()->getName() );
|
||||
}
|
||||
|
||||
public function testMsg() {
|
||||
|
|
|
|||
Loading…
Reference in a new issue