X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fspecialpage%2FSpecialPageFactory.php;h=5ac5f82c51ae3e1958d4c259ae253248a1987510;hp=40172ab69304451f5a841ce9e27586fe62814c38;hb=5a296a1113d1243962c6459281a0307dd3efb80f;hpb=dfec83932fd38a9086eb5a2e212889ad00f35b0e diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index 40172ab693..5ac5f82c51 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -34,6 +34,7 @@ use RequestContext; use SpecialPage; use Title; use User; +use Wikimedia\ObjectFactory; /** * Factory for handling the special page list and generating SpecialPage objects. @@ -68,35 +69,35 @@ class SpecialPageFactory { */ private static $coreList = [ // Maintenance Reports - 'BrokenRedirects' => \BrokenRedirectsPage::class, - 'Deadendpages' => \DeadendPagesPage::class, - 'DoubleRedirects' => \DoubleRedirectsPage::class, - 'Longpages' => \LongPagesPage::class, - 'Ancientpages' => \AncientPagesPage::class, - 'Lonelypages' => \LonelyPagesPage::class, - 'Fewestrevisions' => \FewestrevisionsPage::class, - 'Withoutinterwiki' => \WithoutInterwikiPage::class, + 'BrokenRedirects' => \SpecialBrokenRedirects::class, + 'Deadendpages' => \SpecialDeadendPages::class, + 'DoubleRedirects' => \SpecialDoubleRedirects::class, + 'Longpages' => \SpecialLongPages::class, + 'Ancientpages' => \SpecialAncientPages::class, + 'Lonelypages' => \SpecialLonelyPages::class, + 'Fewestrevisions' => \SpecialFewestRevisions::class, + 'Withoutinterwiki' => \SpecialWithoutInterwiki::class, 'Protectedpages' => \SpecialProtectedpages::class, 'Protectedtitles' => \SpecialProtectedtitles::class, - 'Shortpages' => \ShortPagesPage::class, - 'Uncategorizedcategories' => \UncategorizedCategoriesPage::class, - 'Uncategorizedimages' => \UncategorizedImagesPage::class, - 'Uncategorizedpages' => \UncategorizedPagesPage::class, - 'Uncategorizedtemplates' => \UncategorizedTemplatesPage::class, - 'Unusedcategories' => \UnusedCategoriesPage::class, - 'Unusedimages' => \UnusedimagesPage::class, - 'Unusedtemplates' => \UnusedtemplatesPage::class, - 'Unwatchedpages' => \UnwatchedpagesPage::class, - 'Wantedcategories' => \WantedCategoriesPage::class, + 'Shortpages' => \SpecialShortPages::class, + 'Uncategorizedcategories' => \SpecialUncategorizedCategories::class, + 'Uncategorizedimages' => \SpecialUncategorizedImages::class, + 'Uncategorizedpages' => \SpecialUncategorizedPages::class, + 'Uncategorizedtemplates' => \SpecialUncategorizedTemplates::class, + 'Unusedcategories' => \SpecialUnusedCategories::class, + 'Unusedimages' => \SpecialUnusedImages::class, + 'Unusedtemplates' => \SpecialUnusedTemplates::class, + 'Unwatchedpages' => \SpecialUnwatchedPages::class, + 'Wantedcategories' => \SpecialWantedCategories::class, 'Wantedfiles' => \WantedFilesPage::class, 'Wantedpages' => \WantedPagesPage::class, - 'Wantedtemplates' => \WantedTemplatesPage::class, + 'Wantedtemplates' => \SpecialWantedTemplates::class, // List of pages 'Allpages' => \SpecialAllPages::class, 'Prefixindex' => \SpecialPrefixindex::class, 'Categories' => \SpecialCategories::class, - 'Listredirects' => \ListredirectsPage::class, + 'Listredirects' => \SpecialListRedirects::class, 'PagesWithProp' => \SpecialPagesWithProp::class, 'TrackingCategories' => \SpecialTrackingCategories::class, @@ -118,7 +119,7 @@ class SpecialPageFactory { 'ChangePassword' => \SpecialChangePassword::class, 'BotPasswords' => \SpecialBotPasswords::class, 'PasswordReset' => \SpecialPasswordReset::class, - 'DeletedContributions' => \DeletedContributionsPage::class, + 'DeletedContributions' => \SpecialDeletedContributions::class, 'Preferences' => \SpecialPreferences::class, 'ResetTokens' => \SpecialResetTokens::class, 'Contributions' => \SpecialContributions::class, @@ -143,12 +144,12 @@ class SpecialPageFactory { // Media reports and uploads 'Listfiles' => \SpecialListFiles::class, 'Filepath' => \SpecialFilepath::class, - 'MediaStatistics' => \MediaStatisticsPage::class, - 'MIMEsearch' => \MIMEsearchPage::class, - 'FileDuplicateSearch' => \FileDuplicateSearchPage::class, + 'MediaStatistics' => \SpecialMediaStatistics::class, + 'MIMEsearch' => \SpecialMIMESearch::class, + 'FileDuplicateSearch' => \SpecialFileDuplicateSearch::class, 'Upload' => \SpecialUpload::class, 'UploadStash' => \SpecialUploadStash::class, - 'ListDuplicatedFiles' => \ListDuplicatedFilesPage::class, + 'ListDuplicatedFiles' => \SpecialListDuplicatedFiles::class, // Data and tools 'ApiSandbox' => \SpecialApiSandbox::class, @@ -159,7 +160,7 @@ class SpecialPageFactory { 'Unlockdb' => \SpecialUnlockdb::class, // Redirecting special pages - 'LinkSearch' => \LinkSearchPage::class, + 'LinkSearch' => \SpecialLinkSearch::class, 'Randompage' => \RandomPage::class, 'RandomInCategory' => \SpecialRandomInCategory::class, 'Randomredirect' => \SpecialRandomredirect::class, @@ -167,13 +168,13 @@ class SpecialPageFactory { 'GoToInterwiki' => \SpecialGoToInterwiki::class, // High use pages - 'Mostlinkedcategories' => \MostlinkedCategoriesPage::class, + 'Mostlinkedcategories' => \SpecialMostLinkedCategories::class, 'Mostimages' => \MostimagesPage::class, - 'Mostinterwikis' => \MostinterwikisPage::class, - 'Mostlinked' => \MostlinkedPage::class, - 'Mostlinkedtemplates' => \MostlinkedTemplatesPage::class, - 'Mostcategories' => \MostcategoriesPage::class, - 'Mostrevisions' => \MostrevisionsPage::class, + 'Mostinterwikis' => \SpecialMostInterwikis::class, + 'Mostlinked' => \SpecialMostLinked::class, + 'Mostlinkedtemplates' => \SpecialMostLinkedTemplates::class, + 'Mostcategories' => \SpecialMostCategories::class, + 'Mostrevisions' => \SpecialMostRevisions::class, // Page tools 'ComparePages' => \SpecialComparePages::class, @@ -191,7 +192,12 @@ class SpecialPageFactory { 'ApiHelp' => \SpecialApiHelp::class, 'Blankpage' => \SpecialBlankpage::class, 'Diff' => \SpecialDiff::class, - 'EditTags' => \SpecialEditTags::class, + 'EditTags' => [ + 'class' => \SpecialEditTags::class, + 'services' => [ + 'PermissionManager', + ], + ], 'Emailuser' => \SpecialEmailUser::class, 'Movepage' => \MovePageForm::class, 'Mycontributions' => \SpecialMycontributions::class, @@ -200,6 +206,7 @@ class SpecialPageFactory { 'Mytalk' => \SpecialMytalk::class, 'Myuploads' => \SpecialMyuploads::class, 'AllMyUploads' => \SpecialAllMyUploads::class, + 'NewSection' => \SpecialNewSection::class, 'PermanentLink' => \SpecialPermanentLink::class, 'Redirect' => \SpecialRedirect::class, 'Revisiondelete' => \SpecialRevisionDelete::class, @@ -220,12 +227,15 @@ class SpecialPageFactory { /** @var Language */ private $contLang; + /** @var ObjectFactory */ + private $objectFactory; + /** * TODO Make this a const when HHVM support is dropped (T192166) * * @var array * @since 1.33 - * */ + */ public static $constructorOptions = [ 'ContentHandlerUseDB', 'DisableInternalSearch', @@ -240,11 +250,17 @@ class SpecialPageFactory { /** * @param ServiceOptions $options * @param Language $contLang + * @param ObjectFactory $objectFactory */ - public function __construct( ServiceOptions $options, Language $contLang ) { + public function __construct( + ServiceOptions $options, + Language $contLang, + ObjectFactory $objectFactory + ) { $options->assertRequiredOptions( self::$constructorOptions ); $this->options = $options; $this->contLang = $contLang; + $this->objectFactory = $objectFactory; } /** @@ -271,8 +287,8 @@ class SpecialPageFactory { } if ( $this->options->get( 'EmailAuthentication' ) ) { - $this->list['Confirmemail'] = \EmailConfirmation::class; - $this->list['Invalidateemail'] = \EmailInvalidation::class; + $this->list['Confirmemail'] = \SpecialConfirmEmail::class; + $this->list['Invalidateemail'] = \SpecialEmailInvalidate::class; } if ( $this->options->get( 'EnableEmail' ) ) { @@ -411,14 +427,22 @@ class SpecialPageFactory { if ( isset( $specialPageList[$realName] ) ) { $rec = $specialPageList[$realName]; - if ( is_callable( $rec ) ) { - // Use callback to instantiate the special page - $page = $rec(); - } elseif ( is_string( $rec ) ) { - $className = $rec; - $page = new $className; - } elseif ( $rec instanceof SpecialPage ) { + if ( $rec instanceof SpecialPage ) { + wfDeprecated( + "a SpecialPage instance (for $realName) in " . + '$wgSpecialPages or from the SpecialPage_initList hook', + '1.34' + ); + $page = $rec; // XXX: we should deep clone here + } elseif ( is_array( $rec ) || is_string( $rec ) || is_callable( $rec ) ) { + $page = $this->objectFactory->createObject( + $rec, + [ + 'allowClassName' => true, + 'allowCallable' => true + ] + ); } else { $page = null; } @@ -567,6 +591,7 @@ class SpecialPageFactory { return $title; } + // @phan-suppress-next-line PhanUndeclaredMethod $context->setTitle( $page->getPageTitle( $par ) ); } elseif ( !$page->isIncludable() ) { return false;