X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FEditPage.php;h=738eaecdf8312bee4af1614c420f8f7357949f7e;hb=80a6fdb70ec1ba38e87de1d02f7e78bda2ea6f6e;hp=9b862b932e06c8a3aee930769b60ebdd73d5c8c2;hpb=b33cbac37030919a43387bb82ca8b737298bd38a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/EditPage.php b/includes/EditPage.php index 9b862b932e..738eaecdf8 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -401,6 +401,11 @@ class EditPage { */ private $enableApiEditOverride = false; + /** + * @var IContextSource + */ + protected $context; + /** * @param Article $article */ @@ -408,6 +413,7 @@ class EditPage { $this->mArticle = $article; $this->page = $article->getPage(); // model object $this->mTitle = $article->getTitle(); + $this->context = $article->getContext(); $this->contentModel = $this->mTitle->getContentModel(); @@ -422,6 +428,14 @@ class EditPage { return $this->mArticle; } + /** + * @since 1.28 + * @return IContextSource + */ + public function getContext() { + return $this->context; + } + /** * @since 1.19 * @return Title @@ -493,7 +507,6 @@ class EditPage { * the newly-edited page. */ function edit() { - global $wgOut, $wgRequest, $wgUser; // Allow extensions to modify/prevent this form or submission if ( !Hooks::run( 'AlternateEdit', [ $this ] ) ) { return; @@ -501,13 +514,15 @@ class EditPage { wfDebug( __METHOD__ . ": enter\n" ); + $request = $this->context->getRequest(); + $out = $this->context->getOutput(); // If they used redlink=1 and the page exists, redirect to the main article - if ( $wgRequest->getBool( 'redlink' ) && $this->mTitle->exists() ) { - $wgOut->redirect( $this->mTitle->getFullURL() ); + if ( $request->getBool( 'redlink' ) && $this->mTitle->exists() ) { + $out->redirect( $this->mTitle->getFullURL() ); return; } - $this->importFormData( $wgRequest ); + $this->importFormData( $request ); $this->firsttime = false; if ( wfReadOnly() && $this->save ) { @@ -536,7 +551,7 @@ class EditPage { wfDebug( __METHOD__ . ": User can't edit\n" ); // Auto-block user's IP if the account was "hard" blocked if ( !wfReadOnly() ) { - $user = $wgUser; + $user = $this->context->getUser(); DeferredUpdates::addCallableUpdate( function () use ( $user ) { $user->spreadAnyEditBlock(); } ); @@ -610,15 +625,14 @@ class EditPage { * @return array */ protected function getEditPermissionErrors( $rigor = 'secure' ) { - global $wgUser; - - $permErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $wgUser, $rigor ); + $user = $this->context->getUser(); + $permErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user, $rigor ); # Can this title be created? if ( !$this->mTitle->exists() ) { $permErrors = array_merge( $permErrors, wfArrayDiff2( - $this->mTitle->getUserPermissionsErrors( 'create', $wgUser, $rigor ), + $this->mTitle->getUserPermissionsErrors( 'create', $user, $rigor ), $permErrors ) ); @@ -651,13 +665,12 @@ class EditPage { * @throws PermissionsError */ protected function displayPermissionsError( array $permErrors ) { - global $wgRequest, $wgOut; - - if ( $wgRequest->getBool( 'redlink' ) ) { + $out = $this->context->getOutput(); + if ( $this->context->getRequest()->getBool( 'redlink' ) ) { // The edit page was reached via a red link. // Redirect to the article page and let them click the edit tab if // they really want a permission error. - $wgOut->redirect( $this->mTitle->getFullURL() ); + $out->redirect( $this->mTitle->getFullURL() ); return; } @@ -672,7 +685,7 @@ class EditPage { $this->displayViewSourcePage( $content, - $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' ) + $out->formatPermissionsErrorMessage( $permErrors, 'edit' ) ); } @@ -682,29 +695,28 @@ class EditPage { * @param string $errorMessage additional wikitext error message to display */ protected function displayViewSourcePage( Content $content, $errorMessage = '' ) { - global $wgOut; + $out = $this->context->getOutput(); + Hooks::run( 'EditPage::showReadOnlyForm:initial', [ $this, &$out ] ); - Hooks::run( 'EditPage::showReadOnlyForm:initial', [ $this, &$wgOut ] ); - - $wgOut->setRobotPolicy( 'noindex,nofollow' ); - $wgOut->setPageTitle( wfMessage( + $out->setRobotPolicy( 'noindex,nofollow' ); + $out->setPageTitle( wfMessage( 'viewsource-title', $this->getContextTitle()->getPrefixedText() ) ); - $wgOut->addBacklinkSubtitle( $this->getContextTitle() ); - $wgOut->addHTML( $this->editFormPageTop ); - $wgOut->addHTML( $this->editFormTextTop ); + $out->addBacklinkSubtitle( $this->getContextTitle() ); + $out->addHTML( $this->editFormPageTop ); + $out->addHTML( $this->editFormTextTop ); if ( $errorMessage !== '' ) { - $wgOut->addWikiText( $errorMessage ); - $wgOut->addHTML( "
\n" ); + $out->addWikiText( $errorMessage ); + $out->addHTML( "
\n" ); } # If the user made changes, preserve them when showing the markup # (This happens when a user is blocked during edit, for instance) if ( !$this->firsttime ) { $text = $this->textbox1; - $wgOut->addWikiMsg( 'viewyourtext' ); + $out->addWikiMsg( 'viewyourtext' ); } else { try { $text = $this->toEditText( $content ); @@ -713,21 +725,21 @@ class EditPage { # (e.g. for an old revision with a different model) $text = $content->serialize(); } - $wgOut->addWikiMsg( 'viewsourcetext' ); + $out->addWikiMsg( 'viewsourcetext' ); } - $wgOut->addHTML( $this->editFormTextBeforeContent ); + $out->addHTML( $this->editFormTextBeforeContent ); $this->showTextbox( $text, 'wpTextbox1', [ 'readonly' ] ); - $wgOut->addHTML( $this->editFormTextAfterContent ); + $out->addHTML( $this->editFormTextAfterContent ); - $wgOut->addHTML( Html::rawElement( 'div', [ 'class' => 'templatesUsed' ], + $out->addHTML( Html::rawElement( 'div', [ 'class' => 'templatesUsed' ], Linker::formatTemplates( $this->getTemplates() ) ) ); - $wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' ); + $out->addModules( 'mediawiki.action.edit.collapsibleFooter' ); - $wgOut->addHTML( $this->editFormTextBottom ); + $out->addHTML( $this->editFormTextBottom ); if ( $this->mTitle->exists() ) { - $wgOut->returnToMain( null, $this->mTitle ); + $out->returnToMain( null, $this->mTitle ); } } @@ -737,18 +749,19 @@ class EditPage { * @return bool */ protected function previewOnOpen() { - global $wgRequest, $wgUser, $wgPreviewOnOpenNamespaces; - if ( $wgRequest->getVal( 'preview' ) == 'yes' ) { + global $wgPreviewOnOpenNamespaces; + $request = $this->context->getRequest(); + if ( $request->getVal( 'preview' ) == 'yes' ) { // Explicit override from request return true; - } elseif ( $wgRequest->getVal( 'preview' ) == 'no' ) { + } elseif ( $request->getVal( 'preview' ) == 'no' ) { // Explicit override from request return false; } elseif ( $this->section == 'new' ) { // Nothing *to* preview for new sections return false; - } elseif ( ( $wgRequest->getVal( 'preload' ) !== null || $this->mTitle->exists() ) - && $wgUser->getOption( 'previewonfirst' ) + } elseif ( ( $request->getVal( 'preload' ) !== null || $this->mTitle->exists() ) + && $this->context->getUser()->getOption( 'previewonfirst' ) ) { // Standard preference behavior return true; @@ -801,7 +814,7 @@ class EditPage { * @throws ErrorPageError */ function importFormData( &$request ) { - global $wgContLang, $wgUser; + global $wgContLang; # Section edit can come from either the form or a link $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) ); @@ -913,13 +926,14 @@ class EditPage { $this->watchthis = $request->getCheck( 'wpWatchthis' ); # Don't force edit summaries when a user is editing their own user or talk page + $user = $this->context->getUser(); if ( ( $this->mTitle->mNamespace == NS_USER || $this->mTitle->mNamespace == NS_USER_TALK ) - && $this->mTitle->getText() == $wgUser->getName() + && $this->mTitle->getText() == $user->getName() ) { $this->allowBlankSummary = true; } else { $this->allowBlankSummary = $request->getBool( 'wpIgnoreBlankSummary' ) - || !$wgUser->getOption( 'forceeditsummary' ); + || !$user->getOption( 'forceeditsummary' ); } $this->autoSumm = $request->getText( 'wpAutoSummary' ); @@ -1025,7 +1039,6 @@ class EditPage { * @return bool If the requested section is valid */ function initialiseForm() { - global $wgUser; $this->edittime = $this->page->getTimestamp(); $this->editRevId = $this->page->getLatest(); @@ -1034,20 +1047,21 @@ class EditPage { return false; } $this->textbox1 = $this->toEditText( $content ); + $user = $this->context->getUser(); // activate checkboxes if user wants them to be always active # Sort out the "watch" checkbox - if ( $wgUser->getOption( 'watchdefault' ) ) { + if ( $user->getOption( 'watchdefault' ) ) { # Watch all edits $this->watchthis = true; - } elseif ( $wgUser->getOption( 'watchcreations' ) && !$this->mTitle->exists() ) { + } elseif ( $user->getOption( 'watchcreations' ) && !$this->mTitle->exists() ) { # Watch creations $this->watchthis = true; - } elseif ( $wgUser->isWatched( $this->mTitle ) ) { + } elseif ( $user->isWatched( $this->mTitle ) ) { # Already watched $this->watchthis = true; } - if ( $wgUser->getOption( 'minordefault' ) && !$this->isNew ) { + if ( $user->getOption( 'minordefault' ) && !$this->isNew ) { $this->minoredit = true; } if ( $this->textbox1 === false ) { @@ -1064,9 +1078,11 @@ class EditPage { * @since 1.21 */ protected function getContentObject( $def_content = null ) { - global $wgOut, $wgRequest, $wgUser, $wgContLang; + global $wgContLang; $content = false; + $request = $this->context->getRequest(); + $user = $this->context->getUser(); // For message page not locally set, use the i18n message. // For other non-existent articles, use preload text if any. @@ -1079,10 +1095,10 @@ class EditPage { } if ( $content === false ) { # If requested, preload some text. - $preload = $wgRequest->getVal( 'preload', + $preload = $request->getVal( 'preload', // Custom preload text for new sections $this->section === 'new' ? 'MediaWiki:addsection-preload' : '' ); - $params = $wgRequest->getArray( 'preloadparams', [] ); + $params = $request->getArray( 'preloadparams', [] ); $content = $this->getPreloadedContent( $preload, $params ); } @@ -1090,15 +1106,15 @@ class EditPage { } else { if ( $this->section != '' ) { // Get section edit text (returns $def_text for invalid sections) - $orig = $this->getOriginalContent( $wgUser ); + $orig = $this->getOriginalContent( $user ); $content = $orig ? $orig->getSection( $this->section ) : null; if ( !$content ) { $content = $def_content; } } else { - $undoafter = $wgRequest->getInt( 'undoafter' ); - $undo = $wgRequest->getInt( 'undo' ); + $undoafter = $request->getInt( 'undoafter' ); + $undo = $request->getInt( 'undo' ); if ( $undo > 0 && $undoafter > 0 ) { $undorev = Revision::newFromId( $undo ); @@ -1118,8 +1134,8 @@ class EditPage { $undoMsg = 'failure'; } else { $oldContent = $this->page->getContent( Revision::RAW ); - $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang ); - $newContent = $content->preSaveTransform( $this->mTitle, $wgUser, $popts ); + $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang ); + $newContent = $content->preSaveTransform( $this->mTitle, $user, $popts ); if ( $newContent->equals( $oldContent ) ) { # Tell the user that the undo results in no change, @@ -1166,12 +1182,13 @@ class EditPage { // Messages: undo-success, undo-failure, undo-norev, undo-nochange $class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}"; - $this->editFormPageTop .= $wgOut->parse( "
" . + $this->editFormPageTop .= $this->context->getOutput()->parse( + "
" . wfMessage( 'undo-' . $undoMsg )->plain() . '
', true, /* interface */true ); } if ( $content === false ) { - $content = $this->getOriginalContent( $wgUser ); + $content = $this->getOriginalContent( $user ); } } } @@ -1368,10 +1385,10 @@ class EditPage { * @private */ function tokenOk( &$request ) { - global $wgUser; $token = $request->getVal( 'wpEditToken' ); - $this->mTokenOk = $wgUser->matchEditToken( $token ); - $this->mTokenOkExceptSuffix = $wgUser->matchEditTokenNoSuffix( $token ); + $user = $this->context->getUser(); + $this->mTokenOk = $user->matchEditToken( $token ); + $this->mTokenOkExceptSuffix = $user->matchEditTokenNoSuffix( $token ); return $this->mTokenOk; } @@ -1402,7 +1419,7 @@ class EditPage { $val = 'restored'; } - $response = RequestContext::getMain()->getRequest()->response(); + $response = $this->context->getRequest()->response(); $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, [ 'httpOnly' => false, ] ); @@ -1410,15 +1427,13 @@ class EditPage { /** * Attempt submission - * @param array $resultDetails See docs for $result in internalAttemptSave + * @param array|bool $resultDetails See docs for $result in internalAttemptSave * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError * @return Status The resulting status object. */ public function attemptSave( &$resultDetails = false ) { - global $wgUser; - # Allow bots to exempt some edits from bot flagging - $bot = $wgUser->isAllowed( 'bot' ) && $this->bot; + $bot = $this->context->getUser()->isAllowed( 'bot' ) && $this->bot; $status = $this->internalAttemptSave( $resultDetails, $bot ); Hooks::run( 'EditPage::attemptSave:after', [ $this, $status, $resultDetails ] ); @@ -1436,8 +1451,6 @@ class EditPage { * @return bool False, if output is done, true if rest of the form should be displayed */ private function handleStatus( Status $status, $resultDetails ) { - global $wgUser, $wgOut; - /** * @todo FIXME: once the interface for internalAttemptSave() is made * nicer, this should use the message in $status @@ -1451,9 +1464,11 @@ class EditPage { } } + $out = $this->context->getOutput(); + // "wpExtraQueryRedirect" is a hidden input to modify // after save URL and is not used by actual edit form - $request = RequestContext::getMain()->getRequest(); + $request = $this->context->getRequest(); $extraQueryRedirect = $request->getVal( 'wpExtraQueryRedirect' ); switch ( $status->value ) { @@ -1474,7 +1489,7 @@ class EditPage { case self::AS_CANNOT_USE_CUSTOM_MODEL: case self::AS_PARSE_ERROR: - $wgOut->addWikiText( '
' . "\n" . $status->getWikiText() . '
' ); + $out->addWikiText( '
' . "\n" . $status->getWikiText() . '
' ); return true; case self::AS_SUCCESS_NEW_ARTICLE: @@ -1487,7 +1502,7 @@ class EditPage { } } $anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : ''; - $wgOut->redirect( $this->mTitle->getFullURL( $query ) . $anchor ); + $out->redirect( $this->mTitle->getFullURL( $query ) . $anchor ); return false; case self::AS_SUCCESS_UPDATE: @@ -1515,7 +1530,7 @@ class EditPage { } } - $wgOut->redirect( $this->mTitle->getFullURL( $extraQuery ) . $sectionanchor ); + $out->redirect( $this->mTitle->getFullURL( $extraQuery ) . $sectionanchor ); return false; case self::AS_SPAM_ERROR: @@ -1523,7 +1538,7 @@ class EditPage { return false; case self::AS_BLOCKED_PAGE_FOR_USER: - throw new UserBlockedError( $wgUser->getBlock() ); + throw new UserBlockedError( $this->context->getUser()->getBlock() ); case self::AS_IMAGE_REDIRECT_ANON: case self::AS_IMAGE_REDIRECT_LOGGED: @@ -1584,7 +1599,7 @@ class EditPage { // Run new style post-section-merge edit filter if ( !Hooks::run( 'EditFilterMergedContent', - [ $this->mArticle->getContext(), $content, $status, $this->summary, + [ $this->context, $content, $status, $this->summary, $user, $this->minoredit ] ) ) { # Error messages etc. could be handled within the hook... @@ -1669,10 +1684,11 @@ class EditPage { * time. */ function internalAttemptSave( &$result, $bot = false ) { - global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize; - global $wgContentHandlerUseDB; + global $wgParser, $wgMaxArticleSize, $wgContentHandlerUseDB; $status = Status::newGood(); + $user = $this->context->getUser(); + $request = $this->context->getRequest(); if ( !Hooks::run( 'EditPage::attemptSave', [ $this ] ) ) { wfDebug( "Hook 'EditPage::attemptSave' aborted article saving\n" ); @@ -1681,11 +1697,11 @@ class EditPage { return $status; } - $spam = $wgRequest->getText( 'wpAntispam' ); + $spam = $request->getText( 'wpAntispam' ); if ( $spam !== '' ) { wfDebugLog( 'SimpleAntiSpam', - $wgUser->getName() . + $user->getName() . ' editing "' . $this->mTitle->getPrefixedText() . '" submitted bogus field "' . @@ -1714,9 +1730,9 @@ class EditPage { # Check image redirect if ( $this->mTitle->getNamespace() == NS_FILE && $textbox_content->isRedirect() && - !$wgUser->isAllowed( 'upload' ) + !$user->isAllowed( 'upload' ) ) { - $code = $wgUser->isAnon() ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED; + $code = $user->isAnon() ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED; $status->setResult( false, $code ); return $status; @@ -1741,7 +1757,7 @@ class EditPage { } if ( $match !== false ) { $result['spam'] = $match; - $ip = $wgRequest->getIP(); + $ip = $request->getIP(); $pdbk = $this->mTitle->getPrefixedDBkey(); $match = str_replace( "\n", '', $match ); wfDebugLog( 'SpamRegex', "$ip spam regex hit [[$pdbk]]: \"$match\"" ); @@ -1764,10 +1780,10 @@ class EditPage { return $status; } - if ( $wgUser->isBlockedFrom( $this->mTitle, false ) ) { + if ( $user->isBlockedFrom( $this->mTitle, false ) ) { // Auto-block user's IP if the account was "hard" blocked if ( !wfReadOnly() ) { - $wgUser->spreadAnyEditBlock(); + $user->spreadAnyEditBlock(); } # Check block state against master, thus 'false'. $status->setResult( false, self::AS_BLOCKED_PAGE_FOR_USER ); @@ -1782,8 +1798,8 @@ class EditPage { return $status; } - if ( !$wgUser->isAllowed( 'edit' ) ) { - if ( $wgUser->isAnon() ) { + if ( !$user->isAllowed( 'edit' ) ) { + if ( $user->isAnon() ) { $status->setResult( false, self::AS_READ_ONLY_PAGE_ANON ); return $status; } else { @@ -1799,7 +1815,7 @@ class EditPage { $status->fatal( 'editpage-cannot-use-custom-model' ); $status->value = self::AS_CANNOT_USE_CUSTOM_MODEL; return $status; - } elseif ( !$wgUser->isAllowed( 'editcontentmodel' ) ) { + } elseif ( !$user->isAllowed( 'editcontentmodel' ) ) { $status->setResult( false, self::AS_NO_CHANGE_CONTENT_MODEL ); return $status; @@ -1810,7 +1826,7 @@ class EditPage { if ( $this->changeTags ) { $changeTagsStatus = ChangeTags::canAddTagsAccompanyingChange( - $this->changeTags, $wgUser ); + $this->changeTags, $user ); if ( !$changeTagsStatus->isOK() ) { $changeTagsStatus->value = self::AS_CHANGE_TAG_ERROR; return $changeTagsStatus; @@ -1822,7 +1838,7 @@ class EditPage { $status->value = self::AS_READ_ONLY_PAGE; return $status; } - if ( $wgUser->pingLimiter() || $wgUser->pingLimiter( 'linkpurge', 0 ) ) { + if ( $user->pingLimiter() || $user->pingLimiter( 'linkpurge', 0 ) ) { $status->fatal( 'actionthrottledtext' ); $status->value = self::AS_RATE_LIMITED; return $status; @@ -1842,7 +1858,7 @@ class EditPage { if ( $new ) { // Late check for create permission, just in case *PARANOIA* - if ( !$this->mTitle->userCan( 'create', $wgUser ) ) { + if ( !$this->mTitle->userCan( 'create', $user ) ) { $status->fatal( 'nocreatetext' ); $status->value = self::AS_NO_CREATE_PERMISSION; wfDebug( __METHOD__ . ": no create permission\n" ); @@ -1866,7 +1882,7 @@ class EditPage { return $status; } - if ( !$this->runPostMergeFilters( $textbox_content, $status, $wgUser ) ) { + if ( !$this->runPostMergeFilters( $textbox_content, $status, $user ) ) { return $status; } @@ -1902,7 +1918,7 @@ class EditPage { ) { $this->isConflict = true; if ( $this->section == 'new' ) { - if ( $this->page->getUserText() == $wgUser->getName() && + if ( $this->page->getUserText() == $user->getName() && $this->page->getComment() == $this->newSectionSummary() ) { // Probably a duplicate submission of a new comment. @@ -1918,7 +1934,7 @@ class EditPage { } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER, $this->mTitle->getArticleID(), - $wgUser->getId(), $this->edittime + $user->getId(), $this->edittime ) ) { # Suppress edit conflict with self, except for section edits where merging is required. @@ -1988,7 +2004,7 @@ class EditPage { return $status; } - if ( !$this->runPostMergeFilters( $content, $status, $wgUser ) ) { + if ( !$this->runPostMergeFilters( $content, $status, $user ) ) { return $status; } @@ -2009,7 +2025,7 @@ class EditPage { return $status; } } elseif ( !$this->allowBlankSummary - && !$content->equals( $this->getOriginalContent( $wgUser ) ) + && !$content->equals( $this->getOriginalContent( $user ) ) && !$content->isRedirect() && md5( $this->summary ) == $this->autoSumm ) { @@ -2079,7 +2095,7 @@ class EditPage { $this->summary, $flags, false, - $wgUser, + $user, $content->getDefaultFormat(), $this->changeTags ); @@ -2102,7 +2118,7 @@ class EditPage { $result['nullEdit'] = $doEditStatus->hasMessage( 'edit-no-change' ); if ( $result['nullEdit'] ) { // We don't know if it was a null edit until now, so increment here - $wgUser->pingLimiter( 'linkpurge' ); + $user->pingLimiter( 'linkpurge' ); } $result['redirect'] = $content->isRedirect(); @@ -2111,7 +2127,7 @@ class EditPage { // If the content model changed, add a log entry if ( $changingContentModel ) { $this->addContentModelChangeLogEntry( - $wgUser, + $user, $new ? false : $oldContentModel, $this->contentModel, $this->summary @@ -2145,13 +2161,12 @@ class EditPage { * Register the change of watch status */ protected function updateWatchlist() { - global $wgUser; + $user = $this->context->getUser(); - if ( !$wgUser->isLoggedIn() ) { + if ( !$user->isLoggedIn() ) { return; } - $user = $wgUser; $title = $this->mTitle; $watch = $this->watchthis; // Do this in its own transaction to reduce contention... @@ -2266,29 +2281,32 @@ class EditPage { } function setHeaders() { - global $wgOut, $wgUser, $wgAjaxEditStash; + global $wgAjaxEditStash; + + $out = $this->context->getOutput(); + $user = $this->context->getUser(); - $wgOut->addModules( 'mediawiki.action.edit' ); - $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' ); + $out->addModules( 'mediawiki.action.edit' ); + $out->addModuleStyles( 'mediawiki.action.edit.styles' ); - if ( $wgUser->getOption( 'showtoolbar' ) ) { + if ( $user->getOption( 'showtoolbar' ) ) { // The addition of default buttons is handled by getEditToolbar() which // has its own dependency on this module. The call here ensures the module // is loaded in time (it has position "top") for other modules to register // buttons (e.g. extensions, gadgets, user scripts). - $wgOut->addModules( 'mediawiki.toolbar' ); + $out->addModules( 'mediawiki.toolbar' ); } - if ( $wgUser->getOption( 'uselivepreview' ) ) { - $wgOut->addModules( 'mediawiki.action.edit.preview' ); + if ( $user->getOption( 'uselivepreview' ) ) { + $out->addModules( 'mediawiki.action.edit.preview' ); } - if ( $wgUser->getOption( 'useeditwarning' ) ) { - $wgOut->addModules( 'mediawiki.action.edit.editWarning' ); + if ( $user->getOption( 'useeditwarning' ) ) { + $out->addModules( 'mediawiki.action.edit.editWarning' ); } # Enabled article-related sidebar, toplinks, etc. - $wgOut->setArticleRelated( true ); + $out->setArticleRelated( true ); $contextTitle = $this->getContextTitle(); if ( $this->isConflict ) { @@ -2311,10 +2329,10 @@ class EditPage { if ( $displayTitle === false ) { $displayTitle = $contextTitle->getPrefixedText(); } - $wgOut->setPageTitle( wfMessage( $msg, $displayTitle ) ); + $out->setPageTitle( wfMessage( $msg, $displayTitle ) ); # Transmit the name of the message to JavaScript for live preview # Keep Resources.php/mediawiki.action.edit.preview in sync with the possible keys - $wgOut->addJsConfigVars( [ + $out->addJsConfigVars( [ 'wgEditMessage' => $msg, 'wgAjaxEditStash' => $wgAjaxEditStash, ] ); @@ -2324,16 +2342,16 @@ class EditPage { * Show all applicable editing introductions */ protected function showIntro() { - global $wgOut, $wgUser; if ( $this->suppressIntro ) { return; } + $out = $this->context->getOutput(); $namespace = $this->mTitle->getNamespace(); if ( $namespace == NS_MEDIAWIKI ) { # Show a warning if editing an interface message - $wgOut->wrapWikiMsg( "
\n$1\n
", 'editinginterface' ); + $out->wrapWikiMsg( "
\n$1\n
", 'editinginterface' ); # If this is a default message (but not css or js), # show a hint that it is translatable on translatewiki.net if ( !$this->mTitle->hasContentModel( CONTENT_MODEL_CSS ) @@ -2341,7 +2359,7 @@ class EditPage { ) { $defaultMessageText = $this->mTitle->getDefaultMessageText(); if ( $defaultMessageText !== false ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", + $out->wrapWikiMsg( "
\n$1\n
", 'translateinterface' ); } } @@ -2353,11 +2371,11 @@ class EditPage { # there must be a description url to show a hint to shared repo if ( $descUrl ) { if ( !$this->mTitle->exists() ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", [ + $out->wrapWikiMsg( "
\n$1\n
", [ 'sharedupload-desc-create', $file->getRepo()->getDisplayName(), $descUrl ] ); } else { - $wgOut->wrapWikiMsg( "
\n$1\n
", [ + $out->wrapWikiMsg( "
\n$1\n
", [ 'sharedupload-desc-edit', $file->getRepo()->getDisplayName(), $descUrl ] ); } @@ -2373,12 +2391,12 @@ class EditPage { $ip = User::isIP( $username ); $block = Block::newFromTarget( $user, $user ); if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist - $wgOut->wrapWikiMsg( "
\n$1\n
", + $out->wrapWikiMsg( "
\n$1\n
", [ 'userpage-userdoesnotexist', wfEscapeWikiText( $username ) ] ); } elseif ( !is_null( $block ) && $block->getType() != Block::TYPE_AUTO ) { # Show log extract if the user is currently blocked LogEventsList::showLogExtract( - $wgOut, + $out, 'block', MWNamespace::getCanonicalName( NS_USER ) . ':' . $block->getTarget(), '', @@ -2398,8 +2416,8 @@ class EditPage { $helpLink = wfExpandUrl( Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() ) ); - if ( $wgUser->isLoggedIn() ) { - $wgOut->wrapWikiMsg( + if ( $this->context->getUser()->isLoggedIn() ) { + $out->wrapWikiMsg( // Suppress the external link icon, consider the help url an internal one "
\n$1\n
", [ @@ -2408,7 +2426,7 @@ class EditPage { ] ); } else { - $wgOut->wrapWikiMsg( + $out->wrapWikiMsg( // Suppress the external link icon, consider the help url an internal one "
\n$1\n
", [ @@ -2420,7 +2438,7 @@ class EditPage { } # Give a notice if the user is editing a deleted/moved page... if ( !$this->mTitle->exists() ) { - LogEventsList::showLogExtract( $wgOut, [ 'delete', 'move' ], $this->mTitle, + LogEventsList::showLogExtract( $out, [ 'delete', 'move' ], $this->mTitle, '', [ 'lim' => 10, @@ -2441,9 +2459,8 @@ class EditPage { if ( $this->editintro ) { $title = Title::newFromText( $this->editintro ); if ( $title instanceof Title && $title->exists() && $title->userCan( 'read' ) ) { - global $wgOut; // Added using template syntax, to take 's into account. - $wgOut->addWikiTextTitleTidy( + $this->context->getOutput()->addWikiTextTitleTidy( '
{{:' . $title->getFullText() . '}}
', $this->mTitle ); @@ -2493,7 +2510,7 @@ class EditPage { * content. * * @param string|null|bool $text Text to unserialize - * @return Content The content object created from $text. If $text was false + * @return Content|bool|null The content object created from $text. If $text was false * or null, false resp. null will be returned instead. * * @throws MWException If unserializing the text results in a Content @@ -2525,8 +2542,6 @@ class EditPage { * use the EditPage::showEditForm:fields hook instead. */ function showEditForm( $formCallback = null ) { - global $wgOut, $wgUser; - # need to parse the preview early so that we know which templates are used, # otherwise users with "show preview after edit box" will get a blank list # we parse this near the beginning so that setHeaders can do the title @@ -2536,7 +2551,8 @@ class EditPage { $previewOutput = $this->getPreviewText(); } - Hooks::run( 'EditPage::showEditForm:initial', [ &$this, &$wgOut ] ); + $out = $this->context->getOutput(); + Hooks::run( 'EditPage::showEditForm:initial', [ &$this, &$out ] ); $this->setHeaders(); @@ -2544,13 +2560,14 @@ class EditPage { return; } - $wgOut->addHTML( $this->editFormPageTop ); + $out->addHTML( $this->editFormPageTop ); - if ( $wgUser->getOption( 'previewontop' ) ) { + $user = $this->context->getUser(); + if ( $user->getOption( 'previewontop' ) ) { $this->displayPreviewArea( $previewOutput, true ); } - $wgOut->addHTML( $this->editFormTextTop ); + $out->addHTML( $this->editFormTextTop ); $showToolbar = true; if ( $this->wasDeletedSinceLastEdit() ) { @@ -2559,14 +2576,14 @@ class EditPage { // Add an confirmation checkbox and explanation. $showToolbar = false; } else { - $wgOut->wrapWikiMsg( "
\n$1\n
", + $out->wrapWikiMsg( "
\n$1\n
", 'deletedwhileediting' ); } } // @todo add EditForm plugin interface and use it here! // search for textarea1 and textares2, and allow EditForm to override all uses. - $wgOut->addHTML( Html::openElement( + $out->addHTML( Html::openElement( 'form', [ 'id' => self::EDITFORM_ID, @@ -2579,11 +2596,11 @@ class EditPage { if ( is_callable( $formCallback ) ) { wfWarn( 'The $formCallback parameter to ' . __METHOD__ . 'is deprecated' ); - call_user_func_array( $formCallback, [ &$wgOut ] ); + call_user_func_array( $formCallback, [ &$out ] ); } // Add an empty field to trip up spambots - $wgOut->addHTML( + $out->addHTML( Xml::openElement( 'div', [ 'id' => 'antispam-container', 'style' => 'display: none;' ] ) . Html::rawElement( 'label', @@ -2602,7 +2619,7 @@ class EditPage { . Xml::closeElement( 'div' ) ); - Hooks::run( 'EditPage::showEditForm:fields', [ &$this, &$wgOut ] ); + Hooks::run( 'EditPage::showEditForm:fields', [ &$this, &$out ] ); // Put these up at the top to ensure they aren't lost on early form submission $this->showFormBeforeText(); @@ -2616,7 +2633,7 @@ class EditPage { $key = $comment === '' ? 'confirmrecreate-noreason' : 'confirmrecreate'; - $wgOut->addHTML( + $out->addHTML( '
' . wfMessage( $key, $username, "$comment" )->parse() . Xml::checkLabel( wfMessage( 'recreate' )->text(), 'wpRecreate', 'wpRecreate', false, @@ -2628,7 +2645,7 @@ class EditPage { # When the summary is hidden, also hide them on preview/show changes if ( $this->nosummary ) { - $wgOut->addHTML( Html::hidden( 'nosummary', true ) ); + $out->addHTML( Html::hidden( 'nosummary', true ) ); } # If a blank edit summary was previously provided, and the appropriate @@ -2639,15 +2656,15 @@ class EditPage { # For a bit more sophisticated detection of blank summaries, hash the # automatic one and pass that in the hidden field wpAutoSummary. if ( $this->missingSummary || ( $this->section == 'new' && $this->nosummary ) ) { - $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) ); + $out->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) ); } if ( $this->undidRev ) { - $wgOut->addHTML( Html::hidden( 'wpUndidRevision', $this->undidRev ) ); + $out->addHTML( Html::hidden( 'wpUndidRevision', $this->undidRev ) ); } if ( $this->selfRedirect ) { - $wgOut->addHTML( Html::hidden( 'wpIgnoreSelfRedirect', true ) ); + $out->addHTML( Html::hidden( 'wpIgnoreSelfRedirect', true ) ); } if ( $this->hasPresetSummary ) { @@ -2658,27 +2675,27 @@ class EditPage { } $autosumm = $this->autoSumm ? $this->autoSumm : md5( $this->summary ); - $wgOut->addHTML( Html::hidden( 'wpAutoSummary', $autosumm ) ); + $out->addHTML( Html::hidden( 'wpAutoSummary', $autosumm ) ); - $wgOut->addHTML( Html::hidden( 'oldid', $this->oldid ) ); - $wgOut->addHTML( Html::hidden( 'parentRevId', $this->getParentRevId() ) ); + $out->addHTML( Html::hidden( 'oldid', $this->oldid ) ); + $out->addHTML( Html::hidden( 'parentRevId', $this->getParentRevId() ) ); - $wgOut->addHTML( Html::hidden( 'format', $this->contentFormat ) ); - $wgOut->addHTML( Html::hidden( 'model', $this->contentModel ) ); + $out->addHTML( Html::hidden( 'format', $this->contentFormat ) ); + $out->addHTML( Html::hidden( 'model', $this->contentModel ) ); if ( $this->section == 'new' ) { $this->showSummaryInput( true, $this->summary ); - $wgOut->addHTML( $this->getSummaryPreview( true, $this->summary ) ); + $out->addHTML( $this->getSummaryPreview( true, $this->summary ) ); } - $wgOut->addHTML( $this->editFormTextBeforeContent ); + $out->addHTML( $this->editFormTextBeforeContent ); - if ( !$this->isCssJsSubpage && $showToolbar && $wgUser->getOption( 'showtoolbar' ) ) { - $wgOut->addHTML( EditPage::getEditToolbar( $this->mTitle ) ); + if ( !$this->isCssJsSubpage && $showToolbar && $user->getOption( 'showtoolbar' ) ) { + $out->addHTML( EditPage::getEditToolbar( $this->mTitle ) ); } if ( $this->blankArticle ) { - $wgOut->addHTML( Html::hidden( 'wpIgnoreBlankArticle', true ) ); + $out->addHTML( Html::hidden( 'wpIgnoreBlankArticle', true ) ); } if ( $this->isConflict ) { @@ -2696,7 +2713,7 @@ class EditPage { $this->showContentForm(); } - $wgOut->addHTML( $this->editFormTextAfterContent ); + $out->addHTML( $this->editFormTextAfterContent ); $this->showStandardInputs(); @@ -2706,19 +2723,19 @@ class EditPage { $this->showEditTools(); - $wgOut->addHTML( $this->editFormTextAfterTools . "\n" ); + $out->addHTML( $this->editFormTextAfterTools . "\n" ); - $wgOut->addHTML( Html::rawElement( 'div', [ 'class' => 'templatesUsed' ], + $out->addHTML( Html::rawElement( 'div', [ 'class' => 'templatesUsed' ], Linker::formatTemplates( $this->getTemplates(), $this->preview, $this->section != '' ) ) ); - $wgOut->addHTML( Html::rawElement( 'div', [ 'class' => 'hiddencats' ], + $out->addHTML( Html::rawElement( 'div', [ 'class' => 'hiddencats' ], Linker::formatHiddenCategories( $this->page->getHiddenCategories() ) ) ); if ( $this->mParserOutput ) { - $wgOut->setLimitReportData( $this->mParserOutput->getLimitReportData() ); + $out->setLimitReportData( $this->mParserOutput->getLimitReportData() ); } - $wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' ); + $out->addModules( 'mediawiki.action.edit.collapsibleFooter' ); if ( $this->isConflict ) { try { @@ -2731,7 +2748,7 @@ class EditPage { $this->contentFormat, $ex->getMessage() ); - $wgOut->addWikiText( '
' . $msg->text() . '
' ); + $out->addWikiText( '
' . $msg->text() . '
' ); } } @@ -2745,14 +2762,14 @@ class EditPage { } else { $mode = 'text'; } - $wgOut->addHTML( Html::hidden( 'mode', $mode, [ 'id' => 'mw-edit-mode' ] ) ); + $out->addHTML( Html::hidden( 'mode', $mode, [ 'id' => 'mw-edit-mode' ] ) ); // Marker for detecting truncated form data. This must be the last // parameter sent in order to be of use, so do not move me. - $wgOut->addHTML( Html::hidden( 'wpUltimateParam', true ) ); - $wgOut->addHTML( $this->editFormTextBottom . "\n\n" ); + $out->addHTML( Html::hidden( 'wpUltimateParam', true ) ); + $out->addHTML( $this->editFormTextBottom . "\n\n" ); - if ( !$wgUser->getOption( 'previewontop' ) ) { + if ( !$user->getOption( 'previewontop' ) ) { $this->displayPreviewArea( $previewOutput, false ); } @@ -2778,21 +2795,23 @@ class EditPage { * @return bool */ protected function showHeader() { - global $wgOut, $wgUser, $wgMaxArticleSize, $wgLang; - global $wgAllowUserCss, $wgAllowUserJs; + global $wgMaxArticleSize, $wgAllowUserCss, $wgAllowUserJs; + + $out = $this->context->getOutput(); + $user = $this->context->getUser(); if ( $this->mTitle->isTalkPage() ) { - $wgOut->addWikiMsg( 'talkpagetext' ); + $out->addWikiMsg( 'talkpagetext' ); } // Add edit notices $editNotices = $this->mTitle->getEditNotices( $this->oldid ); if ( count( $editNotices ) ) { - $wgOut->addHTML( implode( "\n", $editNotices ) ); + $out->addHTML( implode( "\n", $editNotices ) ); } else { $msg = wfMessage( 'editnotice-notext' ); if ( !$msg->isDisabled() ) { - $wgOut->addHTML( + $out->addHTML( '
' . $msg->parseAsBlock() . '
' @@ -2801,14 +2820,14 @@ class EditPage { } if ( $this->isConflict ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", 'explainconflict' ); + $out->wrapWikiMsg( "
\n$1\n
", 'explainconflict' ); $this->editRevId = $this->page->getLatest(); } else { if ( $this->section != '' && !$this->isSectionEditSupported() ) { // We use $this->section to much before this and getVal('wgSection') directly in other places // at this point we can't reset $this->section to '' to fallback to non-section editing. // Someone is welcome to try refactoring though - $wgOut->showErrorPage( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' ); + $out->showErrorPage( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' ); return false; } @@ -2822,31 +2841,31 @@ class EditPage { } if ( $this->missingComment ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", 'missingcommenttext' ); + $out->wrapWikiMsg( "
\n$1\n
", 'missingcommenttext' ); } if ( $this->missingSummary && $this->section != 'new' ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", 'missingsummary' ); + $out->wrapWikiMsg( "
\n$1\n
", 'missingsummary' ); } if ( $this->missingSummary && $this->section == 'new' ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", 'missingcommentheader' ); + $out->wrapWikiMsg( "
\n$1\n
", 'missingcommentheader' ); } if ( $this->blankArticle ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", 'blankarticle' ); + $out->wrapWikiMsg( "
\n$1\n
", 'blankarticle' ); } if ( $this->selfRedirect ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", 'selfredirect' ); + $out->wrapWikiMsg( "
\n$1\n
", 'selfredirect' ); } if ( $this->hookError !== '' ) { - $wgOut->addWikiText( $this->hookError ); + $out->addWikiText( $this->hookError ); } if ( !$this->checkUnicodeCompliantBrowser() ) { - $wgOut->addWikiMsg( 'nonunicodebrowser' ); + $out->addWikiMsg( 'nonunicodebrowser' ); } if ( $this->section != 'new' ) { @@ -2854,13 +2873,13 @@ class EditPage { if ( $revision ) { // Let sysop know that this will make private content public if saved - if ( !$revision->userCan( Revision::DELETED_TEXT, $wgUser ) ) { - $wgOut->wrapWikiMsg( + if ( !$revision->userCan( Revision::DELETED_TEXT, $user ) ) { + $out->wrapWikiMsg( "\n", 'rev-deleted-text-permission' ); } elseif ( $revision->isDeleted( Revision::DELETED_TEXT ) ) { - $wgOut->wrapWikiMsg( + $out->wrapWikiMsg( "\n", 'rev-deleted-text-view' ); @@ -2868,25 +2887,25 @@ class EditPage { if ( !$revision->isCurrent() ) { $this->mArticle->setOldSubtitle( $revision->getId() ); - $wgOut->addWikiMsg( 'editingold' ); + $out->addWikiMsg( 'editingold' ); } } elseif ( $this->mTitle->exists() ) { // Something went wrong - $wgOut->wrapWikiMsg( "
\n$1\n
\n", + $out->wrapWikiMsg( "
\n$1\n
\n", [ 'missing-revision', $this->oldid ] ); } } } if ( wfReadOnly() ) { - $wgOut->wrapWikiMsg( + $out->wrapWikiMsg( "
\n$1\n
", [ 'readonlywarning', wfReadOnlyReason() ] ); - } elseif ( $wgUser->isAnon() ) { + } elseif ( $user->isAnon() ) { if ( $this->formtype != 'preview' ) { - $wgOut->wrapWikiMsg( + $out->wrapWikiMsg( "
\n$1\n
", [ 'anoneditwarning', // Log-in link @@ -2900,7 +2919,7 @@ class EditPage { ] ); } else { - $wgOut->wrapWikiMsg( "
\n$1
", + $out->wrapWikiMsg( "
\n$1
", 'anonpreviewwarning' ); } @@ -2908,22 +2927,25 @@ class EditPage { if ( $this->isCssJsSubpage ) { # Check the skin exists if ( $this->isWrongCaseCssJsPage ) { - $wgOut->wrapWikiMsg( + $out->wrapWikiMsg( "
\n$1\n
", [ 'userinvalidcssjstitle', $this->mTitle->getSkinFromCssJsSubpage() ] ); } - if ( $this->getTitle()->isSubpageOf( $wgUser->getUserPage() ) ) { + if ( $this->getTitle()->isSubpageOf( $user->getUserPage() ) ) { + $out->wrapWikiMsg( '
$1
', + $this->isCssSubpage ? 'usercssispublic' : 'userjsispublic' + ); if ( $this->formtype !== 'preview' ) { if ( $this->isCssSubpage && $wgAllowUserCss ) { - $wgOut->wrapWikiMsg( + $out->wrapWikiMsg( "
\n$1\n
", [ 'usercssyoucanpreview' ] ); } if ( $this->isJsSubpage && $wgAllowUserJs ) { - $wgOut->wrapWikiMsg( + $out->wrapWikiMsg( "
\n$1\n
", [ 'userjsyoucanpreview' ] ); @@ -2943,7 +2965,7 @@ class EditPage { # Then it must be protected based on static groups (regular) $noticeMsg = 'protectedpagewarning'; } - LogEventsList::showLogExtract( $wgOut, 'protect', $this->mTitle, '', + LogEventsList::showLogExtract( $out, 'protect', $this->mTitle, '', [ 'lim' => 1, 'msgKey' => [ $noticeMsg ] ] ); } if ( $this->mTitle->isCascadeProtected() ) { @@ -2959,10 +2981,10 @@ class EditPage { } } $notice .= '
'; - $wgOut->wrapWikiMsg( $notice, [ 'cascadeprotectedwarning', $cascadeSourcesCount ] ); + $out->wrapWikiMsg( $notice, [ 'cascadeprotectedwarning', $cascadeSourcesCount ] ); } if ( !$this->mTitle->exists() && $this->mTitle->getRestrictions( 'create' ) ) { - LogEventsList::showLogExtract( $wgOut, 'protect', $this->mTitle, '', + LogEventsList::showLogExtract( $out, 'protect', $this->mTitle, '', [ 'lim' => 1, 'showIfEmpty' => false, 'msgKey' => [ 'titleprotectedwarning' ], @@ -2973,20 +2995,21 @@ class EditPage { $this->contentLength = strlen( $this->textbox1 ); } + $lang = $this->context->getLanguage(); if ( $this->tooBig || $this->contentLength > $wgMaxArticleSize * 1024 ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", + $out->wrapWikiMsg( "
\n$1\n
", [ 'longpageerror', - $wgLang->formatNum( round( $this->contentLength / 1024, 3 ) ), - $wgLang->formatNum( $wgMaxArticleSize ) + $lang->formatNum( round( $this->contentLength / 1024, 3 ) ), + $lang->formatNum( $wgMaxArticleSize ) ] ); } else { if ( !wfMessage( 'longpage-hint' )->isDisabled() ) { - $wgOut->wrapWikiMsg( "
\n$1\n
", + $out->wrapWikiMsg( "
\n$1\n
", [ 'longpage-hint', - $wgLang->formatSize( strlen( $this->textbox1 ) ), + $lang->formatSize( strlen( $this->textbox1 ) ), strlen( $this->textbox1 ) ] ); @@ -3051,7 +3074,6 @@ class EditPage { * @param string $summary The text of the summary to display */ protected function showSummaryInput( $isSubjectPreview, $summary = "" ) { - global $wgOut; # Add a class if 'missingsummary' is triggered to allow styling of the summary line $summaryClass = $this->missingSummary ? 'mw-summarymissed' : 'mw-summary'; if ( $isSubjectPreview ) { @@ -3070,7 +3092,7 @@ class EditPage { [ 'class' => $summaryClass ], [] ); - $wgOut->addHTML( "{$label} {$input}" ); + $this->context->getOutput()->addHTML( "{$label} {$input}" ); } /** @@ -3102,9 +3124,9 @@ class EditPage { } protected function showFormBeforeText() { - global $wgOut; $section = htmlspecialchars( $this->section ); - $wgOut->addHTML( <<context->getOutput(); + $out->addHTML( << @@ -3114,12 +3136,11 @@ class EditPage { HTML ); if ( !$this->checkUnicodeCompliantBrowser() ) { - $wgOut->addHTML( Html::hidden( 'safemode', '1' ) ); + $out->addHTML( Html::hidden( 'safemode', '1' ) ); } } protected function showFormAfterText() { - global $wgOut, $wgUser; /** * To make it harder for someone to slip a user a page * which submits an edit form to the wiki without their @@ -3132,7 +3153,10 @@ HTML * include the constant suffix to prevent editing from * broken text-mangling proxies. */ - $wgOut->addHTML( "\n" . Html::hidden( "wpEditToken", $wgUser->getEditToken() ) . "\n" ); + $token = $this->context->getUser()->getEditToken(); + $this->context->getOutput()->addHTML( + "\n" . Html::hidden( "wpEditToken", $token ) . "\n" + ); } /** @@ -3202,8 +3226,6 @@ HTML } protected function showTextbox( $text, $name, $customAttribs = [] ) { - global $wgOut, $wgUser; - $wikitext = $this->safeUnicodeOutput( $text ); if ( strval( $wikitext ) !== '' ) { // Ensure there's a newline at the end, otherwise adding lines @@ -3213,11 +3235,12 @@ HTML $wikitext .= "\n"; } + $user = $this->context->getUser(); $attribs = $customAttribs + [ 'accesskey' => ',', 'id' => $name, - 'cols' => $wgUser->getIntOption( 'cols' ), - 'rows' => $wgUser->getIntOption( 'rows' ), + 'cols' => $user->getIntOption( 'cols' ), + 'rows' => $user->getIntOption( 'rows' ), // Avoid PHP notices when appending preferences // (appending allows customAttribs['style'] to still work). 'style' => '' @@ -3227,11 +3250,10 @@ HTML $attribs['lang'] = $pageLang->getHtmlCode(); $attribs['dir'] = $pageLang->getDir(); - $wgOut->addHTML( Html::textarea( $name, $wikitext, $attribs ) ); + $this->context->getOutput()->addHTML( Html::textarea( $name, $wikitext, $attribs ) ); } protected function displayPreviewArea( $previewOutput, $isOnTop = false ) { - global $wgOut; $classes = []; if ( $isOnTop ) { $classes[] = 'ontop'; @@ -3243,7 +3265,8 @@ HTML $attribs['style'] = 'display: none;'; } - $wgOut->addHTML( Xml::openElement( 'div', $attribs ) ); + $out = $this->context->getOutput(); + $out->addHTML( Xml::openElement( 'div', $attribs ) ); if ( $this->formtype == 'preview' ) { $this->showPreview( $previewOutput ); @@ -3252,10 +3275,10 @@ HTML $pageViewLang = $this->mTitle->getPageViewLanguage(); $attribs = [ 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(), 'class' => 'mw-content-' . $pageViewLang->getDir() ]; - $wgOut->addHTML( Html::rawElement( 'div', $attribs ) ); + $out->addHTML( Html::rawElement( 'div', $attribs ) ); } - $wgOut->addHTML( '
' ); + $out->addHTML( '' ); if ( $this->formtype == 'diff' ) { try { @@ -3267,7 +3290,7 @@ HTML $this->contentFormat, $ex->getMessage() ); - $wgOut->addWikiText( '
' . $msg->text() . '
' ); + $out->addWikiText( '
' . $msg->text() . '
' ); } } } @@ -3279,14 +3302,14 @@ HTML * @param string $text The HTML to be output for the preview. */ protected function showPreview( $text ) { - global $wgOut; if ( $this->mTitle->getNamespace() == NS_CATEGORY ) { $this->mArticle->openShowCategory(); } + $out = $this->context->getOutput(); # This hook seems slightly odd here, but makes things more # consistent for extensions. - Hooks::run( 'OutputPageBeforeHTML', [ &$wgOut, &$text ] ); - $wgOut->addHTML( $text ); + Hooks::run( 'OutputPageBeforeHTML', [ &$out, &$text ] ); + $out->addHTML( $text ); if ( $this->mTitle->getNamespace() == NS_CATEGORY ) { $this->mArticle->closeShowCategory(); } @@ -3300,7 +3323,7 @@ HTML * save and then make a comparison. */ function showDiff() { - global $wgUser, $wgContLang, $wgOut; + global $wgContLang; $oldtitlemsg = 'currentrev'; # if message does not exist, show diff against the preloaded default @@ -3331,8 +3354,9 @@ HTML ContentHandler::runLegacyHooks( 'EditPageGetDiffText', [ $this, &$newContent ] ); Hooks::run( 'EditPageGetDiffContent', [ $this, &$newContent ] ); - $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang ); - $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts ); + $user = $this->context->getUser(); + $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang ); + $newContent = $newContent->preSaveTransform( $this->mTitle, $user, $popts ); } if ( ( $oldContent && !$oldContent->isEmpty() ) || ( $newContent && !$newContent->isEmpty() ) ) { @@ -3356,7 +3380,7 @@ HTML $difftext = ''; } - $wgOut->addHTML( '
' . $difftext . '
' ); + $this->context->getOutput()->addHTML( '
' . $difftext . '
' ); } /** @@ -3365,8 +3389,7 @@ HTML protected function showHeaderCopyrightWarning() { $msg = 'editpage-head-copy-warn'; if ( !wfMessage( $msg )->isDisabled() ) { - global $wgOut; - $wgOut->wrapWikiMsg( "
\n$1\n
", + $this->context->getOutput()->wrapWikiMsg( "
\n$1\n
", 'editpage-head-copy-warn' ); } } @@ -3383,16 +3406,15 @@ HTML $msg = 'editpage-tos-summary'; Hooks::run( 'EditPageTosSummary', [ $this->mTitle, &$msg ] ); if ( !wfMessage( $msg )->isDisabled() ) { - global $wgOut; - $wgOut->addHTML( '
' ); - $wgOut->addWikiMsg( $msg ); - $wgOut->addHTML( '
' ); + $out = $this->context->getOutput(); + $out->addHTML( '
' ); + $out->addWikiMsg( $msg ); + $out->addHTML( '
' ); } } protected function showEditTools() { - global $wgOut; - $wgOut->addHTML( '
' . + $this->context->getOutput()->addHTML( '
' . wfMessage( 'edittools' )->inContentLanguage()->parse() . '
' ); } @@ -3452,24 +3474,24 @@ HTML } protected function showStandardInputs( &$tabindex = 2 ) { - global $wgOut; - $wgOut->addHTML( "
\n" ); + $out = $this->context->getOutput(); + $out->addHTML( "
\n" ); if ( $this->section != 'new' ) { $this->showSummaryInput( false, $this->summary ); - $wgOut->addHTML( $this->getSummaryPreview( false, $this->summary ) ); + $out->addHTML( $this->getSummaryPreview( false, $this->summary ) ); } $checkboxes = $this->getCheckboxes( $tabindex, [ 'minor' => $this->minoredit, 'watch' => $this->watchthis ] ); - $wgOut->addHTML( "
" . implode( $checkboxes, "\n" ) . "
\n" ); + $out->addHTML( "
" . implode( $checkboxes, "\n" ) . "
\n" ); // Show copyright warning. - $wgOut->addWikiText( $this->getCopywarn() ); - $wgOut->addHTML( $this->editFormTextAfterWarn ); + $out->addWikiText( $this->getCopywarn() ); + $out->addHTML( $this->editFormTextAfterWarn ); - $wgOut->addHTML( "
\n" ); - $wgOut->addHTML( implode( $this->getEditButtons( $tabindex ), "\n" ) . "\n" ); + $out->addHTML( "
\n" ); + $out->addHTML( implode( $this->getEditButtons( $tabindex ), "\n" ) . "\n" ); $cancel = $this->getCancelLink(); if ( $cancel !== '' ) { @@ -3489,13 +3511,13 @@ HTML wfMessage( 'word-separator' )->escaped() . wfMessage( 'newwindow' )->parse(); - $wgOut->addHTML( " {$cancel}\n" ); - $wgOut->addHTML( " {$edithelp}\n" ); - $wgOut->addHTML( "
\n" ); + $out->addHTML( " {$cancel}\n" ); + $out->addHTML( " {$edithelp}\n" ); + $out->addHTML( "
\n" ); - Hooks::run( 'EditPage::showStandardInputs:options', [ $this, $wgOut, &$tabindex ] ); + Hooks::run( 'EditPage::showStandardInputs:options', [ $this, $out, &$tabindex ] ); - $wgOut->addHTML( "
\n" ); + $out->addHTML( "
\n" ); } /** @@ -3503,10 +3525,9 @@ HTML * If you want to use another entry point to this function, be careful. */ protected function showConflict() { - global $wgOut; - - if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) { - $stats = $wgOut->getContext()->getStats(); + $out = $this->context->getOutput(); + if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$out ] ) ) { + $stats = $this->context->getStats(); $stats->increment( 'edit.failures.conflict' ); // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics if ( @@ -3516,7 +3537,7 @@ HTML $stats->increment( 'edit.failures.conflict.byNamespaceId.' . $this->mTitle->getNamespace() ); } - $wgOut->wrapWikiMsg( '

$1

', "yourdiff" ); + $out->wrapWikiMsg( '

$1

', "yourdiff" ); $content1 = $this->toEditContent( $this->textbox1 ); $content2 = $this->toEditContent( $this->textbox2 ); @@ -3529,7 +3550,7 @@ HTML wfMessage( 'storedversion' )->text() ); - $wgOut->wrapWikiMsg( '

$1

', "yourtext" ); + $out->wrapWikiMsg( '

$1

', "yourtext" ); $this->showTextbox2(); } } @@ -3642,10 +3663,10 @@ HTML * @return string */ function getPreviewText() { - global $wgOut, $wgRawHtml, $wgLang; - global $wgAllowUserCss, $wgAllowUserJs; + global $wgRawHtml, $wgAllowUserCss, $wgAllowUserJs; - $stats = $wgOut->getContext()->getStats(); + $stats = $this->context->getStats(); + $out = $this->context->getOutput(); if ( $wgRawHtml && !$this->mTokenOk ) { // Could be an offsite preview attempt. This is very unsafe if @@ -3655,7 +3676,7 @@ HTML // Do not put big scary notice, if previewing the empty // string, which happens when you initially edit // a category page, due to automatic preview-on-open. - $parsedNote = $wgOut->parse( "
" . + $parsedNote = $out->parse( "
" . wfMessage( 'session_fail_preview_html' )->text() . "
", true, /* interface */true ); } $stats->increment( 'edit.failures.session_loss' ); @@ -3677,7 +3698,7 @@ HTML # provide a anchor link to the editform $continueEditing = '' . - '[[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . + '[[#' . self::EDITFORM_ID . '|' . $this->context->getLanguage()->getArrow() . ' ' . wfMessage( 'continue-editing' )->text() . ']]'; if ( $this->mTriedSave && !$this->mTokenOk ) { if ( $this->mTokenOkExceptSuffix ) { @@ -3743,7 +3764,7 @@ HTML $parserOutput = $parserResult['parserOutput']; $previewHTML = $parserResult['html']; $this->mParserOutput = $parserOutput; - $wgOut->addParserOutputMetadata( $parserOutput ); + $out->addParserOutputMetadata( $parserOutput ); if ( count( $parserOutput->getWarnings() ) ) { $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() ); @@ -3769,7 +3790,7 @@ HTML $previewhead = "
\n" . '

' . wfMessage( 'preview' )->escaped() . "

" . - $wgOut->parse( $note, true, /* interface */true ) . $conflict . "
\n"; + $out->parse( $note, true, /* interface */true ) . $conflict . "
\n"; $pageViewLang = $this->mTitle->getPageViewLanguage(); $attribs = [ 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(), @@ -3784,7 +3805,7 @@ HTML * @return ParserOptions */ protected function getPreviewParserOptions() { - $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() ); + $parserOptions = $this->page->makeParserOptions( $this->context ); $parserOptions->setIsPreview( true ); $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' ); $parserOptions->enableLimitReport(); @@ -3795,17 +3816,17 @@ HTML * Parse the page for a preview. Subclasses may override this class, in order * to parse with different options, or to otherwise modify the preview HTML. * - * @param Content @content The page content - * @return Associative array with keys: + * @param Content $content The page content + * @return array with keys: * - parserOutput: The ParserOutput object * - html: The HTML to be displayed */ protected function doPreviewParse( Content $content ) { - global $wgUser; + $user = $this->context->getUser(); $parserOptions = $this->getPreviewParserOptions(); - $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions ); + $pstContent = $content->preSaveTransform( $this->mTitle, $user, $parserOptions ); $scopedCallback = $parserOptions->setupFakeRevision( - $this->mTitle, $pstContent, $wgUser ); + $this->mTitle, $pstContent, $user ); $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions ); ScopedCallback::consume( $scopedCallback ); $parserOutput->setEditSectionTokens( false ); // no section edit links @@ -3981,15 +4002,16 @@ HTML * @return array */ public function getCheckboxes( &$tabindex, $checked ) { - global $wgUser, $wgUseMediaWikiUIEverywhere; + global $wgUseMediaWikiUIEverywhere; $checkboxes = []; + $user = $this->context->getUser(); // don't show the minor edit checkbox if it's a new page or section if ( !$this->isNew ) { $checkboxes['minor'] = ''; $minorLabel = wfMessage( 'minoredit' )->parse(); - if ( $wgUser->isAllowed( 'minoredit' ) ) { + if ( $user->isAllowed( 'minoredit' ) ) { $attribs = [ 'tabindex' => ++$tabindex, 'accesskey' => wfMessage( 'accesskey-minoredit' )->text(), @@ -4013,7 +4035,7 @@ HTML $watchLabel = wfMessage( 'watchthis' )->parse(); $checkboxes['watch'] = ''; - if ( $wgUser->isLoggedIn() ) { + if ( $user->isLoggedIn() ) { $attribs = [ 'tabindex' => ++$tabindex, 'accesskey' => wfMessage( 'accesskey-watch' )->text(), @@ -4047,13 +4069,19 @@ HTML public function getEditButtons( &$tabindex ) { $buttons = []; + $labelAsPublish = $this->mArticle->getContext()->getConfig()->get( 'EditButtonPublishNotSave' ); + if ( $labelAsPublish ) { + $buttonLabelKey = $this->isNew ? 'publishpage' : 'publishchanges'; + } else { + $buttonLabelKey = $this->isNew ? 'savearticle' : 'savechanges'; + } + $buttonLabel = wfMessage( $buttonLabelKey )->text(); $attribs = [ 'id' => 'wpSave', 'name' => 'wpSave', 'tabindex' => ++$tabindex, ] + Linker::tooltipAndAccesskeyAttribs( 'save' ); - $buttons['save'] = Html::submitButton( wfMessage( 'savearticle' )->text(), - $attribs, [ 'mw-ui-constructive' ] ); + $buttons['save'] = Html::submitButton( $buttonLabel, $attribs, [ 'mw-ui-constructive' ] ); ++$tabindex; // use the same for preview and live preview $attribs = [ @@ -4082,15 +4110,14 @@ HTML * they have attempted to edit a nonexistent section. */ function noSuchSectionPage() { - global $wgOut; - - $wgOut->prepareErrorPage( wfMessage( 'nosuchsectiontitle' ) ); + $out = $this->context->getOutput(); + $out->prepareErrorPage( wfMessage( 'nosuchsectiontitle' ) ); $res = wfMessage( 'nosuchsectiontext', $this->section )->parseAsBlock(); Hooks::run( 'EditPageNoSuchSection', [ &$this, &$res ] ); - $wgOut->addHTML( $res ); + $out->addHTML( $res ); - $wgOut->returnToMain( false, $this->mTitle ); + $out->returnToMain( false, $this->mTitle ); } /** @@ -4099,28 +4126,28 @@ HTML * @param string|array|bool $match Text (or array of texts) which triggered one or more filters */ public function spamPageWithContent( $match = false ) { - global $wgOut, $wgLang; $this->textbox2 = $this->textbox1; if ( is_array( $match ) ) { - $match = $wgLang->listToText( $match ); + $match = $this->context->getLanguage()->listToText( $match ); } - $wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) ); + $out = $this->context->getOutput(); + $out->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) ); - $wgOut->addHTML( '
' ); - $wgOut->addWikiMsg( 'spamprotectiontext' ); + $out->addHTML( '
' ); + $out->addWikiMsg( 'spamprotectiontext' ); if ( $match ) { - $wgOut->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) ); + $out->addWikiMsg( 'spamprotectionmatch', wfEscapeWikiText( $match ) ); } - $wgOut->addHTML( '
' ); + $out->addHTML( '
' ); - $wgOut->wrapWikiMsg( '

$1

', "yourdiff" ); + $out->wrapWikiMsg( '

$1

', "yourdiff" ); $this->showDiff(); - $wgOut->wrapWikiMsg( '

$1

', "yourtext" ); + $out->wrapWikiMsg( '

$1

', "yourtext" ); $this->showTextbox2(); - $wgOut->addReturnTo( $this->getContextTitle(), [ 'action' => 'edit' ] ); + $out->addReturnTo( $this->getContextTitle(), [ 'action' => 'edit' ] ); } /** @@ -4130,9 +4157,9 @@ HTML * @return bool */ private function checkUnicodeCompliantBrowser() { - global $wgBrowserBlackList, $wgRequest; + global $wgBrowserBlackList; - $currentbrowser = $wgRequest->getHeader( 'User-Agent' ); + $currentbrowser = $this->context->getRequest()->getHeader( 'User-Agent' ); if ( $currentbrowser === false ) { // No User-Agent header sent? Trust it by default... return true;