Replace internal Hooks::runner

The Hooks class contains deprecated functions and the whole class is
going to get removed, so remove the convenience function and inline the
code.

Bug: T335536
Change-Id: I8ef3468a64a0199996f26ef293543fcacdf2797f
This commit is contained in:
Umherirrender 2023-05-06 22:01:10 +02:00 committed by DannyS712
parent 9878c4c67a
commit e04d3a28f6
64 changed files with 321 additions and 192 deletions

View file

@ -34,7 +34,9 @@
* @ingroup API
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Logger\LegacyLogger;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
// So extensions (and other code) can check whether they're running in API mode
@ -76,7 +78,7 @@ function wfApiMain() {
$processor = new ApiMain( RequestContext::getMain(), true );
// Last chance hook before executing the API
Hooks::runner()->onApiBeforeMain( $processor );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onApiBeforeMain( $processor );
if ( !$processor instanceof ApiMain ) {
throw new LogicException( 'ApiBeforeMain hook set $processor to a non-ApiMain class' );
}

View file

@ -39,6 +39,7 @@
* @ingroup entrypoint
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\TemplateParser;
use MediaWiki\Title\Title;
@ -149,6 +150,7 @@ function wfImageAuthMain() {
$title = Title::makeTitleSafe( NS_FILE, $name );
$hookRunner = new HookRunner( $services->getHookContainer() );
if ( !$publicWiki ) {
// For private wikis, run extra auth checks and set cache control headers
$headers['Cache-Control'] = 'private';
@ -162,7 +164,7 @@ function wfImageAuthMain() {
// Run hook for extension authorization plugins
/** @var array $result */
$result = null;
if ( !Hooks::runner()->onImgAuthBeforeStream( $title, $path, $name, $result ) ) {
if ( !$hookRunner->onImgAuthBeforeStream( $title, $path, $name, $result ) ) {
wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
return;
}
@ -188,7 +190,7 @@ function wfImageAuthMain() {
}
// Allow modification of headers before streaming a file
Hooks::runner()->onImgAuthModifyHeaders( $title->getTitleValue(), $headers );
$hookRunner->onImgAuthModifyHeaders( $title->getTitleValue(), $headers );
// Stream the requested file
[ $headers, $options ] = HTTPFileStreamer::preprocessHeaders( $headers );

View file

@ -95,9 +95,10 @@ class GitInfo {
*/
public function __construct( $repoDir, $usePrecomputed = true ) {
$this->repoDir = $repoDir;
$services = MediaWikiServices::getInstance();
$this->options = new ServiceOptions(
self::CONSTRUCTOR_OPTIONS,
MediaWikiServices::getInstance()->getMainConfig()
$services->getMainConfig()
);
$this->options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS );
// $this->options must be set before using getCacheFilePath()
@ -106,7 +107,7 @@ class GitInfo {
$this->logger->debug(
"Candidate cacheFile={$this->cacheFile} for {$repoDir}"
);
$this->hookRunner = Hooks::runner();
$this->hookRunner = new HookRunner( $services->getHookContainer() );
if ( $usePrecomputed &&
$this->cacheFile !== null &&
is_readable( $this->cacheFile )

View file

@ -20,6 +20,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use MediaWiki\ProcOpenError;
@ -1682,7 +1683,8 @@ function wfShellWikiCmd( $script, array $parameters = [], array $options = [] )
global $wgPhpCli;
// Give site config file a chance to run the script in a wrapper.
// The caller may likely want to call wfBasename() on $script.
Hooks::runner()->onWfShellWikiCmd( $script, $parameters, $options );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onWfShellWikiCmd( $script, $parameters, $options );
$cmd = [ $options['php'] ?? $wgPhpCli ];
if ( isset( $options['wrapper'] ) ) {
$cmd[] = $options['wrapper'];

View file

@ -22,6 +22,7 @@
* @author Tyler Romeo, 2012
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Language\RawMessage;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -100,7 +101,7 @@ class MWTimestamp extends ConvertibleTimestamp {
$diff = $this->diff( $relativeTo );
$user = User::newFromIdentity( $user ); // For compatibility with the hook signature
if ( Hooks::runner()->onGetRelativeTimestamp(
if ( ( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onGetRelativeTimestamp(
$ts, $diff, $this, $relativeTo, $user, $lang )
) {
$seconds = ( ( ( $diff->days * 24 + $diff->h ) * 60 + $diff->i ) * 60 + $diff->s );

View file

@ -22,8 +22,8 @@
namespace MediaWiki\Request;
use Hooks;
use HttpStatus;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use RuntimeException;
@ -145,7 +145,8 @@ class WebResponse {
* @since 1.22 Replaced $prefix, $domain, and $forceSecure with $options
*/
public function setCookie( $name, $value, $expire = 0, $options = [] ) {
$mainConfig = MediaWikiServices::getInstance()->getMainConfig();
$services = MediaWikiServices::getInstance();
$mainConfig = $services->getMainConfig();
$cookiePath = $mainConfig->get( MainConfigNames::CookiePath );
$cookiePrefix = $mainConfig->get( MainConfigNames::CookiePrefix );
$cookieDomain = $mainConfig->get( MainConfigNames::CookieDomain );
@ -200,7 +201,8 @@ class WebResponse {
return;
}
if ( !Hooks::runner()->onWebResponseSetCookie( $name, $value, $expire, $options ) ) {
$hookRunner = new HookRunner( $services->getHookContainer() );
if ( !$hookRunner->onWebResponseSetCookie( $name, $value, $expire, $options ) ) {
return;
}

View file

@ -28,7 +28,6 @@ use DeferredUpdates;
use Exception;
use ExtensionRegistry;
use HashBagOStuff;
use Hooks;
use HttpStatus;
use InvalidArgumentException;
use Less_Environment;
@ -2027,13 +2026,14 @@ MESSAGE;
public static function getSiteConfigSettings(
Context $context, Config $conf
): array {
$services = MediaWikiServices::getInstance();
// Namespace related preparation
// - wgNamespaceIds: Key-value pairs of all localized, canonical and aliases for namespaces.
// - wgCaseSensitiveNamespaces: Array of namespaces that are case-sensitive.
$contLang = MediaWikiServices::getInstance()->getContentLanguage();
$contLang = $services->getContentLanguage();
$namespaceIds = $contLang->getNamespaceIds();
$caseSensitiveNamespaces = [];
$nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
$nsInfo = $services->getNamespaceInfo();
foreach ( $nsInfo->getCanonicalNamespaces() as $index => $name ) {
$namespaceIds[$contLang->lc( $name )] = $index;
if ( !$nsInfo->isCapitalized( $index ) ) {
@ -2089,7 +2089,8 @@ MESSAGE;
'wgIllegalFileChars' => Title::convertByteClassToUnicodeClass( $illegalFileChars ),
];
Hooks::runner()->onResourceLoaderGetConfigVars( $vars, $skin, $conf );
( new \MediaWiki\HookContainer\HookRunner( $services->getHookContainer() ) )
->onResourceLoaderGetConfigVars( $vars, $skin, $conf );
return $vars;
}

View file

@ -52,6 +52,7 @@
// phpcs:disable MediaWiki.Usage.DeprecatedGlobalVariables
use MediaWiki\HookContainer\FauxGlobalHookArray;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MainConfigNames;
use MediaWiki\MainConfigSchema;
@ -437,7 +438,7 @@ if ( $wgRequest->getCookie( 'UseDC', '' ) === 'master' ) {
} )();
// Most of the config is out, some might want to run hooks here.
Hooks::runner()->onSetupAfterCache();
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onSetupAfterCache();
// Now that variant lists may be available, parse any action paths and article paths
// as query parameters.

View file

@ -22,12 +22,12 @@
namespace MediaWiki\Block;
use Hooks;
use InvalidArgumentException;
use MediaWiki\Block\Restriction\ActionRestriction;
use MediaWiki\Block\Restriction\NamespaceRestriction;
use MediaWiki\Block\Restriction\PageRestriction;
use MediaWiki\Block\Restriction\Restriction;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -577,8 +577,9 @@ class DatabaseBlock extends AbstractBlock {
return false;
}
$services = MediaWikiServices::getInstance();
# Allow hooks to cancel the autoblock.
if ( !Hooks::runner()->onAbortAutoblock( $autoblockIP, $this ) ) {
if ( !( new HookRunner( $services->getHookContainer() ) )->onAbortAutoblock( $autoblockIP, $this ) ) {
wfDebug( "Autoblock aborted by hook." );
return false;
}
@ -637,8 +638,7 @@ class DatabaseBlock extends AbstractBlock {
}
# Insert the block...
$status = MediaWikiServices::getInstance()
->getDatabaseBlockStoreFactory()
$status = $services->getDatabaseBlockStoreFactory()
->getDatabaseBlockStore( $this->getWikiId() )
->insertBlock( $autoblock );
return $status

View file

@ -22,6 +22,7 @@
*/
use MediaWiki\Cache\CacheKeyHelper;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Page\PageIdentity;
@ -93,7 +94,8 @@ class HTMLFileCache extends FileCacheBase {
* @return bool
*/
public static function useFileCache( IContextSource $context, $mode = self::MODE_NORMAL ) {
$config = MediaWikiServices::getInstance()->getMainConfig();
$services = MediaWikiServices::getInstance();
$config = $services->getMainConfig();
if ( !$config->get( MainConfigNames::UseFileCache ) && $mode !== self::MODE_REBUILD ) {
return false;
@ -125,18 +127,17 @@ class HTMLFileCache extends FileCacheBase {
// Check that there are no other sources of variation
if ( $user->isRegistered() ||
!$ulang->equals( MediaWikiServices::getInstance()->getContentLanguage() ) ) {
!$ulang->equals( $services->getContentLanguage() ) ) {
return false;
}
$userHasNewMessages = MediaWikiServices::getInstance()
->getTalkPageNotificationManager()->userHasNewMessages( $user );
$userHasNewMessages = $services->getTalkPageNotificationManager()->userHasNewMessages( $user );
if ( ( $mode === self::MODE_NORMAL ) && $userHasNewMessages ) {
return false;
}
// Allow extensions to disable caching
return Hooks::runner()->onHTMLFileCache__useFileCache( $context );
return ( new HookRunner( $services->getHookContainer() ) )->onHTMLFileCache__useFileCache( $context );
}
/**

View file

@ -23,6 +23,7 @@
*/
use MediaWiki\CommentFormatter\RowCommentFormatter;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
use MediaWiki\Html\Html;
use MediaWiki\Linker\Linker;
@ -102,9 +103,10 @@ class ChangesList extends ContextSource {
public static function newFromContext( IContextSource $context, array $groups = [] ) {
$user = $context->getUser();
$sk = $context->getSkin();
$services = MediaWikiServices::getInstance();
$list = null;
if ( Hooks::runner()->onFetchChangesList( $user, $sk, $list, $groups ) ) {
$userOptionsLookup = MediaWikiServices::getInstance()->getUserOptionsLookup();
if ( ( new HookRunner( $services->getHookContainer() ) )->onFetchChangesList( $user, $sk, $list, $groups ) ) {
$userOptionsLookup = $services->getUserOptionsLookup();
$new = $context->getRequest()->getBool(
'enhanced',
$userOptionsLookup->getBoolOption( $user, 'usenewrc' )

View file

@ -21,6 +21,7 @@
*/
use MediaWiki\ChangeTags\Taggable;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Page\PageIdentity;
@ -467,7 +468,8 @@ class RecentChange implements Taggable {
$this->mAttribs['rc_id'] = $dbw->insertId();
# Notify extensions
Hooks::runner()->onRecentChange_save( $this );
$hookRunner = new HookRunner( $services->getHookContainer() );
$hookRunner->onRecentChange_save( $this );
// Apply revert tags (if needed)
if ( $this->editResult !== null && count( $this->editResult->getRevertTags() ) ) {
@ -509,7 +511,7 @@ class RecentChange implements Taggable {
// Never send an RC notification email about categorization changes
if (
$title &&
Hooks::runner()->onAbortEmailNotification( $editor, $title, $this ) &&
$hookRunner->onAbortEmailNotification( $editor, $title, $this ) &&
$this->mAttribs['rc_type'] != RC_CATEGORIZE
) {
// @FIXME: This would be better as an extension hook
@ -623,7 +625,8 @@ class RecentChange implements Taggable {
wfWarn( __METHOD__ . ' with $auto = true' );
return [];
}
$mainConfig = MediaWikiServices::getInstance()->getMainConfig();
$services = MediaWikiServices::getInstance();
$mainConfig = $services->getMainConfig();
$useRCPatrol = $mainConfig->get( MainConfigNames::UseRCPatrol );
$useNPPatrol = $mainConfig->get( MainConfigNames::UseNPPatrol );
$useFilePatrol = $mainConfig->get( MainConfigNames::UseFilePatrol );
@ -643,8 +646,9 @@ class RecentChange implements Taggable {
$status->fatal( 'rcpatroldisabled' );
}
$performer->authorizeWrite( 'patrol', $this->getTitle(), $status );
$user = MediaWikiServices::getInstance()->getUserFactory()->newFromAuthority( $performer );
if ( !Hooks::runner()->onMarkPatrolled(
$user = $services->getUserFactory()->newFromAuthority( $performer );
$hookRunner = new HookRunner( $services->getHookContainer() );
if ( !$hookRunner->onMarkPatrolled(
$this->getAttribute( 'rc_id' ), $user, false, false, $tags )
) {
$status->fatal( 'hookaborted' );
@ -667,7 +671,7 @@ class RecentChange implements Taggable {
// Log this patrol event
PatrolLog::record( $this, false, $performer->getUser(), $tags );
Hooks::runner()->onMarkPatrolledComplete(
$hookRunner->onMarkPatrolledComplete(
$this->getAttribute( 'rc_id' ), $user, false, false );
return [];

View file

@ -536,9 +536,10 @@ class ChangeTags {
}
}
$userObj = $user ? MediaWikiServices::getInstance()->getUserFactory()->newFromUserIdentity( $user ) : null;
Hooks::runner()->onChangeTagsAfterUpdateTags( $tagsToAdd, $tagsToRemove, $prevTags,
$rc_id, $rev_id, $log_id, $params, $rc, $userObj );
$services = MediaWikiServices::getInstance();
$userObj = $user ? $services->getUserFactory()->newFromUserIdentity( $user ) : null;
( new HookRunner( $services->getHookContainer() ) )->onChangeTagsAfterUpdateTags(
$tagsToAdd, $tagsToRemove, $prevTags, $rc_id, $rev_id, $log_id, $params, $rc, $userObj );
return [ $tagsToAdd, $tagsToRemove, $prevTags ];
}
@ -640,6 +641,7 @@ class ChangeTags {
$checkBlock = true
) {
$user = null;
$services = MediaWikiServices::getInstance();
if ( $performer !== null ) {
if ( !$performer->isAllowed( 'applychangetags' ) ) {
return Status::newFatal( 'tags-apply-no-permission' );
@ -653,12 +655,12 @@ class ChangeTags {
}
// ChangeTagsAllowedAdd hook still needs a full User object
$user = MediaWikiServices::getInstance()->getUserFactory()->newFromAuthority( $performer );
$user = $services->getUserFactory()->newFromAuthority( $performer );
}
// to be applied, a tag has to be explicitly defined
$allowedTags = self::listExplicitlyDefinedTags();
Hooks::runner()->onChangeTagsAllowedAdd( $allowedTags, $tags, $user );
( new HookRunner( $services->getHookContainer() ) )->onChangeTagsAllowedAdd( $allowedTags, $tags, $user );
$disallowedTags = array_diff( $tags, $allowedTags );
if ( $disallowedTags ) {
return self::restrictedTagError( 'tags-apply-not-allowed-one',
@ -1404,6 +1406,7 @@ class ChangeTags {
*/
public static function canCreateTag( $tag, Authority $performer = null ) {
$user = null;
$services = MediaWikiServices::getInstance();
if ( $performer !== null ) {
if ( !$performer->isAllowed( 'managechangetags' ) ) {
return Status::newFatal( 'tags-manage-no-permission' );
@ -1415,7 +1418,7 @@ class ChangeTags {
);
}
// ChangeTagCanCreate hook still needs a full User object
$user = MediaWikiServices::getInstance()->getUserFactory()->newFromAuthority( $performer );
$user = $services->getUserFactory()->newFromAuthority( $performer );
}
$status = self::isTagNameValid( $tag );
@ -1431,7 +1434,7 @@ class ChangeTags {
// check with hooks
$canCreateResult = Status::newGood();
Hooks::runner()->onChangeTagCanCreate( $tag, $user, $canCreateResult );
( new HookRunner( $services->getHookContainer() ) )->onChangeTagCanCreate( $tag, $user, $canCreateResult );
return $canCreateResult;
}
@ -1487,11 +1490,12 @@ class ChangeTags {
* @since 1.25
*/
public static function deleteTagEverywhere( $tag ) {
$dbw = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->getPrimaryDatabase();
$services = MediaWikiServices::getInstance();
$dbw = $services->getDBLoadBalancerFactory()->getPrimaryDatabase();
$dbw->startAtomic( __METHOD__ );
// fetch tag id, this must be done before calling undefineTag(), see T225564
$tagId = MediaWikiServices::getInstance()->getChangeTagDefStore()->getId( $tag );
$tagId = $services->getChangeTagDefStore()->getId( $tag );
// set ctd_user_defined = 0
self::undefineTag( $tag );
@ -1503,7 +1507,7 @@ class ChangeTags {
// give extensions a chance
$status = Status::newGood();
Hooks::runner()->onChangeTagAfterDelete( $tag, $status );
( new HookRunner( $services->getHookContainer() ) )->onChangeTagAfterDelete( $tag, $status );
// let's not allow error results, as the actual tag deletion succeeded
if ( !$status->isOK() ) {
wfDebug( 'ChangeTagAfterDelete error condition downgraded to warning' );
@ -1531,6 +1535,7 @@ class ChangeTags {
public static function canDeleteTag( $tag, Authority $performer = null, int $flags = 0 ) {
$tagUsage = self::tagUsageStatistics();
$user = null;
$services = MediaWikiServices::getInstance();
if ( $performer !== null ) {
if ( !$performer->isAllowed( 'deletechangetags' ) ) {
return Status::newFatal( 'tags-delete-no-permission' );
@ -1542,7 +1547,7 @@ class ChangeTags {
);
}
// ChangeTagCanDelete hook still needs a full User object
$user = MediaWikiServices::getInstance()->getUserFactory()->newFromAuthority( $performer );
$user = $services->getUserFactory()->newFromAuthority( $performer );
}
if ( !isset( $tagUsage[$tag] ) && !in_array( $tag, self::listDefinedTags() ) ) {
@ -1566,7 +1571,7 @@ class ChangeTags {
$status = Status::newGood();
}
Hooks::runner()->onChangeTagCanDelete( $tag, $user, $status );
( new HookRunner( $services->getHookContainer() ) )->onChangeTagCanDelete( $tag, $user, $status );
return $status;
}

View file

@ -31,6 +31,7 @@ use MediaWiki\Content\Renderer\ContentParseParams;
use MediaWiki\Content\Transform\PreloadTransformParamsValue;
use MediaWiki\Content\Transform\PreSaveTransformParamsValue;
use MediaWiki\Content\ValidationParams;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\Parser\MagicWord;
use MediaWiki\Title\Title;
@ -531,7 +532,8 @@ abstract class AbstractContent implements Content {
$lossy = ( $lossy === 'lossy' ); // string flag, convert to boolean for convenience
$result = false;
Hooks::runner()->onConvertContent( $this, $toModel, $lossy, $result );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onConvertContent( $this, $toModel, $lossy, $result );
return $result;
}
@ -580,7 +582,8 @@ abstract class AbstractContent implements Content {
$po = new ParserOutput();
$options->registerWatcher( [ $po, 'recordOption' ] );
if ( Hooks::runner()->onContentGetParserOutput(
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
if ( $hookRunner->onContentGetParserOutput(
$this, $title, $revId, $options, $generateHtml, $po )
) {
// Save and restore the old value, just in case something is reusing
@ -591,7 +594,7 @@ abstract class AbstractContent implements Content {
$options->setRedirectTarget( $oldRedir );
}
Hooks::runner()->onContentAlterParserOutput( $this, $title, $po );
$hookRunner->onContentAlterParserOutput( $this, $title, $po );
$options->registerWatcher( null );
return $po;

View file

@ -31,6 +31,7 @@ use MediaWiki\Content\Renderer\ContentParseParams;
use MediaWiki\Content\Transform\PreloadTransformParams;
use MediaWiki\Content\Transform\PreSaveTransformParams;
use MediaWiki\Content\ValidationParams;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MainConfigNames;
@ -1735,9 +1736,10 @@ abstract class ContentHandler {
$scopedCallback = $parserOptions->setupFakeRevision( $title, $content, $parserOptions->getUserIdentity() );
}
$hookRunner = new HookRunner( $services->getHookContainer() );
$po = new ParserOutput();
$parserOptions->registerWatcher( [ $po, 'recordOption' ] );
if ( Hooks::runner()->onContentGetParserOutput(
if ( $hookRunner->onContentGetParserOutput(
// FIXME $cpoParams->getRevId() may be null here?
// @phan-suppress-next-line PhanTypeMismatchArgumentNullable
$content, $title, $cpoParams->getRevId(), $parserOptions, $cpoParams->getGenerateHtml(), $po )
@ -1761,7 +1763,7 @@ abstract class ContentHandler {
$parserOptions->setRedirectTarget( $oldRedir );
}
Hooks::runner()->onContentAlterParserOutput( $content, $title, $po );
$hookRunner->onContentAlterParserOutput( $content, $title, $po );
$parserOptions->registerWatcher( null );
if ( isset( $scopedCallback ) ) {
ScopedCallback::consume( $scopedCallback );

View file

@ -25,6 +25,7 @@
* @author Daniel Kinzler
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Parser\MagicWord;
@ -106,7 +107,8 @@ class WikitextContent extends TextContent {
# Inserting a new section
$subject = strval( $sectionTitle ) !== '' ? wfMessage( 'newsectionheaderdefaultlevel' )
->plaintextParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
if ( Hooks::runner()->onPlaceNewSection( $this, $oldtext, $subject, $text ) ) {
$hookRunner = ( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) );
if ( $hookRunner->onPlaceNewSection( $this, $oldtext, $subject, $text ) ) {
$text = strlen( trim( $oldtext ) ) > 0
? "{$oldtext}\n\n{$subject}{$text}"
: "{$subject}{$text}";

View file

@ -22,6 +22,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -434,12 +435,12 @@ class RequestContext implements IContextSource, MutableContext {
try {
$request = $this->getRequest();
$user = $this->getUser();
$services = MediaWikiServices::getInstance();
// Optimisation: Avoid slow getVal(), this isn't user-generated content.
$code = $request->getRawVal( 'uselang', 'user' );
if ( $code === 'user' ) {
$userOptionsLookup = MediaWikiServices::getInstance()
->getUserOptionsLookup();
$userOptionsLookup = $services->getUserOptionsLookup();
$code = $userOptionsLookup->getOption( $user, 'language' );
}
@ -456,12 +457,12 @@ class RequestContext implements IContextSource, MutableContext {
// NFC form given this will not convert to normalised form.
$code = self::sanitizeLangCode( $code );
Hooks::runner()->onUserGetLanguageObject( $user, $code, $this );
( new HookRunner( $services->getHookContainer() ) )->onUserGetLanguageObject( $user, $code, $this );
if ( $code === $this->getConfig()->get( MainConfigNames::LanguageCode ) ) {
$this->lang = MediaWikiServices::getInstance()->getContentLanguage();
$this->lang = $services->getContentLanguage();
} else {
$obj = MediaWikiServices::getInstance()->getLanguageFactory()
$obj = $services->getLanguageFactory()
->getLanguage( $code );
$this->lang = $obj;
}
@ -487,8 +488,9 @@ class RequestContext implements IContextSource, MutableContext {
public function getSkin() {
if ( $this->skin === null ) {
$skin = null;
Hooks::runner()->onRequestContextCreateSkin( $this, $skin );
$factory = MediaWikiServices::getInstance()->getSkinFactory();
$services = MediaWikiServices::getInstance();
( new HookRunner( $services->getHookContainer() ) )->onRequestContextCreateSkin( $this, $skin );
$factory = $services->getSkinFactory();
if ( $skin instanceof Skin ) {
// The hook provided a skin object
@ -502,8 +504,7 @@ class RequestContext implements IContextSource, MutableContext {
// No hook override, go through normal processing
if ( !in_array( 'skin',
$this->getConfig()->get( MainConfigNames::HiddenPrefs ) ) ) {
$userOptionsLookup = MediaWikiServices::getInstance()
->getUserOptionsLookup();
$userOptionsLookup = $services->getUserOptionsLookup();
$userSkin = $userOptionsLookup->getOption( $this->getUser(), 'skin' );
// Optimisation: Avoid slow getVal(), this isn't user-generated content.
$userSkin = $this->getRequest()->getRawVal( 'useskin', $userSkin );

View file

@ -30,7 +30,6 @@ use DeprecationHelper;
use DerivativeContext;
use ErrorPageError;
use ExternalUserNames;
use Hooks;
use IContextSource;
use LogEventsList;
use LogPage;
@ -61,6 +60,7 @@ use MediaWiki\EditPage\Constraint\SpamRegexConstraint;
use MediaWiki\EditPage\Constraint\UnicodeConstraint;
use MediaWiki\EditPage\Constraint\UserBlockConstraint;
use MediaWiki\EditPage\Constraint\UserRateLimitConstraint;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
use MediaWiki\Html\Html;
use MediaWiki\Language\RawMessage;
@ -4227,7 +4227,8 @@ class EditPage implements IEditObject {
* @return string
*/
public static function getCopyrightWarning( PageReference $page, string $format, MessageLocalizer $localizer ) {
$rightsText = MediaWikiServices::getInstance()->getMainConfig()->get( MainConfigNames::RightsText );
$services = MediaWikiServices::getInstance();
$rightsText = $services->getMainConfig()->get( MainConfigNames::RightsText );
if ( $rightsText ) {
$copywarnMsg = [ 'copyrightwarning',
'[[' . $localizer->msg( 'copyrightpage' )->inContentLanguage()->text() . ']]',
@ -4238,7 +4239,7 @@ class EditPage implements IEditObject {
}
// Allow for site and per-namespace customization of contribution/copyright notice.
$title = Title::newFromPageReference( $page );
Hooks::runner()->onEditPageCopyrightWarning( $title, $copywarnMsg );
( new HookRunner( $services->getHookContainer() ) )->onEditPageCopyrightWarning( $title, $copywarnMsg );
if ( !$copywarnMsg ) {
return '';
}
@ -4271,8 +4272,9 @@ class EditPage implements IEditObject {
] ) .
Html::openElement( 'tbody' );
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
foreach ( $output->getLimitReportData() as $key => $value ) {
if ( Hooks::runner()->onParserLimitReportFormat( $key, $value, $limitReport, true, true ) ) {
if ( $hookRunner->onParserLimitReportFormat( $key, $value, $limitReport, true, true ) ) {
$keyMsg = wfMessage( $key );
$valueMsg = wfMessage( [ "$key-value-html", "$key-value" ] );
if ( !$valueMsg->exists() ) {
@ -4724,7 +4726,8 @@ class EditPage implements IEditObject {
$startingToolbar = '<div id="toolbar"></div>';
$toolbar = $startingToolbar;
if ( !Hooks::runner()->onEditPageBeforeEditToolbar( $toolbar ) ) {
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
if ( !$hookRunner->onEditPageBeforeEditToolbar( $toolbar ) ) {
return null;
}
// Don't add a pointless `<div>` to the page unless a hook caller populated it

View file

@ -18,6 +18,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use MediaWiki\Request\FauxRequest;
@ -760,7 +761,7 @@ TXT;
$logger->error( $json, [ 'private' => true ] );
}
Hooks::runner()->onLogException( $e, false );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onLogException( $e, false );
}
}
@ -805,6 +806,6 @@ TXT;
$logger->log( $unfilteredLevel, $json, [ 'private' => true ] );
}
Hooks::runner()->onLogException( $e, $suppressed );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onLogException( $e, $suppressed );
}
}

View file

@ -20,6 +20,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\StubObject\StubUserLang;
@ -147,7 +148,8 @@ abstract class ImageGalleryBase extends ContextSource {
'slideshow' => SlideshowImageGallery::class,
];
// Allow extensions to make a new gallery format.
Hooks::runner()->onGalleryGetModes( self::$modeMapping );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onGalleryGetModes( self::$modeMapping );
}
}

View file

@ -1,5 +1,6 @@
<?php
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\Linker\Linker;
use MediaWiki\Linker\LinkRenderer;
@ -86,6 +87,7 @@ class TraditionalImageGallery extends ImageGalleryBase {
$lang = $this->getRenderLang();
$enableLegacyMediaDOM =
$this->getConfig()->get( MainConfigNames::ParserEnableLegacyMediaDOM );
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
# Output each image...
foreach ( $this->mImages as [ $nt, $text, $alt, $link, $handlerOpts, $loading, $imageOptions ] ) {
@ -98,7 +100,7 @@ class TraditionalImageGallery extends ImageGalleryBase {
if ( $resolveFilesViaParser ) {
# Give extensions a chance to select the file revision for us
$options = [];
Hooks::runner()->onBeforeParserFetchFileAndTitle(
$hookRunner->onBeforeParserFetchFileAndTitle(
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
$this->mParser, $nt, $options, $descQuery );
# Fetch and register the file (file title may be different via hooks)

View file

@ -18,6 +18,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
@ -73,9 +74,10 @@ class RecentChangesUpdateJob extends Job {
}
protected function purgeExpiredRows() {
$rcMaxAge = MediaWikiServices::getInstance()->getMainConfig()->get(
$services = MediaWikiServices::getInstance();
$rcMaxAge = $services->getMainConfig()->get(
MainConfigNames::RCMaxAge );
$updateRowsPerQuery = MediaWikiServices::getInstance()->getMainConfig()->get(
$updateRowsPerQuery = $services->getMainConfig()->get(
MainConfigNames::UpdateRowsPerQuery );
$dbw = wfGetDB( DB_PRIMARY );
$lockKey = $dbw->getDomainID() . ':recentchanges-prune';
@ -84,8 +86,9 @@ class RecentChangesUpdateJob extends Job {
return;
}
$factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
$factory = $services->getDBLoadBalancerFactory();
$ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
$hookRunner = new HookRunner( $services->getHookContainer() );
$cutoff = $dbw->timestamp( time() - $rcMaxAge );
$rcQuery = RecentChange::getQueryInfo();
do {
@ -105,7 +108,7 @@ class RecentChangesUpdateJob extends Job {
}
if ( $rcIds ) {
$dbw->delete( 'recentchanges', [ 'rc_id' => $rcIds ], __METHOD__ );
Hooks::runner()->onRecentChangesPurgeRows( $rows );
$hookRunner->onRecentChangesPurgeRows( $rows );
// There might be more, so try waiting for replica DBs
if ( !$factory->commitAndWaitForReplication(
__METHOD__, $ticket, [ 'timeout' => 3 ]

View file

@ -22,6 +22,7 @@
* @author PhiLiP <philip.npc@gmail.com>
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\Logger\LoggerFactory;
@ -334,7 +335,8 @@ abstract class LanguageConverter implements ILanguageConverter {
public function getPreferredVariant() {
$req = $this->getURLVariant();
Hooks::runner()->onGetLangPreferredVariant( $req );
$services = MediaWikiServices::getInstance();
( new HookRunner( $services->getHookContainer() ) )->onGetLangPreferredVariant( $req );
if ( !$req ) {
$user = RequestContext::getMain()->getUser();
@ -349,7 +351,7 @@ abstract class LanguageConverter implements ILanguageConverter {
}
}
$defaultLanguageVariant = MediaWikiServices::getInstance()->getMainConfig()
$defaultLanguageVariant = $services->getMainConfig()
->get( MainConfigNames::DefaultLanguageVariant );
if ( !$req && $defaultLanguageVariant ) {
$req = $this->validateVariant( $defaultLanguageVariant );

View file

@ -27,12 +27,12 @@ use ContextSource;
use DerivativeContext;
use ExternalUserNames;
use File;
use Hooks;
use HtmlArmor;
use IContextSource;
use Language;
use MediaTransformError;
use MediaTransformOutput;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\Html\HtmlHelper;
use MediaWiki\MainConfigNames;
@ -200,7 +200,8 @@ class Linker {
$attrs['class'] = 'mw-selflink selflink';
}
$ret = Html::rawElement( 'a', $attrs, $prefix . $html ) . $trail;
if ( !Hooks::runner()->onSelfLinkBegin( $nt, $html, $trail, $prefix, $ret ) ) {
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
if ( !$hookRunner->onSelfLinkBegin( $nt, $html, $trail, $prefix, $ret ) ) {
return $ret;
}
@ -269,7 +270,8 @@ class Linker {
$alt = self::fnamePart( $url );
}
$img = '';
$success = Hooks::runner()->onLinkerMakeExternalImage( $url, $alt, $img );
$success = ( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onLinkerMakeExternalImage( $url, $alt, $img );
if ( !$success ) {
wfDebug( "Hook LinkerMakeExternalImage changed the output of external image "
. "with url {$url} and alt text {$alt} to {$img}" );
@ -328,7 +330,8 @@ class Linker {
$title = Title::newFromLinkTarget( $title );
$res = null;
$dummy = new DummyLinker;
if ( !Hooks::runner()->onImageBeforeProduceHTML( $dummy, $title,
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
if ( !$hookRunner->onImageBeforeProduceHTML( $dummy, $title,
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
$file, $frameParams, $handlerParams, $time, $res,
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
@ -1027,7 +1030,7 @@ class Linker {
'title' => $alt
];
if ( !Hooks::runner()->onLinkerMakeMediaLinkFile(
if ( !( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onLinkerMakeMediaLinkFile(
Title::newFromLinkTarget( $title ), $file, $html, $attribs, $ret )
) {
wfDebug( "Hook LinkerMakeMediaLinkFile changed the output of link "
@ -1126,7 +1129,7 @@ class Linker {
$attribs['rel'] = implode( ' ', $combined );
}
$link = '';
$success = Hooks::runner()->onLinkerMakeExternalLink(
$success = ( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onLinkerMakeExternalLink(
$url, $text, $link, $attribs, $linktype );
if ( !$success ) {
wfDebug( "Hook LinkerMakeExternalLink changed the output of link "
@ -1217,7 +1220,8 @@ class Linker {
return ' ' . wfMessage( 'empty-username' )->parse();
}
global $wgLang;
$disableAnonTalk = MediaWikiServices::getInstance()->getMainConfig()->get( MainConfigNames::DisableAnonTalk );
$services = MediaWikiServices::getInstance();
$disableAnonTalk = $services->getMainConfig()->get( MainConfigNames::DisableAnonTalk );
$talkable = !( $disableAnonTalk && $userId == 0 );
$blockable = !( $flags & self::TOOL_LINKS_NOBLOCK );
$addEmailLink = $flags & self::TOOL_LINKS_EMAIL && $userId;
@ -1260,7 +1264,7 @@ class Linker {
$items[] = self::emailLink( $userId, $userText );
}
Hooks::runner()->onUserToolLinksEdit( $userId, $userText, $items );
( new HookRunner( $services->getHookContainer() ) )->onUserToolLinksEdit( $userId, $userText, $items );
if ( !$items ) {
return '';
@ -1929,9 +1933,10 @@ class Linker {
$inner = self::buildRollbackLink( $revRecord, $context, $editCount );
$services = MediaWikiServices::getInstance();
// Allow extensions to modify the rollback link.
// Abort further execution if the extension wants full control over the link.
if ( !Hooks::runner()->onLinkerGenerateRollbackLink(
if ( !( new HookRunner( $services->getHookContainer() ) )->onLinkerGenerateRollbackLink(
$revRecord, $context, $options, $inner ) ) {
return $inner;
}
@ -1940,10 +1945,10 @@ class Linker {
$inner = $context->msg( 'brackets' )->rawParams( $inner )->escaped();
}
if ( MediaWikiServices::getInstance()->getUserOptionsLookup()
if ( $services->getUserOptionsLookup()
->getBoolOption( $context->getUser(), 'showrollbackconfirmation' )
) {
$stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
$stats = $services->getStatsdDataFactory();
$stats->increment( 'rollbackconfirmation.event.load' );
$context->getOutput()->addModules( 'mediawiki.misc-authed-curate' );
}

View file

@ -23,6 +23,9 @@
* @since 1.19
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
/**
* This class formats all log entries for log types
* which have not been converted to the new system.
@ -117,8 +120,8 @@ class LegacyLogFormatter extends LogFormatter {
$params = $this->entry->getParameters();
Hooks::runner()->onLogLine( $type, $subtype, $title, $params, $this->comment,
$this->revert, $this->entry->getTimestamp() );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onLogLine(
$type, $subtype, $title, $params, $this->comment, $this->revert, $this->entry->getTimestamp() );
return $this->revert;
}

View file

@ -74,7 +74,7 @@ class LogEventsList extends ContextSource {
if ( $linkRenderer instanceof LinkRenderer ) {
$this->linkRenderer = $linkRenderer;
}
$this->hookRunner = Hooks::runner();
$this->hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
}
/**
@ -791,7 +791,8 @@ class LogEventsList extends ContextSource {
}
/* hook can return false, if we don't want the message to be emitted (Wikia BugId:7093) */
if ( Hooks::runner()->onLogEventsListShowLogExtract( $s, $types, $pageName, $user, $param ) ) {
$hookRunner = new HookRunner( $services->getHookContainer() );
if ( $hookRunner->onLogEventsListShowLogExtract( $s, $types, $pageName, $user, $param ) ) {
// $out can be either an OutputPage object or a String-by-reference
if ( $out instanceof OutputPage ) {
$out->addHTML( $s );

View file

@ -24,6 +24,7 @@
*/
use MediaWiki\ChangeTags\Taggable;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
use MediaWiki\Page\PageReference;
@ -428,7 +429,8 @@ class ManualLogEntry extends LogEntryBase implements Taggable {
function () use ( $newId, $to, $canAddTags ) {
$log = new LogPage( $this->getType() );
if ( !$log->isRestricted() ) {
Hooks::runner()->onManualLogEntryBeforePublish( $this );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onManualLogEntryBeforePublish( $this );
$rc = $this->getRecentChange( $newId );
if ( $to === 'rc' || $to === 'rcandudp' ) {

View file

@ -24,6 +24,7 @@
* @author Luke Welling lwelling@wikimedia.org
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Mail\UserEmailContact;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -252,7 +253,8 @@ class EmailNotification {
$formattedPageStatus = [ 'deleted', 'created', 'moved', 'restored', 'changed' ];
Hooks::runner()->onUpdateUserMailerFormattedPageStatus( $formattedPageStatus );
$hookRunner = new HookRunner( $mwServices->getHookContainer() );
$hookRunner->onUpdateUserMailerFormattedPageStatus( $formattedPageStatus );
if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
throw new MWException( 'Not a valid page status!' );
}
@ -288,7 +290,7 @@ class EmailNotification {
// see: https://phabricator.wikimedia.org/T208895
&& !( $config->get( MainConfigNames::BlockDisablesLogin ) &&
$watchingUser->getBlock() )
&& Hooks::runner()->onSendWatchlistEmailNotification( $watchingUser, $title, $this )
&& $hookRunner->onSendWatchlistEmailNotification( $watchingUser, $title, $this )
) {
$this->compose( $watchingUser, self::WATCHLIST, $messageCache );
}
@ -341,7 +343,9 @@ class EmailNotification {
) {
if ( !$targetUser->isEmailConfirmed() ) {
wfDebug( __METHOD__ . ": talk page owner doesn't have validated email" );
} elseif ( !Hooks::runner()->onAbortTalkPageEmailNotification( $targetUser, $title ) ) {
} elseif ( !( new HookRunner( $services->getHookContainer() ) )
->onAbortTalkPageEmailNotification( $targetUser, $title )
) {
wfDebug( __METHOD__ . ": talk page update notification is aborted for this user" );
} else {
wfDebug( __METHOD__ . ": sending talk page update notification" );

View file

@ -21,9 +21,9 @@
namespace MediaWiki\Mail;
use Config;
use Hooks;
use IContextSource;
use MailAddress;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Preferences\MultiUsernameFilter;
@ -129,9 +129,10 @@ class EmailUser {
* hook error
*/
public static function getPermissionsError( $user, $editToken, Config $config = null ) {
$services = MediaWikiServices::getInstance();
if ( $config === null ) {
wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
$config = MediaWikiServices::getInstance()->getMainConfig();
$config = $services->getMainConfig();
}
if ( !$config->get( MainConfigNames::EnableEmail ) ||
!$config->get( MainConfigNames::EnableUserEmail ) ) {
@ -144,8 +145,7 @@ class EmailUser {
return 'mailnologin';
}
if ( !MediaWikiServices::getInstance()
->getPermissionManager()
if ( !$services->getPermissionManager()
->userHasRight( $user, 'sendemail' )
) {
return 'badaccess';
@ -167,8 +167,9 @@ class EmailUser {
$hookErr = false;
Hooks::runner()->onUserCanSendEmail( $user, $hookErr );
Hooks::runner()->onEmailUserPermissionsErrors( $user, $editToken, $hookErr );
$hookRunner = new HookRunner( $services->getHookContainer() );
$hookRunner->onUserCanSendEmail( $user, $hookErr );
$hookRunner->onEmailUserPermissionsErrors( $user, $editToken, $hookErr );
return $hookErr ?: null;
}
@ -222,8 +223,9 @@ class EmailUser {
// Services that are needed, will be injected once this is moved to EmailUserUtils
// service, see T265541
$hookRunner = Hooks::runner();
$emailer = MediaWikiServices::getInstance()->getEmailer();
$services = MediaWikiServices::getInstance();
$hookRunner = new HookRunner( $services->getHookContainer() );
$emailer = $services->getEmailer();
$error = false;
if ( !$hookRunner->onEmailUser( $toAddress, $fromAddress, $subject, $text, $error ) ) {

View file

@ -25,6 +25,7 @@
* @author Luke Welling lwelling@wikimedia.org
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\WikiMap\WikiMap;
@ -96,7 +97,8 @@ class UserMailer {
* @return Status
*/
public static function send( $to, $from, $subject, $body, $options = [] ) {
$allowHTMLEmail = MediaWikiServices::getInstance()->getMainConfig()->get(
$services = MediaWikiServices::getInstance();
$allowHTMLEmail = $services->getMainConfig()->get(
MainConfigNames::AllowHTMLEmail );
if ( !isset( $options['contentType'] ) ) {
@ -153,7 +155,7 @@ class UserMailer {
// target differently to split up the address list
if ( count( $to ) > 1 ) {
$oldTo = $to;
Hooks::runner()->onUserMailerSplitTo( $to );
( new HookRunner( $services->getHookContainer() ) )->onUserMailerSplitTo( $to );
if ( $oldTo != $to ) {
$splitTo = array_diff( $oldTo, $to );
$to = array_diff( $oldTo, $splitTo ); // ignore new addresses added in the hook
@ -197,7 +199,8 @@ class UserMailer {
$body,
$options = []
) {
$mainConfig = MediaWikiServices::getInstance()->getMainConfig();
$services = MediaWikiServices::getInstance();
$mainConfig = $services->getMainConfig();
$smtp = $mainConfig->get( MainConfigNames::SMTP );
$enotifMaxRecips = $mainConfig->get( MainConfigNames::EnotifMaxRecips );
$additionalMailParams = $mainConfig->get( MainConfigNames::AdditionalMailParams );
@ -206,10 +209,11 @@ class UserMailer {
$contentType = $options['contentType'] ?? 'text/plain; charset=UTF-8';
$headers = $options['headers'] ?? [];
$hookRunner = new HookRunner( $services->getHookContainer() );
// Allow transformation of content, such as encrypting/signing
$error = false;
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
if ( !Hooks::runner()->onUserMailerTransformContent( $to, $from, $body, $error ) ) {
if ( !$hookRunner->onUserMailerTransformContent( $to, $from, $body, $error ) ) {
if ( $error ) {
return Status::newFatal( 'php-mail-error', $error );
} else {
@ -251,7 +255,7 @@ class UserMailer {
$extraParams = $additionalMailParams;
// Hook to generate custom VERP address for 'Return-Path'
Hooks::runner()->onUserMailerChangeReturnPath( $to, $returnPath );
$hookRunner->onUserMailerChangeReturnPath( $to, $returnPath );
// Add the envelope sender address using the -f command line option when PHP mail() is used.
// Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the
// generated VERP address when the hook runs effectively.
@ -307,7 +311,7 @@ class UserMailer {
}
// allow transformation of MIME-encoded message
if ( !Hooks::runner()->onUserMailerTransformMessage(
if ( !$hookRunner->onUserMailerTransformMessage(
$to, $from, $subject, $headers, $body, $error )
) {
if ( $error ) {
@ -317,7 +321,7 @@ class UserMailer {
}
}
$ret = Hooks::runner()->onAlternateUserMailer( $headers, $to, $from, $subject, $body );
$ret = $hookRunner->onAlternateUserMailer( $headers, $to, $from, $subject, $body );
if ( $ret === false ) {
// the hook implementation will return false to skip regular mail sending
return Status::newGood();

View file

@ -19,6 +19,7 @@
* @ingroup Media
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
/**
@ -293,7 +294,7 @@ abstract class MediaHandler {
*/
public static function getMetadataVersion() {
$version = [ '2' ]; // core metadata version
Hooks::runner()->onGetMetadataVersion( $version );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onGetMetadataVersion( $version );
return implode( ';', $version );
}

View file

@ -22,6 +22,7 @@
* @ingroup Media
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -117,7 +118,8 @@ class ThumbnailImage extends MediaTransformOutput {
* @return string
*/
public function toHtml( $options = [] ) {
$mainConfig = MediaWikiServices::getInstance()->getMainConfig();
$services = MediaWikiServices::getInstance();
$mainConfig = $services->getMainConfig();
$nativeImageLazyLoading = $mainConfig->get( MainConfigNames::NativeImageLazyLoading );
$enableLegacyMediaDOM = $mainConfig->get( MainConfigNames::ParserEnableLegacyMediaDOM );
@ -207,7 +209,8 @@ class ThumbnailImage extends MediaTransformOutput {
$attribs['srcset'] = Html::srcSet( $responsiveUrls );
}
Hooks::runner()->onThumbnailBeforeProduceHTML( $this, $attribs, $linkAttribs );
( new HookRunner( $services->getHookContainer() ) )
->onThumbnailBeforeProduceHTML( $this, $attribs, $linkAttribs );
return $this->linkWrap( $linkAttribs, Xml::element( 'img', $attribs ) );
}

View file

@ -26,6 +26,7 @@
* @ingroup Media
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Shell\Shell;
@ -231,7 +232,8 @@ abstract class TransformationalImageHandler extends ImageHandler {
// Try a hook. Called "Bitmap" for historical reasons.
/** @var MediaTransformOutput $mto */
$mto = null;
Hooks::runner()->onBitmapHandlerTransform( $this, $image, $scalerParams, $mto );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onBitmapHandlerTransform( $this, $image, $scalerParams, $mto );
if ( $mto !== null ) {
wfDebug( __METHOD__ . ": Hook to BitmapHandlerTransform created an mto" );
$scaler = 'hookaborted';
@ -627,7 +629,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
# For historical reasons, hook starts with BitmapHandler
$checkImageAreaHookResult = null;
Hooks::runner()->onBitmapHandlerCheckImageArea(
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onBitmapHandlerCheckImageArea(
$file, $params, $checkImageAreaHookResult );
if ( $checkImageAreaHookResult !== null ) {

View file

@ -21,6 +21,7 @@
use MediaWiki\Block\DatabaseBlock;
use MediaWiki\CommentFormatter\CommentFormatter;
use MediaWiki\EditPage\EditPage;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
use MediaWiki\Html\Html;
use MediaWiki\Linker\Linker;
@ -185,8 +186,9 @@ class Article implements Page {
}
$page = null;
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
Hooks::runner()->onArticleFromTitle( $title, $page, $context );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
->onArticleFromTitle( $title, $page, $context );
if ( !$page ) {
switch ( $title->getNamespace() ) {
case NS_FILE:
@ -496,7 +498,8 @@ class Article implements Page {
$poOptions = [];
# Allow extensions to vary parser options used for article rendering
Hooks::runner()->onArticleParserOptions( $this, $parserOptions );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onArticleParserOptions( $this, $parserOptions );
# Render printable version, use printable version cache
if ( $outputPage->isPrintable() ) {
$parserOptions->setIsPrintable( true );

View file

@ -24,9 +24,9 @@
namespace MediaWiki\Page\File;
use Hooks;
use LocalFile;
use ManualLogEntry;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\Page\DeletePage;
use MediaWiki\Title\Title;
@ -65,6 +65,7 @@ class FileDeleteForm {
$tags = [],
bool $deleteTalk = false
): Status {
$services = MediaWikiServices::getInstance();
if ( $oldimage ) {
$page = null;
$status = $file->deleteOldFile( $oldimage, $reason, $user, $suppress );
@ -92,7 +93,6 @@ class FileDeleteForm {
$status = Status::newFatal( 'cannotdelete',
wfEscapeWikiText( $title->getPrefixedText() )
);
$services = MediaWikiServices::getInstance();
$page = $services->getWikiPageFactory()->newFromTitle( $title );
'@phan-var \WikiFilePage $page';
$deleter = $services->getUserFactory()->newFromUserIdentity( $user );
@ -152,10 +152,10 @@ class FileDeleteForm {
}
if ( $status->isOK() ) {
$legacyUser = MediaWikiServices::getInstance()
->getUserFactory()
$legacyUser = $services->getUserFactory()
->newFromUserIdentity( $user );
Hooks::runner()->onFileDeleteComplete( $file, $oldimage, $page, $legacyUser, $reason );
( new HookRunner( $services->getHookContainer() ) )
->onFileDeleteComplete( $file, $oldimage, $page, $legacyUser, $reason );
}
return $status;

View file

@ -3624,15 +3624,17 @@ class Parser {
$revRecord = null;
$contextTitle = $parser ? $parser->getTitle() : null;
$services = MediaWikiServices::getInstance();
# Loop to fetch the article, with up to 2 redirects
$revLookup = MediaWikiServices::getInstance()->getRevisionLookup();
$revLookup = $services->getRevisionLookup();
$hookRunner = new HookRunner( $services->getHookContainer() );
for ( $i = 0; $i < 3 && is_object( $title ); $i++ ) {
# Give extensions a chance to select the revision instead
$revRecord = null; # Assume no hook
$id = false; # Assume current
$origTitle = $title;
$titleChanged = false;
Hooks::runner()->onBeforeParserFetchTemplateRevisionRecord(
$hookRunner->onBeforeParserFetchTemplateRevisionRecord(
# The $title is a not a PageIdentity, as it may
# contain fragments or even represent an attempt to transclude
# a broken or otherwise-missing Title, which the hook may
@ -3692,7 +3694,7 @@ class Parser {
}
# If there is no current revision, there is no page
if ( $revRecord === null || $revRecord->getId() === null ) {
$linkCache = MediaWikiServices::getInstance()->getLinkCache();
$linkCache = $services->getLinkCache();
$linkCache->addBadLinkObj( $title );
}
if ( $revRecord ) {
@ -3716,7 +3718,7 @@ class Parser {
break;
}
} elseif ( $title->getNamespace() === NS_MEDIAWIKI ) {
$message = wfMessage( MediaWikiServices::getInstance()->getContentLanguage()->
$message = wfMessage( $services->getContentLanguage()->
lcfirst( $title->getText() ) )->inContentLanguage();
if ( !$message->exists() ) {
$text = false;

View file

@ -21,6 +21,7 @@
* @ingroup Parser
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\MutableRevisionRecord;
@ -1208,7 +1209,7 @@ class ParserOptions {
self::$cacheVaryingOptionsHash = self::$initialCacheVaryingOptionsHash;
self::$lazyOptions = self::$initialLazyOptions;
Hooks::runner()->onParserOptionsRegister(
( new HookRunner( $services->getHookContainer() ) )->onParserOptionsRegister(
self::$defaults,
self::$cacheVaryingOptionsHash,
self::$lazyOptions
@ -1451,7 +1452,7 @@ class ParserOptions {
$user = $services->getUserFactory()->newFromUserIdentity( $this->getUserIdentity() );
// Give a chance for extensions to modify the hash, if they have
// extra options or other effects on the parser cache.
Hooks::runner()->onPageRenderingHash(
( new HookRunner( $services->getHookContainer() ) )->onPageRenderingHash(
$confstr,
$user,
$forOptions

View file

@ -1,5 +1,6 @@
<?php
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\Json\JsonUnserializable;
use MediaWiki\Json\JsonUnserializableTrait;
@ -437,7 +438,8 @@ class ParserOutput extends CacheTime implements ContentMetadataCollector {
$text .= $this->renderDebugInfo();
}
Hooks::runner()->onParserOutputPostCacheTransform( $this, $text, $options );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onParserOutputPostCacheTransform( $this, $text, $options );
if ( $options['wrapperDivClass'] !== '' && !$options['unwrap'] ) {
$text = Html::rawElement( 'div', [ 'class' => $options['wrapperDivClass'] ], $text );
@ -1990,6 +1992,7 @@ class ParserOutput extends CacheTime implements ContentMetadataCollector {
// TODO: flags should go into limit report too.
$limitReport .= 'Complications: [' . implode( ', ', $this->getAllFlags() ) . "]\n";
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
foreach ( $limitReportData as $key => $value ) {
if ( in_array( $key, [
'cachereport-origin',
@ -2001,7 +2004,7 @@ class ParserOutput extends CacheTime implements ContentMetadataCollector {
// These keys are processed separately.
continue;
}
if ( Hooks::runner()->onParserLimitReportFormat(
if ( $hookRunner->onParserLimitReportFormat(
$key, $value, $limitReport, false, false )
) {
$keyMsg = wfMessage( $key )->inLanguage( 'en' )->useDatabase( false );

View file

@ -24,6 +24,7 @@
* @ingroup Parser
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\Parser\RemexRemoveTagHandler;
use MediaWiki\Parser\RemexStripTagHandler;
@ -1893,7 +1894,8 @@ class Sanitizer {
public static function validateEmail( $addr ) {
$result = null;
// TODO This method should be non-static, and have a HookRunner injected
if ( !Hooks::runner()->onIsValidEmailAddr( $addr, $result ) ) {
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
if ( !$hookRunner->onIsValidEmailAddr( $addr, $result ) ) {
return $result;
}

View file

@ -20,6 +20,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\User\UserIdentity;
@ -177,18 +178,17 @@ class UserPasswordPolicy {
* @return array the effective policy for $user
*/
public function getPoliciesForUser( UserIdentity $user ) {
$services = MediaWikiServices::getInstance();
$effectivePolicy = self::getPoliciesForGroups(
$this->policies,
MediaWikiServices::getInstance()
->getUserGroupManager()
$services->getUserGroupManager()
->getUserEffectiveGroups( $user ),
$this->policies['default']
);
$legacyUser = MediaWikiServices::getInstance()
->getUserFactory()
$legacyUser = $services->getUserFactory()
->newFromUserIdentity( $user );
Hooks::runner()->onPasswordPoliciesForUser( $legacyUser, $effectivePolicy );
( new HookRunner( $services->getHookContainer() ) )->onPasswordPoliciesForUser( $legacyUser, $effectivePolicy );
return $effectivePolicy;
}

View file

@ -19,6 +19,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
@ -45,7 +46,8 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
* @return string|null
*/
public function getLine( array $feed, RecentChange $rc, $actionComment ) {
$mainConfig = MediaWikiServices::getInstance()->getMainConfig();
$services = MediaWikiServices::getInstance();
$mainConfig = $services->getMainConfig();
$useRCPatrol = $mainConfig->get( MainConfigNames::UseRCPatrol );
$useNPPatrol = $mainConfig->get( MainConfigNames::UseNPPatrol );
$localInterwikis = $mainConfig->get( MainConfigNames::LocalInterwikis );
@ -80,7 +82,7 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
$query .= '&rcid=' . $attribs['rc_id'];
}
Hooks::runner()->onIRCLineURL( $url, $query, $rc );
( new HookRunner( $services->getHookContainer() ) )->onIRCLineURL( $url, $query, $rc );
$url .= $query;
}
@ -108,7 +110,7 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
) );
$flag = $attribs['rc_log_action'];
} else {
$store = MediaWikiServices::getInstance()->getCommentStore();
$store = $services->getCommentStore();
$comment = self::cleanupForIRC( $store->getComment( 'rc_comment', $attribs )->text );
$flag = '';
if ( !$attribs['rc_patrolled']

View file

@ -20,6 +20,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
use MediaWiki\Title\TitleArray;
@ -126,7 +127,7 @@ abstract class PrefixSearch {
}
}
$srchres = [];
if ( Hooks::runner()->onPrefixSearchBackend(
if ( ( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onPrefixSearchBackend(
$namespaces, $search, $limit, $srchres, $offset )
) {
return $this->titles( $this->defaultSearchBackend( $namespaces, $search, $limit, $offset ) );

View file

@ -1,5 +1,6 @@
<?php
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\RevisionLookup;
use MediaWiki\Revision\RevisionRecord;
@ -45,7 +46,7 @@ trait RevisionSearchResultTrait {
if ( $title !== null ) {
$services = MediaWikiServices::getInstance();
$id = false;
Hooks::runner()->onSearchResultInitFromTitle( $title, $id );
( new HookRunner( $services->getHookContainer() ) )->onSearchResultInitFromTitle( $title, $id );
$this->mRevisionRecord = $services->getRevisionLookup()->getRevisionByTitle(
$title,

View file

@ -429,14 +429,16 @@ abstract class SearchEngine {
if ( !$allQuery && strpos( $query, ':' ) !== false ) {
$prefix = str_replace( ' ', '_', substr( $query, 0, strpos( $query, ':' ) ) );
$index = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $prefix );
$services = MediaWikiServices::getInstance();
$index = $services->getContentLanguage()->getNsIndex( $prefix );
if ( $index !== false ) {
$extractedNamespace = [ $index ];
$parsed = substr( $query, strlen( $prefix ) + 1 );
} elseif ( $withPrefixSearchExtractNamespaceHook ) {
$hookNamespaces = [ NS_MAIN ];
$hookQuery = $query;
Hooks::runner()->onPrefixSearchExtractNamespace( $hookNamespaces, $hookQuery );
( new HookRunner( $services->getHookContainer() ) )
->onPrefixSearchExtractNamespace( $hookNamespaces, $hookQuery );
if ( $hookQuery !== $query ) {
$parsed = $hookQuery;
$extractedNamespace = $hookNamespaces;

View file

@ -22,7 +22,7 @@
namespace MediaWiki\Shell;
use Hooks;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use Shellbox\Shellbox;
@ -184,10 +184,11 @@ class Shell {
public static function makeScriptCommand(
string $script, array $parameters, $options = []
): Command {
$phpCli = MediaWikiServices::getInstance()->getMainConfig()->get( MainConfigNames::PhpCli );
$services = MediaWikiServices::getInstance();
$phpCli = $services->getMainConfig()->get( MainConfigNames::PhpCli );
// Give site config file a chance to run the script in a wrapper.
// The caller may likely want to call wfBasename() on $script.
Hooks::runner()->onWfShellWikiCmd( $script, $parameters, $options );
( new HookRunner( $services->getHookContainer() ) )->onWfShellWikiCmd( $script, $parameters, $options );
$cmd = [ $options['php'] ?? $phpCli ];
if ( isset( $options['wrapper'] ) ) {
$cmd[] = $options['wrapper'];

View file

@ -22,6 +22,7 @@
*/
use MediaWiki\Cache\LinkBatchFactory;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -140,7 +141,7 @@ abstract class QueryPage extends SpecialPage {
[ SpecialUnusedTemplates::class, 'Unusedtemplates' ],
[ SpecialWithoutInterwiki::class, 'Withoutinterwiki' ],
];
Hooks::runner()->onWgQueryPages( $qp );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onWgQueryPages( $qp );
}
return $qp;

View file

@ -25,7 +25,6 @@ namespace MediaWiki\Specials;
use ContribsPager;
use ExternalUserNames;
use Hooks;
use HTMLForm;
use HTMLMultiSelectField;
use IncludableSpecialPage;
@ -553,7 +552,7 @@ class SpecialContributions extends IncludableSpecialPage {
) {
// Fallback to global state, if not provided
$permissionManager ??= MediaWikiServices::getInstance()->getPermissionManager();
$hookRunner ??= Hooks::runner();
$hookRunner ??= new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
$id = $target->getId();
$username = $target->getName();

View file

@ -24,7 +24,6 @@
namespace MediaWiki\Specials;
use ChangeTags;
use Hooks;
use LogEventsList;
use LogPage;
use LogPager;
@ -34,6 +33,7 @@ use MediaWiki\Html\FormOptions;
use MediaWiki\Html\Html;
use MediaWiki\Html\ListToggle;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
use MediaWiki\User\ActorNormalization;
use MediaWiki\User\UserIdentityLookup;
@ -208,7 +208,8 @@ class SpecialLog extends SpecialPage {
'renameuser',
];
( $runner ?? Hooks::runner() )->onGetLogTypesOnUser( $types );
( $runner ?? new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onGetLogTypesOnUser( $types );
return $types;
}

View file

@ -22,6 +22,7 @@
* @ingroup Upload
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -640,7 +641,8 @@ class SpecialUpload extends SpecialPage {
}
// allow extensions to modify the content
Hooks::runner()->onUploadForm_getInitialPageText( $pageText, $msg, $config );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onUploadForm_getInitialPageText( $pageText, $msg, $config );
return $pageText;
}

View file

@ -24,6 +24,7 @@
*/
use MediaWiki\ExtensionInfo;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\Language\RawMessage;
use MediaWiki\Linker\Linker;
@ -325,7 +326,7 @@ class SpecialVersion extends SpecialPage {
* @since 1.34
* @return string[] Array of wikitext strings keyed by wikitext strings
*/
private static function getSoftwareInformation() {
private function getSoftwareInformation() {
$dbr = wfGetDB( DB_REPLICA );
// Put the software in an array of form 'name' => 'version'. All messages should
@ -339,7 +340,7 @@ class SpecialVersion extends SpecialPage {
];
// Allow a hook to add/remove items.
Hooks::runner()->onSoftwareInfo( $software );
$this->getHookRunner()->onSoftwareInfo( $software );
return $software;
}
@ -365,7 +366,7 @@ class SpecialVersion extends SpecialPage {
Html::element( 'th', [], $this->msg( 'version-software-version' )->text() )
);
foreach ( self::getSoftwareInformation() as $name => $version ) {
foreach ( $this->getSoftwareInformation() as $name => $version ) {
$out .= Html::rawElement( 'tr', [],
Html::rawElement( 'td', [], $this->msg( new RawMessage( $name ) )->parse() ) .
Html::rawElement( 'td', [ 'dir' => 'ltr' ], $this->msg( new RawMessage( $version ) )->parse() )
@ -430,7 +431,8 @@ class SpecialVersion extends SpecialPage {
*/
private static function getMWVersionLinked() {
$versionUrl = "";
if ( Hooks::runner()->onSpecialVersionVersionUrl( MW_VERSION, $versionUrl ) ) {
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
if ( $hookRunner->onSpecialVersionVersionUrl( MW_VERSION, $versionUrl ) ) {
$versionParts = [];
preg_match( "/^(\d+\.\d+)/", MW_VERSION, $versionParts );
$versionUrl = "https://www.mediawiki.org/wiki/MediaWiki_{$versionParts[1]}";
@ -491,7 +493,8 @@ class SpecialVersion extends SpecialPage {
'other' => wfMessage( 'version-other' )->text(),
];
Hooks::runner()->onExtensionTypes( self::$extensionTypes );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onExtensionTypes( self::$extensionTypes );
}
return self::$extensionTypes;

View file

@ -1,7 +1,9 @@
<?php
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
/**
@ -44,7 +46,8 @@ class LoginHelper extends ContextSource {
static $messages = null;
if ( !$messages ) {
$messages = self::$validErrorMessages;
Hooks::runner()->onLoginFormValidErrorMessages( $messages );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onLoginFormValidErrorMessages( $messages );
}
return $messages;

View file

@ -31,7 +31,6 @@ use ContentHandler;
use DBAccessObjectUtils;
use DeferredUpdates;
use DeprecationHelper;
use Hooks;
use HTMLCacheUpdateJob;
use IDBAccessObject;
use ILanguageConverter;
@ -41,6 +40,7 @@ use LinkCache;
use MalformedTitleException;
use MapCacheLRU;
use MediaWiki\DAO\WikiAwareEntityTrait;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\Interwiki\InterwikiLookup;
use MediaWiki\Linker\LinkTarget;
@ -1443,8 +1443,9 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
* @return bool
*/
public function isMovable() {
$services = MediaWikiServices::getInstance();
if (
!MediaWikiServices::getInstance()->getNamespaceInfo()->
!$services->getNamespaceInfo()->
isMovable( $this->mNamespace ) || $this->isExternal()
) {
// Interwiki title or immovable namespace. Hooks don't get to override here
@ -1452,7 +1453,7 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
}
$result = true;
Hooks::runner()->onTitleIsMovable( $this, $result );
( new HookRunner( $services->getHookContainer() ) )->onTitleIsMovable( $this, $result );
return $result;
}
@ -2249,7 +2250,7 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
# Finally, add the fragment.
$url .= $this->getFragmentForURL();
Hooks::runner()->onGetFullURL( $this, $url, $query );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onGetFullURL( $this, $url, $query );
return $url;
}
@ -2308,6 +2309,8 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
$query = self::fixUrlQueryArgs( $query, $query2 );
$services = MediaWikiServices::getInstance();
$hookRunner = new HookRunner( $services->getHookContainer() );
$interwiki = self::getInterwikiLookup()->fetch( $this->mInterwiki );
if ( $interwiki ) {
$namespace = $this->getNsText();
@ -2326,7 +2329,7 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
} else {
$url = str_replace( '$1', $dbkey, $wgArticlePath );
}
Hooks::runner()->onGetLocalURL__Article( $this, $url );
$hookRunner->onGetLocalURL__Article( $this, $url );
} else {
global $wgVariantArticlePath, $wgActionPaths;
$url = false;
@ -2353,8 +2356,7 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
if ( $url === false
&& $wgVariantArticlePath
&& preg_match( '/^variant=([^&]*)$/', $query, $matches )
&& $this->getPageLanguage()->equals(
MediaWikiServices::getInstance()->getContentLanguage() )
&& $this->getPageLanguage()->equals( $services->getContentLanguage() )
&& $this->getPageLanguageConverter()->hasVariants()
) {
$variant = urldecode( $matches[1] );
@ -2373,10 +2375,10 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
$url = "{$wgScript}?title={$dbkey}&{$query}";
}
}
Hooks::runner()->onGetLocalURL__Internal( $this, $url, $query );
$hookRunner->onGetLocalURL__Internal( $this, $url, $query );
}
Hooks::runner()->onGetLocalURL( $this, $url, $query );
$hookRunner->onGetLocalURL( $this, $url, $query );
return $url;
}
@ -2427,7 +2429,8 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
$query = self::fixUrlQueryArgs( $query, $query2 );
$server = $wgInternalServer !== false ? $wgInternalServer : $wgServer;
$url = wfExpandUrl( $server . $this->getLocalURL( $query ), PROTO_HTTP );
Hooks::runner()->onGetInternalURL( $this, $url, $query );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onGetInternalURL( $this, $url, $query );
return $url;
}
@ -2447,7 +2450,8 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
public function getCanonicalURL( $query = '', $query2 = false ) {
$query = self::fixUrlQueryArgs( $query, $query2 );
$url = wfExpandUrl( $this->getLocalURL( $query ) . $this->getFragmentForURL(), PROTO_CANONICAL );
Hooks::runner()->onGetCanonicalURL( $this, $url, $query );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onGetCanonicalURL( $this, $url, $query );
return $url;
}
@ -3339,7 +3343,7 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
*/
public function exists( $flags = 0 ): bool {
$exists = $this->getArticleID( $flags ) != 0;
Hooks::runner()->onTitleExists( $this, $exists );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onTitleExists( $this, $exists );
return $exists;
}
@ -3362,6 +3366,7 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
public function isAlwaysKnown() {
$isKnown = null;
$services = MediaWikiServices::getInstance();
/**
* Allows overriding default behavior for determining if a page exists.
* If $isKnown is kept as null, regular checks happen. If it's
@ -3372,7 +3377,7 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
* @param Title $title
* @param bool|null $isKnown
*/
Hooks::runner()->onTitleIsAlwaysKnown( $this, $isKnown );
( new HookRunner( $services->getHookContainer() ) )->onTitleIsAlwaysKnown( $this, $isKnown );
if ( $isKnown !== null ) {
return $isKnown;
@ -3382,7 +3387,6 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
return true; // any interwiki link might be viewable, for all we know
}
$services = MediaWikiServices::getInstance();
switch ( $this->mNamespace ) {
case NS_MEDIA:
case NS_FILE:
@ -3738,7 +3742,8 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
// on the Title object passed in, and should probably
// tell the users to run updateCollations.php --force
// in order to re-sort existing category relations.
Hooks::runner()->onGetDefaultSortkey( $this, $unprefixed );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onGetDefaultSortkey( $this, $unprefixed );
if ( $prefix !== '' ) {
# Separate with a line feed, so the unprefixed part is only used as
# a tiebreaker when two pages have the exact same prefix.
@ -3955,7 +3960,8 @@ class Title implements LinkTarget, PageIdentity, IDBAccessObject {
}
}
Hooks::runner()->onTitleGetEditNotices( $this, $oldid, $notices );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onTitleGetEditNotices( $this, $oldid, $notices );
return $notices;
}

View file

@ -21,6 +21,7 @@
* @ingroup Upload
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -201,8 +202,9 @@ abstract class UploadBase {
// Give hooks the chance to handle this request
/** @var self|null $className */
$className = null;
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
Hooks::runner()->onUploadCreateFromRequest( $type, $className );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
// @phan-suppress-next-line PhanTypeMismatchArgument Type mismatch on pass-by-ref args
->onUploadCreateFromRequest( $type, $className );
if ( $className === null ) {
$className = 'UploadFrom' . $type;
wfDebug( __METHOD__ . ": class name: $className" );

View file

@ -21,6 +21,7 @@
* @ingroup Upload
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Permissions\Authority;
@ -147,7 +148,8 @@ class UploadFromUrl extends UploadBase {
public static function isAllowedUrl( $url ) {
if ( !isset( self::$allowedUrls[$url] ) ) {
$allowed = true;
Hooks::runner()->onIsUploadAllowedFromUrl( $url, $allowed );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onIsUploadAllowedFromUrl( $url, $allowed );
self::$allowedUrls[$url] = $allowed;
}

View file

@ -20,6 +20,7 @@
use MediaWiki\Auth\AuthenticationResponse;
use MediaWiki\Auth\Throttler;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Session\BotPasswordSessionProvider;
@ -508,7 +509,8 @@ class BotPassword implements IDBAccessObject {
} else {
$response = AuthenticationResponse::newFail( $status->getMessage() );
}
Hooks::runner()->onAuthManagerLoginAuthenticateAudit( $response, $user, $name, $extraData );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onAuthManagerLoginAuthenticateAudit( $response, $user, $name, $extraData );
return $status;
}

View file

@ -20,6 +20,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
use MediaWiki\User\UserRigorOptions;
@ -107,13 +108,14 @@ class ExternalUserNames {
* username), otherwise the name with the prefix prepended.
*/
public function applyPrefix( $name ) {
$userNameUtils = MediaWikiServices::getInstance()->getUserNameUtils();
$services = MediaWikiServices::getInstance();
$userNameUtils = $services->getUserNameUtils();
if ( $userNameUtils->getCanonical( $name, UserRigorOptions::RIGOR_USABLE ) === false ) {
return $name;
}
if ( $this->assignKnownUsers ) {
$userIdentityLookup = MediaWikiServices::getInstance()->getUserIdentityLookup();
$userIdentityLookup = $services->getUserIdentityLookup();
$userIdentity = $userIdentityLookup->getUserIdentityByName( $name );
if ( $userIdentity && $userIdentity->isRegistered() ) {
return $name;
@ -122,7 +124,7 @@ class ExternalUserNames {
// See if any extension wants to create it.
if ( !isset( $this->triedCreations[$name] ) ) {
$this->triedCreations[$name] = true;
if ( !Hooks::runner()->onImportHandleUnknownUser( $name ) ) {
if ( !( new HookRunner( $services->getHookContainer() ) )->onImportHandleUnknownUser( $name ) ) {
$userIdentity = $userIdentityLookup->getUserIdentityByName( $name, IDBAccessObject::READ_LATEST );
if ( $userIdentity && $userIdentity->isRegistered() ) {
return $name;

View file

@ -20,6 +20,8 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use Wikimedia\Rdbms\IResultWrapper;
abstract class UserArray implements Iterator {
@ -34,7 +36,8 @@ abstract class UserArray implements Iterator {
*/
public static function newFromResult( $res ) {
$userArray = null;
if ( !Hooks::runner()->onUserArrayFromResult( $userArray, $res ) ) {
$hookRunner = new HookRunner( MediaWikiServices::getInstance()->getHookContainer() );
if ( !$hookRunner->onUserArrayFromResult( $userArray, $res ) ) {
return new ArrayIterator( [] );
}
return $userArray ?? new UserArrayFromResult( $res );

View file

@ -30,6 +30,7 @@
* @ingroup Maintenance
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Logger\ConsoleSpi;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
@ -102,7 +103,7 @@ class MWEval extends Maintenance {
$__historyFile = null;
}
Hooks::runner()->onMaintenanceShellStart();
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onMaintenanceShellStart();
$__e = null; // PHP exception
while ( ( $__line = Maintenance::readconsole() ) !== false ) {

View file

@ -36,6 +36,7 @@
// NO_AUTOLOAD -- file-scope code
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Logger\ConsoleSpi;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
@ -93,7 +94,7 @@ class MediaWikiShell extends Maintenance {
$this->setupLogging();
Hooks::runner()->onMaintenanceShellStart();
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onMaintenanceShellStart();
$shell->run();
}

View file

@ -26,6 +26,9 @@
* @ingroup entrypoint
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
// This endpoint is supposed to be independent of request cookies and other
// details of the session. Enforce this constraint with respect to session use.
define( 'MW_NO_SESSION', 1 );
@ -111,7 +114,7 @@ function wfOpenSearchDescMain() {
// Allow hooks to override the suggestion URL settings in a more
// general way than overriding the whole search engine...
Hooks::runner()->onOpenSearchUrls( $urls );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onOpenSearchUrls( $urls );
foreach ( $urls as $attribs ) {
print Xml::element( 'Url', $attribs );

View file

@ -20,6 +20,7 @@
* @file
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Languages\LanguageNameUtils;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
@ -1466,7 +1467,8 @@ return [
$magicWords = [
'SITENAME' => $config->get( MainConfigNames::Sitename ),
];
Hooks::runner()->onResourceLoaderJqueryMsgModuleMagicWords( $context, $magicWords );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onResourceLoaderJqueryMsgModuleMagicWords( $context, $magicWords );
return [
'allowedHtmlElements' => $allowedHtmlElements,
@ -1601,7 +1603,8 @@ return [
'selectorLogoutLink' => '#pt-logout a[data-mw="interface"]'
];
Hooks::runner()->onSkinPageReadyConfig( $context, $readyConfig );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onSkinPageReadyConfig( $context, $readyConfig );
return $readyConfig;
} ],
],
@ -2196,7 +2199,8 @@ return [
'name' => 'layout.js',
'callback' => static function ( Context $context ) {
$skinName = $context->getSkin();
Hooks::runner()->onPreferencesGetLayout( $useMobileLayout, $skinName );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onPreferencesGetLayout( $useMobileLayout, $skinName );
$file = $useMobileLayout ? 'mobile.js' : 'tabs.js';
return new FilePath( $file );
},

View file

@ -26,6 +26,7 @@
* @ingroup Testing
*/
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Html\Html;
use MediaWiki\Interwiki\ClassicInterwikiLookup;
use MediaWiki\MainConfigNames;
@ -2270,7 +2271,7 @@ class ParserTestRunner {
}
/** @since 1.20 */
Hooks::runner()->onParserTestGlobals( $setup );
( new HookRunner( $mwServices->getHookContainer() ) )->onParserTestGlobals( $setup );
// Set content language. This invalidates the magic word cache and title services
// In addition the ParserFactory needs to be recreated as well.

View file

@ -1,6 +1,7 @@
<?php
use MediaWiki\HookContainer\FauxGlobalHookArray;
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\Logger\LegacyLogger;
use MediaWiki\Logger\LegacySpi;
@ -1668,9 +1669,9 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
return;
}
Hooks::runner()->onUnitTestsBeforeDatabaseTeardown();
$services = MediaWikiServices::getInstance();
( new HookRunner( $services->getHookContainer() ) )->onUnitTestsBeforeDatabaseTeardown();
$jobQueueGroup = $services->getJobQueueGroup();
foreach ( $wgJobClasses as $type => $class ) {
// Delete any jobs under the clone DB (or old prefix in other stores)
@ -1791,7 +1792,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
self::$dbClone = $dbClone;
}
Hooks::runner()->onUnitTestsAfterDatabaseSetup( $db, $prefix );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onUnitTestsAfterDatabaseSetup( $db, $prefix );
}
/**

View file

@ -1,5 +1,7 @@
<?php
use MediaWiki\HookContainer\HookRunner;
use MediaWiki\MediaWikiServices;
use PHPUnit\Framework\TestSuite;
use SebastianBergmann\FileIterator\Facade;
@ -20,7 +22,7 @@ class ExtensionsTestSuite extends TestSuite {
$paths[] = dirname( $info['path'] ) . '/tests/phpunit';
}
// Extensions can return a list of files or directories
Hooks::runner()->onUnitTestsList( $paths );
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onUnitTestsList( $paths );
foreach ( array_unique( $paths ) as $path ) {
if ( is_dir( $path ) ) {
// If the path is a directory, search for test cases.