// approximate error count: 45
"PhanTypeMismatchArgument",
- // approximate error count: 693
- "PhanUndeclaredProperty",
] );
// This helps a lot in discovering bad code, but unfortunately it will always fail for
// @todo Enable when the issue above is resolved and we update our config!
$cfg['redundant_condition_detection'] = false;
+// Do not use aliases in core.
+// Use the correct name, because we don't need backward compatibility
+$cfg['enable_class_alias_support'] = false;
+
$cfg['ignore_undeclared_variables_in_global_scope'] = true;
// @todo It'd be great if we could just make phan read these from DefaultSettings, to avoid
// duplicating the types.
* Revision::selectPageFields()
* Revision::selectUserFields()
* User::setNewpassword(), deprecated in 1.27 has been removed.
+* The ObjectCache::getMainWANInstance and ObjectCache::getMainStashInstance
+ functions, deprecated since 1.28, have been removed.
=== Deprecations in 1.34 ===
* The MWNamespace class is deprecated. Use NamespaceInfo.
Note that lists should be in the format name => object and the names in both
lists should be distinct.
-'SecondaryDataUpdates': DEPRECATED! Use RevisionDataUpdates or override
+'SecondaryDataUpdates': DEPRECATED since 1.32! Use RevisionDataUpdates or override
ContentHandler::getSecondaryDataUpdates instead.
Allows modification of the list of DataUpdates to perform when page content is modified.
$title: Title of the page that is being edited.
&$opts: Options to use for the query
&$join: Join conditions
-'WikiPageDeletionUpdates': DEPRECATED! Use PageDeletionDataUpdates or
+'WikiPageDeletionUpdates': DEPRECATED since 1.32! Use PageDeletionDataUpdates or
override ContentHandler::getDeletionDataUpdates instead.
Manipulates the list of DeferrableUpdates to be applied when a page is deleted.
$page: the WikiPage
use MediaWiki\EditPage\TextConflictHelper;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\ScopedCallback;
/**
* content.
*
* @param Content|null|bool|string $content
- * @return string The editable text form of the content.
+ * @return string|false|null The editable text form of the content.
*
* @throws MWException If $content is not an instance of TextContent and
* $this->allowNonTextContent is not true.
* @ingroup Feed
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Helper functions for feeds
*
* @param array $cprefs Client's acceptable type list
* @param array $sprefs Server's offered types
- * @return string
+ * @return string|null
*
* @todo FIXME: Doesn't handle params like 'text/plain; charset=UTF-8'
* XXX: generalize to negotiate other stuff
+ * @todo The function appears unused. Is it worth to keep?
*/
function wfNegotiateType( $cprefs, $sprefs ) {
$combine = [];
*/
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Some internal bits split of from Skin.php. These functions are used
* a OutputPage tied to that context.
* @param IContextSource $context
*/
- function __construct( IContextSource $context ) {
+ public function __construct( IContextSource $context ) {
$this->setContext( $context );
}
* @param string $name Name of the meta tag
* @param string $val Value of the meta tag
*/
- function addMeta( $name, $val ) {
- array_push( $this->mMetatags, [ $name, $val ] );
+ public function addMeta( $name, $val ) {
+ $this->mMetatags[] = [ $name, $val ];
}
/**
*
* @param array $linkarr Associative array of attributes.
*/
- function addLink( array $linkarr ) {
- array_push( $this->mLinktags, $linkarr );
+ public function addLink( array $linkarr ) {
+ $this->mLinktags[] = $linkarr;
}
/**
* in preference to addLink(), to avoid duplicate link tags.
* @param string $url
*/
- function setCanonicalUrl( $url ) {
+ public function setCanonicalUrl( $url ) {
$this->mCanonicalUrl = $url;
}
*
* @param string $script Raw HTML
*/
- function addScript( $script ) {
+ public function addScript( $script ) {
$this->mScripts .= $script;
}
*
* @return array
*/
- function getHeadItemsArray() {
+ public function getHeadItemsArray() {
return $this->mHeadItems;
}
* @param ParserOptions|null $options Either the ParserOption to use or null to only get the
* current ParserOption object. This parameter is deprecated since 1.31.
* @return ParserOptions
+ * @suppress PhanUndeclaredProperty For isBogus
*/
public function parserOptions( $options = null ) {
if ( $options !== null ) {
* @param ParserOutput $parserOutput
* @param array $poOptions Options to ParserOutput::getText()
*/
- function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
+ public function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
$this->addParserOutputMetadata( $parserOutput );
$this->addParserOutputText( $parserOutput, $poOptions );
}
*
* @return array
*/
- function getCacheVaryCookies() {
+ public function getCacheVaryCookies() {
if ( self::$cacheVaryCookies === null ) {
$config = $this->getConfig();
self::$cacheVaryCookies = array_values( array_unique( array_merge(
*
* @return bool
*/
- function haveCacheVaryCookies() {
+ public function haveCacheVaryCookies() {
$request = $this->getRequest();
foreach ( $this->getCacheVaryCookies() as $cookieName ) {
if ( $request->getCookie( $cookieName, '', '' ) !== '' ) {
use ActorMigration;
use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
+use Psr\Log\LoggerInterface;
use MediaWiki\Storage\BlobStoreFactory;
use MediaWiki\Storage\NameTableStoreFactory;
use WANObjectCache;
private $dbLoadBalancerFactory;
/** @var WANObjectCache */
private $cache;
- /** @var LoggerSpi */
- private $loggerProvider;
+ /** @var LoggerInterface */
+ private $logger;
/** @var CommentStore */
private $commentStore;
* @param CommentStore $commentStore
* @param ActorMigration $actorMigration
* @param int $migrationStage
- * @param LoggerSpi $loggerProvider
+ * @param LoggerInterface $logger
* @param bool $contentHandlerUseDB see {@link $wgContentHandlerUseDB}. Must be the same
* for all wikis in the cluster. Will go away after MCR migration.
*/
CommentStore $commentStore,
ActorMigration $actorMigration,
$migrationStage,
- LoggerSpi $loggerProvider,
+ LoggerInterface $logger,
$contentHandlerUseDB
) {
Assert::parameterType( 'integer', $migrationStage, '$migrationStage' );
$this->commentStore = $commentStore;
$this->actorMigration = $actorMigration;
$this->mcrMigrationStage = $migrationStage;
- $this->loggerProvider = $loggerProvider;
+ $this->logger = $logger;
$this->contentHandlerUseDB = $contentHandlerUseDB;
}
*
* @param bool|string $dbDomain DB domain of the relevant wiki or false for the current one
*
- * @return RevisionStore for the given wikiId with all necessary services and a logger
+ * @return RevisionStore for the given wikiId with all necessary services
*/
public function getRevisionStore( $dbDomain = false ) {
Assert::parameterType( 'string|boolean', $dbDomain, '$dbDomain' );
$dbDomain
);
- $store->setLogger( $this->loggerProvider->getLogger( 'RevisionStore' ) );
+ $store->setLogger( $this->logger );
$store->setContentHandlerUseDB( $this->contentHandlerUseDB );
return $store;
new ServiceOptions(
BlockManager::$constructorOptions, $services->getMainConfig()
),
- $services->getPermissionManager()
+ $services->getPermissionManager(),
+ LoggerFactory::getInstance( 'BlockManager' )
);
},
$services->getCommentStore(),
$services->getActorMigration(),
$config->get( 'MultiContentRevisionSchemaMigrationStage' ),
- LoggerFactory::getProvider(),
+ LoggerFactory::getInstance( 'RevisionStore' ),
$config->get( 'ContentHandlerUseDB' )
);
* ]
*
* @return Status[]
+ * @suppress PhanUndeclaredProperty Status vs StatusValue
*/
public function splitByErrorType() {
list( $errorsOnlyStatus, $warningsOnlyStatus ) = parent::splitByErrorType();
* @param ExternalStoreAccess $extStoreAccess Access layer for external storage
* @param WANObjectCache $cache A cache manager for caching blobs. This can be the local
* wiki's default instance even if $dbDomain refers to a different wiki, since
- * makeGlobalKey() is used to constructed a key that allows cached blobs from the
- * same database to be re-used between wikis. For example, enwiki and frwiki will
- * use the same cache keys for blobs from the wikidatawiki database, regardless of
- * the cache's default key space.
+ * makeGlobalKey() is used to construct a key that allows cached blobs from the
+ * same database to be re-used between wikis. For example, wiki A and wiki B will
+ * use the same cache keys for blobs fetched from wiki C, regardless of the
+ * wiki-specific default key space.
* @param bool|string $dbDomain The ID of the target wiki database. Use false for the local wiki.
*/
public function __construct(
* Get a cache key for a given Blob address.
*
* The cache key is constructed in a way that allows cached blobs from the same database
- * to be re-used between wikis. For example, enwiki and frwiki will use the same cache keys
- * for blobs from the wikidatawiki database.
+ * to be re-used between wikis. For example, wiki A and wiki B will use the same cache keys
+ * for blobs fetched from wiki C.
*
* @param string $blobAddress
* @return string
*/
private function getCacheKey( $blobAddress ) {
return $this->cache->makeGlobalKey(
- 'BlobStore',
- 'address',
+ 'SqlBlobStore-blob',
$this->dbLoadBalancer->resolveDomainID( $this->dbDomain ),
$blobAddress
);
*/
use MediaWiki\Permissions\PermissionManager;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Assert\Assert;
use Wikimedia\Rdbms\Database;
use Wikimedia\Rdbms\IDatabase;
*
* @param string $name
* @param array|null $default Option default (or null)
- * @return array Array of ints
+ * @return int[]|null
*/
public function getIntArray( $name, $default = null ) {
$val = $this->getArray( $name, $default );
use MediaWiki\MediaWikiServices;
/**
- * @defgroup Actions Action done on pages
+ * @defgroup Actions Actions
*/
/**
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\Database;
/**
* @ingroup Actions
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* User interface for the rollback action
'editchangetags' => 'EditTags',
];
+ /**
+ * @inheritDoc
+ */
public function getName() {
$request = $this->getRequest();
$actionName = $request->getVal( 'action', 'view' );
use MediaWiki\Revision\RevisionStore;
use MediaWiki\Revision\SlotRecord;
+/**
+ * @ingroup API
+ */
class ApiComparePages extends ApiBase {
/** @var RevisionStore */
);
if ( $row ) {
$rev = $this->revisionStore->newRevisionFromArchiveRow( $row );
+ // @phan-suppress-next-line PhanUndeclaredProperty
$rev->isArchive = true;
}
}
}
}
+ // @phan-suppress-next-line PhanUndeclaredProperty
if ( !empty( $rev->isArchive ) ) {
$this->getMain()->setCacheMode( 'private' );
$vals["{$prefix}archive"] = true;
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* A module that allows for editing and creating pages.
* @file
*/
+/**
+ * @ingroup API
+ */
class ApiFormatXmlRsd extends ApiFormatXml {
public function __construct( ApiMain $main, $format ) {
parent::__construct( $main, $format );
* 'APIGetParamDescriptionMessages' hook simple.
*
* @since 1.25
+ * @ingroup API
*/
class ApiHelpParamValueMessage extends Message {
<?php
-
-use MediaWiki\MediaWikiServices;
-
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* @file
*/
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @ingroup API
+ */
class ApiImageRotate extends ApiBase {
private $mPageSet = null;
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* @ingroup API
private $redirect;
private $bl_ns, $bl_from, $bl_from_ns, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
+ /** @var string */
+ private $helpUrl;
+
/**
* Maps ns and title to pageid
*
use MediaWiki\MediaWikiServices;
use MediaWiki\Storage\NameTableAccessException;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Query module to enumerate all deleted revisions.
* @param string $name
* @return QueryPage
*/
- private function getSpecialPage( $name ) {
+ private function getSpecialPage( $name ) : QueryPage {
$qp = $this->specialPageFactory->getPage( $name );
if ( !$qp ) {
self::dieDebug(
use MediaWiki\Permissions\PermissionManager;
use MediaWiki\User\UserIdentity;
use MWCryptHash;
+use Psr\Log\LoggerInterface;
use User;
use WebRequest;
use WebResponse;
* @since 1.34 Refactored from User and Block.
*/
class BlockManager {
+ /** @var PermissionManager */
+ private $permissionManager;
+
+ /** @var ServiceOptions */
+ private $options;
+
/**
* TODO Make this a const when HHVM support is dropped (T192166)
*
'SoftBlockRanges',
];
+ /** @var LoggerInterface */
+ private $logger;
+
/**
* @param ServiceOptions $options
* @param PermissionManager $permissionManager
+ * @param LoggerInterface $logger
*/
public function __construct(
ServiceOptions $options,
- PermissionManager $permissionManager
+ PermissionManager $permissionManager,
+ LoggerInterface $logger
) {
$options->assertRequiredOptions( self::$constructorOptions );
$this->options = $options;
$this->permissionManager = $permissionManager;
+ $this->logger = $logger;
}
/**
$ipList = $this->checkHost( $hostname );
if ( $ipList ) {
- wfDebugLog(
- 'dnsblacklist',
+ $this->logger->info(
"Hostname $hostname is {$ipList[0]}, it's a proxy says $basename!"
);
$found = true;
break;
}
- wfDebugLog( 'dnsblacklist', "Requested $hostname, not found in $basename." );
+ $this->logger->debug( "Requested $hostname, not found in $basename." );
}
}
<?php
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Helper class for category membership changes
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Feed to Special:RecentChanges and Special:RecentChangesLinked.
*/
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IResultWrapper;
class ChangesList extends ContextSource {
<?php
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Generates a list of changes using an Enhanced system (uses javascript).
* @file
*/
use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
class RCCacheEntryFactory {
*/
public function newFromRecentChange( RecentChange $baseRC, $watched ) {
$user = $this->context->getUser();
- $counter = $baseRC->counter;
$cacheEntry = RCCacheEntry::newFromParent( $baseRC );
// called too many times (50% of CPU time on RecentChanges!).
$showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
- $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
- $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
+ $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks );
+ $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks );
$cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
// Make user links
/**
* @param RecentChange $cacheEntry
* @param bool $showDiffLinks
- * @param int $counter
*
* @return string
*/
- private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+ private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks ) {
$queryParams = $this->buildCurQueryParams( $cacheEntry );
$curMessage = $this->getMessage( 'cur' );
$logTypes = [ RC_LOG ];
/**
* @param RecentChange $cacheEntry
* @param bool $showDiffLinks
- * @param int $counter
*
* @return string
*/
- private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+ private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks ) {
$queryParams = $this->buildDiffQueryParams( $cacheEntry );
$diffMessage = $this->getMessage( 'diff' );
$logTypes = [ RC_NEW, RC_LOG ];
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Item class for a logging table row with its associated change tags.
/** @var array $puaSubset List of private use area codes */
private $puaSubset;
+ /** @var array */
+ private $firstLetters;
+
/**
* @note This assumes $alphabet does not contain U+F3000-U+F3FFF
*
* @author Daniel Kinzler
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Assert\Assert;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
* goal.
*/
class ConsoleLogger extends AbstractLogger {
+ /** @var string */
+ private $channel;
+
/**
* @param string $channel
*/
*/
use MediaWiki\MediaWikiServices as MediaWikiServicesAlias;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IResultWrapper;
use Wikimedia\Rdbms\IDatabase;
/** @var WANObjectCache */
protected $wanCache;
+ /**
+ * @var string
+ * @protected Use $this->getName(). Public for back-compat only
+ */
+ public $name;
+
/**
* @param array|null $info
* @throws MWException
/** @var Title */
protected $title; # image title
+ /** @var bool */
+ private $exists;
+
/**
* @throws MWException
* @param Title $title
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Helper class for file deletion
// autoload entries for the lowercase variants of these classes (T166759).
// The code below is never executed, but it is picked up by the AutoloadGenerator
// parser, which scans for class_alias() calls.
- // @phan-suppress-next-line PhanRedefineClassAlias
class_alias( ConcatenatedGzipHistoryBlob::class, 'concatenatedgziphistoryblob' );
}
// autoload entries for the lowercase variants of these classes (T166759).
// The code below is never executed, but it is picked up by the AutoloadGenerator
// parser, which scans for class_alias() calls.
- // @phan-suppress-next-line PhanRedefineClassAlias
class_alias( HistoryBlobCurStub::class, 'historyblobcurstub' );
}
// autoload entries for the lowercase variants of these classes (T166759).
// The code below is never executed, but it is picked up by the AutoloadGenerator
// parser, which scans for class_alias() calls.
- // @phan-suppress-next-line PhanRedefineClassAlias
class_alias( HistoryBlobStub::class, 'historyblobstub' );
}
* @param OOUI\Widget $inputField
* @param array $config
* @return OOUI\FieldLayout|OOUI\ActionFieldLayout
+ * @suppress PhanUndeclaredProperty Only some subclasses declare mClassWithButton
*/
protected function getFieldLayoutOOUI( $inputField, $config ) {
if ( isset( $this->mClassWithButton ) ) {
* @todo FIXME: If made 'required', only the text field should be compulsory.
*/
class HTMLSelectAndOtherField extends HTMLSelectField {
+ /** @var string[] */
+ private $mFlatOptions;
+
public function __construct( $params ) {
if ( array_key_exists( 'other', $params ) ) {
// Do nothing
*
* @private for use by GuzzleHttpRequest only
* @since 1.33
+ * @property StreamInterface $stream Defined in StreamDecoratorTrait via @property, not read by phan
*/
class MWCallbackStream implements StreamInterface {
use StreamDecoratorTrait;
* @ingroup SpecialPage
*/
class ImportStreamSource implements ImportSource {
+ /** @var resource */
+ private $mHandle;
+
/**
* @param resource $handle
*/
* @ingroup SpecialPage
*/
class WikiImporter {
- private $reader = null;
+ /** @var XMLReader */
+ private $reader;
private $foreignNamespaces = null;
private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
private $mSiteInfoCallback, $mPageOutCallback;
*/
class InstallDocFormatter {
+ /** @var string */
+ private $text;
+
public static function format( $text ) {
$obj = new self( $text );
class LocalSettingsGenerator {
protected $extensions = [];
+ protected $skins = [];
protected $values = [];
protected $groupPermissions = [];
protected $dbSettings = '';
*
* @ingroup Deployment
* @since 1.17
- * @property DatabaseMysqlBase $db
+ * @property Wikimedia\Rdbms\DatabaseMysqlBase $db
*/
class MysqlUpdater extends DatabaseUpdater {
protected function getCoreUpdateList() {
*/
use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabasePostgres;
use Wikimedia\Rdbms\DBQueryError;
use Wikimedia\Rdbms\DBConnectionError;
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* This class formats delete log entries.
* @param File|FSFile $image
* @param string $path
* @return DjVuImage
+ * @suppress PhanUndeclaredProperty Custom property
*/
function getDjVuImage( $image, $path ) {
if ( !$image ) {
* @param File $image
* @param bool $gettext DOCUMENT (Default: false)
* @return bool|SimpleXMLElement
+ * @suppress PhanUndeclaredProperty Custom property
*/
public function getMetaTree( $image, $gettext = false ) {
if ( $gettext && isset( $image->djvuTextTree ) ) {
*/
const DJVUTXT_MEMORY_LIMIT = 300000;
+ /** @var string */
+ private $mFilename;
+
/**
* @param string $filename The DjVu file name.
*/
return self::getInstance( $wgMainCacheType );
}
- /**
- * Get the main WAN cache object.
- *
- * @since 1.26
- * @return WANObjectCache
- * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainWANObjectCache()
- */
- public static function getMainWANInstance() {
- wfDeprecated( __METHOD__, '1.28' );
- return MediaWikiServices::getInstance()->getMainWANObjectCache();
- }
-
- /**
- * Get the cache object for the main stash.
- *
- * @return BagOStuff
- * @since 1.26
- * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainObjectStash()
- */
- public static function getMainStashInstance() {
- wfDeprecated( __METHOD__, '1.28' );
- return MediaWikiServices::getInstance()->getMainObjectStash();
- }
-
/**
* Clear all the cached instances.
*/
Hooks::run( 'ArticleUndelete',
[ &$this->title, $created, $comment, $oldPageId, $restoredPages ] );
+
if ( $this->title->getNamespace() == NS_FILE ) {
- DeferredUpdates::addUpdate(
- new HTMLCacheUpdate( $this->title, 'imagelinks', 'file-restore' )
+ $job = HTMLCacheUpdateJob::newForBacklinks(
+ $this->title,
+ 'imagelinks',
+ [ 'causeAction' => 'file-restore' ]
);
+ JobQueueGroup::singleton()->lazyPush( $job );
}
}
if ( $this->mFile->exists() ) {
wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
- DeferredUpdates::addUpdate(
- new HTMLCacheUpdate( $this->mTitle, 'imagelinks', 'file-purge' )
+ $job = HTMLCacheUpdateJob::newForBacklinks(
+ $this->mTitle,
+ 'imagelinks',
+ [ 'causeAction' => 'file-purge' ]
);
+ JobQueueGroup::singleton()->lazyPush( $job );
} else {
wfDebug( 'ImagePage::doPurge no image for '
. $this->mFile->getName() . "; limiting purge to cache only\n" );
MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
// Invalidate caches of articles which include this page
- DeferredUpdates::addUpdate(
- new HTMLCacheUpdate( $title, 'templatelinks', 'page-create' )
+ $job = HTMLCacheUpdateJob::newForBacklinks(
+ $title,
+ 'templatelinks',
+ [ 'causeAction' => 'page-create' ]
);
+ JobQueueGroup::singleton()->lazyPush( $job );
if ( $title->getNamespace() == NS_CATEGORY ) {
// Load the Category object, which will schedule a job to create
// Images
if ( $title->getNamespace() == NS_FILE ) {
- DeferredUpdates::addUpdate(
- new HTMLCacheUpdate( $title, 'imagelinks', 'page-delete' )
+ $job = HTMLCacheUpdateJob::newForBacklinks(
+ $title,
+ 'imagelinks',
+ [ 'causeAction' => 'page-delete' ]
);
+ JobQueueGroup::singleton()->lazyPush( $job );
}
// User talk pages
$slotsChanged = null
) {
// TODO: move this into a PageEventEmitter service
-
- if ( $slotsChanged === null || in_array( SlotRecord::MAIN, $slotsChanged ) ) {
+ $jobs = [];
+ if ( $slotsChanged === null || in_array( SlotRecord::MAIN, $slotsChanged ) ) {
// Invalidate caches of articles which include this page.
// Only for the main slot, because only the main slot is transcluded.
// TODO: MCR: not true for TemplateStyles! [SlotHandler]
- DeferredUpdates::addUpdate(
- new HTMLCacheUpdate( $title, 'templatelinks', 'page-edit' )
+ $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+ $title,
+ 'templatelinks',
+ [ 'causeAction' => 'page-edit' ]
);
}
-
// Invalidate the caches of all pages which redirect here
- DeferredUpdates::addUpdate(
- new HTMLCacheUpdate( $title, 'redirect', 'page-edit' )
+ $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+ $title,
+ 'redirect',
+ [ 'causeAction' => 'page-edit' ]
);
+ JobQueueGroup::singleton()->lazyPush( $jobs );
MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
* @param Parser $parser
* @param Title $title
* @param string $vary ParserOuput vary-* flag
- * @return Revision
+ * @return Revision|null
* @since 1.23
*/
private static function getCachedRevisionObject( $parser, $title, $vary ) {
// Reattach all direct children of the `<svg>` root node to the `<g>` wrapper
while ( $root->firstChild ) {
$node = $root->firstChild;
+ // @phan-suppress-next-line PhanUndeclaredProperty False positive
if ( !$titleNode && $node->nodeType === XML_ELEMENT_NODE && $node->tagName === 'title' ) {
// Remember the first encountered `<title>` node
$titleNode = $node;
*/
use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Assert\Assert;
use Wikimedia\Rdbms\Database;
use Wikimedia\Rdbms\IDatabase;
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Item class for a filearchive table row
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Item class for an oldimage table row
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Abstract base class for a list of deletable items. The list class
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Item class for a logging table row
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IDatabase;
/**
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Item class for a live revision table row
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\FakeResultWrapper;
use Wikimedia\Rdbms\IDatabase;
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IDatabase;
/**
* @ingroup RevisionDelete
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* General controller for RevDel, used by both SpecialRevisiondelete and
* @file
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Item class for a live revision table row
*
* @param string|bool $pageName Page name or false (default: false)
*
- * @return string
+ * @return string|bool|null
*/
public function getPageUrl( $pageName = false ) {
$url = $this->getLinkPath();
*
* @param bool|string $pageName
*
- * @return string|bool
+ * @return string|bool|null
*/
public function getPageUrl( $pageName = false ) {
$url = $this->getLinkPath();
}
/**
- * Get (cheap to compute) information about change tags.
+ * Get information about change tags, without parsing messages, for getRcFiltersConfigSummary().
+ *
+ * Message contents are the raw values (->plain()), because parsing messages is expensive.
+ * Even though we're not parsing messages, building a data structure with the contents of
+ * hundreds of i18n messages is still not cheap (see T223260#5370610), so the result of this
+ * function is cached in WANCache for 24 hours.
*
* Returns an array of associative arrays with information about each tag:
* - name: Tag name (string)
* - labelMsg: Short description message (Message object)
+ * - label: Short description message (raw message contents)
* - descriptionMsg: Long description message (Message object)
+ * - description: Long description message (raw message contents)
* - cssClass: CSS class to use for RC entries with this tag
* - hits: Number of RC entries that have this tag
*
* @param ResourceLoaderContext $context
* @return array[] Information about each tag
*/
- protected static function getChangeTagInfo( ResourceLoaderContext $context ) {
- $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
- $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
-
- $tagStats = ChangeTags::tagUsageStatistics();
- $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
-
- $result = [];
- foreach ( $tagHitCounts as $tagName => $hits ) {
- if (
- (
- // Only get active tags
- isset( $explicitlyDefinedTags[ $tagName ] ) ||
- isset( $softwareActivatedTags[ $tagName ] )
- ) &&
- // Only get tags with more than 0 hits
- $hits > 0
- ) {
- $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
- if ( $labelMsg === false ) {
- // Tag is hidden, skip it
- continue;
- }
- $result[] = [
- 'name' => $tagName,
- // 'label' and 'description' filled in by getChangeTagList()
- 'labelMsg' => $labelMsg,
- 'descriptionMsg' => ChangeTags::tagLongDescriptionMessage( $tagName, $context ),
- 'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
- 'hits' => $hits,
- ];
- }
- }
- return $result;
- }
-
- /**
- * Get information about change tags for use in getRcFiltersConfigSummary().
- *
- * This expands labelMsg and descriptionMsg to the raw values of each message, which captures
- * changes in the messages but avoids the expensive step of parsing them.
- *
- * @param ResourceLoaderContext $context
- * @return array[] Result of getChangeTagInfo(), with messages expanded to raw contents
- */
protected static function getChangeTagListSummary( ResourceLoaderContext $context ) {
- $tags = self::getChangeTagInfo( $context );
- foreach ( $tags as &$tagInfo ) {
- $tagInfo['labelMsg'] = $tagInfo['labelMsg']->plain();
- if ( $tagInfo['descriptionMsg'] ) {
- $tagInfo['descriptionMsg'] = $tagInfo['descriptionMsg']->plain();
+ $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+ return $cache->getWithSetCallback(
+ $cache->makeKey( 'ChangesListSpecialPage-changeTagListSummary', $context->getLanguage() ),
+ WANObjectCache::TTL_DAY,
+ function ( $oldValue, &$ttl, array &$setOpts ) use ( $context ) {
+ $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
+ $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
+
+ $tagStats = ChangeTags::tagUsageStatistics();
+ $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
+
+ $result = [];
+ foreach ( $tagHitCounts as $tagName => $hits ) {
+ if (
+ (
+ // Only get active tags
+ isset( $explicitlyDefinedTags[ $tagName ] ) ||
+ isset( $softwareActivatedTags[ $tagName ] )
+ ) &&
+ // Only get tags with more than 0 hits
+ $hits > 0
+ ) {
+ $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
+ if ( $labelMsg === false ) {
+ // Tag is hidden, skip it
+ continue;
+ }
+ $descriptionMsg = ChangeTags::tagLongDescriptionMessage( $tagName, $context );
+ $result[] = [
+ 'name' => $tagName,
+ 'labelMsg' => $labelMsg,
+ 'label' => $labelMsg->plain(),
+ 'descriptionMsg' => $descriptionMsg,
+ 'description' => $descriptionMsg ? $descriptionMsg->plain() : '',
+ 'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
+ 'hits' => $hits,
+ ];
+ }
+ }
+ return $result;
}
- }
- return $tags;
+ );
}
/**
* Get information about change tags to export to JS via getRcFiltersConfigVars().
*
- * This removes labelMsg and descriptionMsg, and adds label and description, which are parsed,
- * stripped and (in the case of description) truncated versions of these messages. Message
+ * This manipulates the label and description of each tag, which are parsed, stripped
+ * and (in the case of description) truncated versions of these messages. Message
* parsing is expensive, so to detect whether the tag list has changed, use
* getChangeTagListSummary() instead.
*
+ * The result of this function is cached in WANCache for 24 hours.
+ *
* @param ResourceLoaderContext $context
- * @return array[] Result of getChangeTagInfo(), with messages parsed, stripped and truncated
+ * @return array[] Same as getChangeTagListSummary(), with messages parsed, stripped and truncated
*/
protected static function getChangeTagList( ResourceLoaderContext $context ) {
- $tags = self::getChangeTagInfo( $context );
+ $tags = self::getChangeTagListSummary( $context );
$language = Language::factory( $context->getLanguage() );
foreach ( $tags as &$tagInfo ) {
$tagInfo['label'] = Sanitizer::stripAllTags( $tagInfo['labelMsg']->parse() );
use MediaWiki\Block\DatabaseBlock;
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
/**
* A special page that lists existing blocks
* @ingroup SpecialPage
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Special page allowing users with the appropriate permissions to
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Permissions\PermissionManager;
/**
$form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
$form->setAction( $this->getPageTitle( 'delete' )->getLocalURL() );
+ // @phan-suppress-next-line PhanUndeclaredProperty
$form->tagAction = 'delete'; // custom property on HTMLForm object
$form->setSubmitCallback( [ $this, 'processTagForm' ] );
$form->setSubmitTextMsg( 'tags-delete-submit' );
$form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
$form->setAction( $this->getPageTitle( $actionStr )->getLocalURL() );
+ // @phan-suppress-next-line PhanUndeclaredProperty
$form->tagAction = $actionStr;
$form->setSubmitCallback( [ $this, 'processTagForm' ] );
// tags-activate-submit, tags-deactivate-submit
$form->show();
}
+ /**
+ * @param array $data
+ * @param HTMLForm $form
+ * @return bool
+ * @suppress PhanUndeclaredProperty $form->tagAction
+ */
public function processTagForm( array $data, HTMLForm $form ) {
$context = $form->getContext();
$out = $context->getOutput();
function filterDataForSubmit( $data ) {
foreach ( $this->mFlatFields as $fieldname => $field ) {
if ( $field instanceof HTMLNestedFilterable ) {
+ // @phan-suppress-next-next-line PhanUndeclaredProperty All HTMLForm fields have mParams,
+ // but the instanceof confuses phan, which doesn't support intersections
$info = $field->mParams;
$prefix = $info['prefix'] ?? $fieldname;
foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
*/
use MediaWiki\MediaWikiServices;
use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IResultWrapper;
use Wikimedia\Rdbms\FakeResultWrapper;
use Wikimedia\Rdbms\IDatabase;
*/
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\IResultWrapper;
use Wikimedia\Rdbms\FakeResultWrapper;
* @param LinkTarget $title
*
* @return string
+ * @suppress PhanUndeclaredProperty
*/
public function getPrefixedText( LinkTarget $title ) {
if ( !isset( $title->prefixedText ) ) {
* @return string|string[] An error or list of errors in the
* provided $datum. When no errors exist the empty array is
* returned.
- * @suppress PhanUndeclaredMethod
+ * @suppress PhanUndeclaredMethod,PhanUndeclaredProperty
*/
public static function getErrors( AvroSchema $schema, $datum ) {
switch ( $schema->type ) {
<?php
use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use MediaWiki\User\UserIdentity;
use Wikimedia\Assert\Assert;
use Wikimedia\Rdbms\IDatabase;
use MediaWiki\MediaWikiServices;
use MediaWiki\Logger\LoggerFactory;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
/**
* Base class for language conversion.
'az' => 'azərbaycanca', # Azerbaijani
'azb' => 'تۆرکجه', # South Azerbaijani
'ba' => 'башҡортса', # Bashkir
- 'ban' => 'Basa Bali', # Balinese
+ 'ban' => 'Bali', # Balinese
'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 639-3 since 2010-06-30 )
'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
"codeCoverageIgnore=" \
"codingStandardsIgnoreEnd=" \
"codingStandardsIgnoreStart=" \
- "covers=" \
- "dataProvider=" \
- "expectedException=" \
- "expectedExceptionMessage=" \
- "group=" \
"phan=" \
"suppress="
TCL_SUBST =
SORT_BY_SCOPE_NAME = NO
STRICT_PROTO_MATCHING = NO
GENERATE_TODOLIST = YES
-GENERATE_TESTLIST = YES
-GENERATE_BUGLIST = YES
+GENERATE_TESTLIST = NO
+GENERATE_BUGLIST = NO
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
require __DIR__ . '/../commandLine.inc';
+use Wikimedia\Rdbms\Database;
+
/**
* Maintenance script that upgrade for log_id/log_deleted fields in a
* replication-safe way.
* @ingroup Maintenance
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
require_once __DIR__ . '/Maintenance.php';
*
* @file
* @ingroup Maintenance
+ * @phan-file-suppress PhanUndeclaredProperty Lots of custom properties
*/
require_once __DIR__ . '/Maintenance.php';
* @ingroup Maintenance
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
require_once __DIR__ . '/Maintenance.php';
* @ingroup Maintenance
*/
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IDatabase;
require_once __DIR__ . '/Maintenance.php';
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
require_once __DIR__ . '/dumpIterator.php';
*/
use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use Wikimedia\Rdbms\IDatabase;
require_once __DIR__ . '/Maintenance.php';
*/
class UserDupes {
/**
- * @var Database
+ * @var IMaintainableDatabase
*/
private $db;
private $reassigned;
'targets' => [ 'mobile', 'desktop' ],
],
'jquery.checkboxShiftClick' => [
- 'scripts' => 'resources/src/jquery/jquery.checkboxShiftClick.js',
+ 'deprecated' => 'Please use "mediawiki.page.ready" instead.',
+ 'dependencies' => [
+ 'mediawiki.page.ready',
+ ],
'targets' => [ 'desktop', 'mobile' ],
],
'jquery.chosen' => [
]
],
'mediawiki.page.ready' => [
- 'scripts' => 'resources/src/mediawiki.page.ready.js',
+ 'scripts' => [
+ 'resources/src/mediawiki.page.ready/checkboxShift.js',
+ 'resources/src/mediawiki.page.ready/ready.js',
+ ],
'dependencies' => [
- 'jquery.checkboxShiftClick',
'mediawiki.util',
'mediawiki.notify',
'mediawiki.api'
+++ /dev/null
-/**
- * @class jQuery.plugin.checkboxShiftClick
- */
-( function () {
-
- /**
- * Enable checkboxes to be checked or unchecked in a row by clicking one,
- * holding shift and clicking another one.
- *
- * @return {jQuery}
- * @chainable
- */
- $.fn.checkboxShiftClick = function () {
- var prevCheckbox = null,
- $box = this;
- // When our boxes are clicked..
- $box.on( 'click', function ( e ) {
- // And one has been clicked before...
- if ( prevCheckbox !== null && e.shiftKey ) {
- // Check or uncheck this one and all in-between checkboxes,
- // except for disabled ones
- $box
- .slice(
- Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
- Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
- )
- .filter( function () {
- return !this.disabled;
- } )
- .prop( 'checked', !!e.target.checked );
- }
- // Either way, update the prevCheckbox variable to the one clicked now
- prevCheckbox = e.target;
- } );
- return $box;
- };
-
- /**
- * @class jQuery
- * @mixins jQuery.plugin.checkboxShiftClick
- */
-
-}() );
+++ /dev/null
-( function () {
- mw.hook( 'wikipage.content' ).add( function ( $content ) {
- var $sortable, $collapsible;
-
- $collapsible = $content.find( '.mw-collapsible' );
- if ( $collapsible.length ) {
- // Preloaded by Skin::getDefaultModules()
- mw.loader.using( 'jquery.makeCollapsible', function () {
- $collapsible.makeCollapsible();
- } );
- }
-
- $sortable = $content.find( 'table.sortable' );
- if ( $sortable.length ) {
- // Preloaded by Skin::getDefaultModules()
- mw.loader.using( 'jquery.tablesorter', function () {
- $sortable.tablesorter();
- } );
- }
-
- // Run jquery.checkboxShiftClick
- $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
- } );
-
- // Things outside the wikipage content
- $( function () {
- var $nodes;
-
- // Add accesskey hints to the tooltips
- $( '[accesskey]' ).updateTooltipAccessKeys();
-
- $nodes = $( '.catlinks[data-mw="interface"]' );
- if ( $nodes.length ) {
- /**
- * Fired when categories are being added to the DOM
- *
- * It is encouraged to fire it before the main DOM is changed (when $content
- * is still detached). However, this order is not defined either way, so you
- * should only rely on $content itself.
- *
- * This includes the ready event on a page load (including post-edit loads)
- * and when content has been previewed with LivePreview.
- *
- * @event wikipage_categories
- * @member mw.hook
- * @param {jQuery} $content The most appropriate element containing the content,
- * such as .catlinks
- */
- mw.hook( 'wikipage.categories' ).fire( $nodes );
- }
-
- $( '#t-print a' ).on( 'click', function ( e ) {
- window.print();
- e.preventDefault();
- } );
-
- // Turn logout to a POST action
- $( '#pt-logout a' ).on( 'click', function ( e ) {
- var api = new mw.Api(),
- returnUrl = $( '#pt-logout a' ).attr( 'href' );
- mw.notify(
- mw.message( 'logging-out-notify' ),
- { tag: 'logout', autoHide: false }
- );
- api.postWithToken( 'csrf', {
- action: 'logout'
- } ).then(
- function () {
- location.href = returnUrl;
- },
- function ( e ) {
- mw.notify(
- mw.message( 'logout-failed', e ),
- { type: 'error', tag: 'logout', autoHide: false }
- );
- }
- );
- e.preventDefault();
- } );
- } );
-
-}() );
--- /dev/null
+/**
+ * @class jQuery.plugin.checkboxShiftClick
+ */
+( function () {
+
+ /**
+ * Enable checkboxes to be checked or unchecked in a row by clicking one,
+ * holding shift and clicking another one.
+ *
+ * @return {jQuery}
+ * @chainable
+ */
+ $.fn.checkboxShiftClick = function () {
+ var prevCheckbox = null,
+ $box = this;
+ // When our boxes are clicked..
+ $box.on( 'click', function ( e ) {
+ // And one has been clicked before...
+ if ( prevCheckbox !== null && e.shiftKey ) {
+ // Check or uncheck this one and all in-between checkboxes,
+ // except for disabled ones
+ $box
+ .slice(
+ Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
+ Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
+ )
+ .filter( function () {
+ return !this.disabled;
+ } )
+ .prop( 'checked', !!e.target.checked );
+ }
+ // Either way, update the prevCheckbox variable to the one clicked now
+ prevCheckbox = e.target;
+ } );
+ return $box;
+ };
+
+ /**
+ * @class jQuery
+ * @mixins jQuery.plugin.checkboxShiftClick
+ */
+
+}() );
--- /dev/null
+( function () {
+ mw.hook( 'wikipage.content' ).add( function ( $content ) {
+ var $sortable, $collapsible;
+
+ $collapsible = $content.find( '.mw-collapsible' );
+ if ( $collapsible.length ) {
+ // Preloaded by Skin::getDefaultModules()
+ mw.loader.using( 'jquery.makeCollapsible', function () {
+ $collapsible.makeCollapsible();
+ } );
+ }
+
+ $sortable = $content.find( 'table.sortable' );
+ if ( $sortable.length ) {
+ // Preloaded by Skin::getDefaultModules()
+ mw.loader.using( 'jquery.tablesorter', function () {
+ $sortable.tablesorter();
+ } );
+ }
+
+ // Run jquery.checkboxShiftClick
+ $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
+ } );
+
+ // Things outside the wikipage content
+ $( function () {
+ var $nodes;
+
+ // Add accesskey hints to the tooltips
+ $( '[accesskey]' ).updateTooltipAccessKeys();
+
+ $nodes = $( '.catlinks[data-mw="interface"]' );
+ if ( $nodes.length ) {
+ /**
+ * Fired when categories are being added to the DOM
+ *
+ * It is encouraged to fire it before the main DOM is changed (when $content
+ * is still detached). However, this order is not defined either way, so you
+ * should only rely on $content itself.
+ *
+ * This includes the ready event on a page load (including post-edit loads)
+ * and when content has been previewed with LivePreview.
+ *
+ * @event wikipage_categories
+ * @member mw.hook
+ * @param {jQuery} $content The most appropriate element containing the content,
+ * such as .catlinks
+ */
+ mw.hook( 'wikipage.categories' ).fire( $nodes );
+ }
+
+ $( '#t-print a' ).on( 'click', function ( e ) {
+ window.print();
+ e.preventDefault();
+ } );
+
+ // Turn logout to a POST action
+ $( '#pt-logout a' ).on( 'click', function ( e ) {
+ var api = new mw.Api(),
+ returnUrl = $( '#pt-logout a' ).attr( 'href' );
+ mw.notify(
+ mw.message( 'logging-out-notify' ),
+ { tag: 'logout', autoHide: false }
+ );
+ api.postWithToken( 'csrf', {
+ action: 'logout'
+ } ).then(
+ function () {
+ location.href = returnUrl;
+ },
+ function ( e ) {
+ mw.notify(
+ mw.message( 'logout-failed', e ),
+ { type: 'error', tag: 'logout', autoHide: false }
+ );
+ }
+ );
+ e.preventDefault();
+ } );
+ } );
+
+}() );
use ActorMigration;
use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
use MediaWiki\Revision\RevisionStore;
use MediaWiki\Revision\RevisionStoreFactory;
use MediaWiki\Revision\SlotRoleRegistry;
$this->getMockCommentStore(),
ActorMigration::newMigration(),
MIGRATION_OLD,
- $this->getMockLoggerSpi(),
+ new NullLogger(),
true
);
$this->assertTrue( true );
$cache = $this->getHashWANObjectCache();
$commentStore = $this->getMockCommentStore();
$actorMigration = ActorMigration::newMigration();
- $loggerProvider = $this->getMockLoggerSpi();
+ $logger = new NullLogger();
$factory = new RevisionStoreFactory(
$lbFactory,
$commentStore,
$actorMigration,
$mcrMigrationStage,
- $loggerProvider,
+ $logger,
$contentHandlerUseDb
);
return new WANObjectCache( [ 'cache' => new \HashBagOStuff() ] );
}
- /**
- * @return \PHPUnit_Framework_MockObject_MockObject|LoggerSpi
- */
- private function getMockLoggerSpi() {
- $mock = $this->getMock( LoggerSpi::class );
-
- $mock->method( 'getLogger' )
- ->willReturn( new NullLogger() );
-
- return $mock;
- }
-
}
);
$cacheKey = $cache->makeGlobalKey(
- 'BlobStore',
- 'address',
+ 'SqlBlobStore-blob',
$lb->getLocalDomainID(),
'tt:7777'
);
use MediaWiki\Block\SystemBlock;
use MediaWiki\MediaWikiServices;
use Wikimedia\TestingAccessWrapper;
+use Psr\Log\LoggerInterface;
/**
* @group Blocking
private function getBlockManagerConstructorArgs( $overrideConfig ) {
$blockManagerConfig = array_merge( $this->blockManagerConfig, $overrideConfig );
$this->setMwGlobals( $blockManagerConfig );
+ $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
return [
new LoggedServiceOptions(
self::$serviceOptionsAccessLog,
BlockManager::$constructorOptions,
MediaWikiServices::getInstance()->getMainConfig()
),
- MediaWikiServices::getInstance()->getPermissionManager()
+ MediaWikiServices::getInstance()->getPermissionManager(),
+ $logger
];
}
"$base/subdir2/subdir/sub/120-px-file.txt",
];
- for ( $i = 0; $i < 25; $i++ ) {
+ for ( $i = 0; $i < 2; $i++ ) {
$status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
$this->assertEquals( print_r( [], true ), print_r( $status->getErrors(), true ),
"Locking of files succeeded ($backendName) ($i)." );
use ContentHandler;
use FetchText;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
use MediaWikiTestCase;
use MWException;
use Title;
* /w/images/thumb/a/ab/Foo.png/120px-Foo.png. The $thumbRel parameter
* of this function would be set to "a/ab/Foo.png/120px-Foo.png".
* This method is responsible for turning that into an array
- * with the folowing keys:
+ * with the following keys:
* * f => the filename (Foo.png)
* * rel404 => the whole thing (a/ab/Foo.png/120px-Foo.png)
* * archived => 1 (If the request is for an archived thumb)