public $action = 'submit';
/** @var bool Whether an edit conflict needs to be resolved. Detected based on whether
- * $editRevId is different from the current revision. When a conflict has successfully
+ * $editRevId is different than the latest revision. When a conflict has successfully
* been resolved by a 3-way-merge, this field is set to false.
*/
public $isConflict = false;
/** @var string */
public $formtype;
- /** @var bool */
+ /** @var bool
+ * True the first time the edit form is rendered, false after re-rendering
+ * with diff, save prompts, etc.
+ */
public $firsttime;
/** @var bool|stdClass */
/** @var bool */
public $recreate = false;
- /** @var string */
+ /** @var string
+ * Page content input field.
+ */
public $textbox1 = '';
/** @var string */
/** @var string */
public $summary = '';
- /** @var bool */
+ /** @var bool
+ * If true, hide the summary field.
+ */
public $nosummary = false;
- /** @var string */
+ /** @var string
+ * Timestamp of the latest revision of the page when editing was initiated
+ * on the client.
+ */
public $edittime = '';
- /** @var int ID of the current revision at the time editing was initiated on the client.
- * This is used to detect and resolve edit conflicts.
+ /** @var int Revision ID of the latest revision of the page when editing
+ * was initiated on the client. This is used to detect and resolve edit
+ * conflicts.
*
* @note 0 if the page did not exist at that time.
* @note When starting an edit from an old revision, this still records the current
- * revision at the time , not the one the edit is based on.
+ * revision at the time, not the one the edit is based on.
*
* @see $oldid
* @see getBaseRevision()
/** @var string */
public $sectiontitle = '';
- /** @var string */
+ /** @var string
+ * Timestamp from the first time the edit form was rendered.
+ */
public $starttime = '';
/** @var int Revision ID the edit is based on, or 0 if it's the current revision.
+ * FIXME: This isn't used in conflict resolution--provide a better
+ * justification or merge with parentRevId.
* @see $editRevId
*/
public $oldid = 0;
$this->isConflict = false;
# Show applicable editing introductions
- if ( $this->formtype === 'initial' || $this->firsttime ) {
+ if ( $this->formtype == 'initial' || $this->firsttime ) {
$this->showIntro();
}
# that edit() already checked just in case someone tries to sneak
# in the back door with a hand-edited submission URL.
- if ( 'save' === $this->formtype ) {
+ if ( 'save' == $this->formtype ) {
$resultDetails = null;
$status = $this->attemptSave( $resultDetails );
if ( !$this->handleStatus( $status, $resultDetails ) ) {
# First time through: get contents, set time for conflict
# checking, etc.
- if ( 'initial' === $this->formtype || $this->firsttime ) {
+ if ( 'initial' == $this->formtype || $this->firsttime ) {
if ( $this->initialiseForm() === false ) {
- $this->noSuchSectionPage();
+ $out = $this->context->getOutput();
+ if ( $out->getRedirect() === '' ) { // mcrundo hack redirects, don't override it
+ $this->noSuchSectionPage();
+ }
return;
}
foreach ( $permErrors as $error ) {
if ( ( $this->preview || $this->diff )
&& (
- $error[0] === 'blockedtext' ||
- $error[0] === 'autoblockedtext' ||
- $error[0] === 'systemblockedtext'
+ $error[0] == 'blockedtext' ||
+ $error[0] == 'autoblockedtext' ||
+ $error[0] == 'systemblockedtext'
)
) {
$remove[] = $error;
// security reasons
return false;
}
- if ( $request->getVal( 'preview' ) === 'yes' ) {
+ if ( $request->getVal( 'preview' ) == 'yes' ) {
// Explicit override from request
return true;
- } elseif ( $request->getVal( 'preview' ) === 'no' ) {
+ } elseif ( $request->getVal( 'preview' ) == 'no' ) {
// Explicit override from request
return false;
- } elseif ( $this->section === 'new' ) {
+ } elseif ( $this->section == 'new' ) {
// Nothing *to* preview for new sections
return false;
} elseif ( ( $request->getVal( 'preload' ) !== null || $this->mTitle->exists() )
throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
}
- $this->isNew = !$this->mTitle->exists() || $this->section === 'new';
+ $this->isNew = !$this->mTitle->exists() || $this->section == 'new';
if ( $request->wasPosted() ) {
# These fields need to be checked for encoding.
$user = $this->context->getUser();
# Don't force edit summaries when a user is editing their own user or talk page
- if ( ( $this->mTitle->mNamespace === NS_USER || $this->mTitle->mNamespace === NS_USER_TALK )
- && $this->mTitle->getText() === $user->getName()
+ if ( ( $this->mTitle->mNamespace == NS_USER || $this->mTitle->mNamespace == NS_USER_TALK )
+ && $this->mTitle->getText() == $user->getName()
) {
$this->allowBlankSummary = true;
} else {
// When creating a new section, we can preload a section title by passing it as the
// preloadtitle parameter in the URL (T15100)
- if ( $this->section === 'new' && $request->getVal( 'preloadtitle' ) ) {
+ if ( $this->section == 'new' && $request->getVal( 'preloadtitle' ) ) {
$this->sectiontitle = $request->getVal( 'preloadtitle' );
// Once wpSummary isn't being use for setting section titles, we should delete this.
$this->summary = $request->getVal( 'preloadtitle' );
- } elseif ( $this->section !== 'new' && $request->getVal( 'summary' ) ) {
+ } elseif ( $this->section != 'new' && $request->getVal( 'summary' ) !== '' ) {
$this->summary = $request->getText( 'summary' );
if ( $this->summary !== '' ) {
$this->hasPresetSummary = true;
* @since 1.21
*/
protected function getContentObject( $def_content = null ) {
- global $wgContLang;
-
$content = false;
$user = $this->context->getUser();
$request = $this->context->getRequest();
// For message page not locally set, use the i18n message.
// For other non-existent articles, use preload text if any.
- if ( !$this->mTitle->exists() || $this->section === 'new' ) {
- if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && $this->section !== 'new' ) {
+ if ( !$this->mTitle->exists() || $this->section == 'new' ) {
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && $this->section != 'new' ) {
# If this is a system message, get the default text.
$msg = $this->mTitle->getDefaultMessageText();
!$oldrev->isDeleted( Revision::DELETED_TEXT )
) {
if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev ) ) {
- // Cannot yet undo edits that involve anything other the main slot.
- $undoMsg = 'main-slot-only';
+ // Hack for undo while EditPage can't handle multi-slot editing
+ $this->context->getOutput()->redirect( $this->mTitle->getFullURL( [
+ 'action' => 'mcrundo',
+ 'undo' => $undo,
+ 'undoafter' => $undoafter,
+ ] ) );
+ return false;
} else {
$content = $this->page->getUndoContent( $undorev, $oldrev );
if ( $undoMsg === null ) {
$oldContent = $this->page->getContent( Revision::RAW );
- $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+ $popts = ParserOptions::newFromUserAndLang(
+ $user, MediaWikiServices::getInstance()->getContentLanguage() );
$newContent = $content->preSaveTransform( $this->mTitle, $user, $popts );
if ( $newContent->getModel() !== $oldContent->getModel() ) {
// The undo may change content
# If we just undid one rev, use an autosummary
$firstrev = $oldrev->getNext();
- if ( $firstrev && $firstrev->getId() === $undo ) {
+ if ( $firstrev && $firstrev->getId() == $undo ) {
$userText = $undorev->getUserText();
if ( $userText === '' ) {
$undoSummary = $this->context->msg(
$out = $this->context->getOutput();
// Messages: undo-success, undo-failure, undo-main-slot-only, undo-norev,
// undo-nochange.
- $class = ( $undoMsg === 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
+ $class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
$this->editFormPageTop .= $out->parse( "<div class=\"{$class}\">" .
$this->context->msg( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
}
* @return Content|null
*/
private function getOriginalContent( User $user ) {
- if ( $this->section === 'new' ) {
+ if ( $this->section == 'new' ) {
return $this->getCurrentContent();
}
$revision = $this->mArticle->getRevisionFetched();
$postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
$val = 'saved';
- if ( $statusValue === self::AS_SUCCESS_NEW_ARTICLE ) {
+ if ( $statusValue == self::AS_SUCCESS_NEW_ARTICLE ) {
$val = 'created';
} elseif ( $this->oldid ) {
$val = 'restored';
* @todo FIXME: once the interface for internalAttemptSave() is made
* nicer, this should use the message in $status
*/
- if ( $status->value === self::AS_SUCCESS_UPDATE
- || $status->value === self::AS_SUCCESS_NEW_ARTICLE
+ if ( $status->value == self::AS_SUCCESS_UPDATE
+ || $status->value == self::AS_SUCCESS_NEW_ARTICLE
) {
$this->incrementResolvedConflicts();
);
if ( $resultDetails['redirect'] ) {
- if ( $extraQuery === '' ) {
+ if ( $extraQuery == '' ) {
$extraQuery = 'redirect=no';
} else {
$extraQuery = 'redirect=no&' . $extraQuery;
// is if an extension hook aborted from inside ArticleSave.
// Render the status object into $this->hookError
// FIXME this sucks, we should just use the Status object throughout
- $this->hookError = '<div class="error">' ."\n" . $status->getWikiText() .
+ $this->hookError = '<div class="error">' . "\n" . $status->getWikiText() .
'</div>';
return true;
}
*/
protected function runPostMergeFilters( Content $content, Status $status, User $user ) {
// Run old style post-section-merge edit filter
- if ( $this->hookError !== '' ) {
+ if ( $this->hookError != '' ) {
# ...or the hook could be expecting us to produce an error
$status->fatal( 'hookaborted' );
$status->value = self::AS_HOOK_ERROR_EXPECTED;
if ( $this->summary === '' ) {
$cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
return $this->context->msg( 'newsectionsummary' )
- ->rawParams( $cleanSectionTitle )->inContentLanguage()->text();
+ ->plaintextParams( $cleanSectionTitle )->inContentLanguage()->text();
}
} elseif ( $this->summary !== '' ) {
$sectionanchor = $this->guessSectionName( $this->summary );
# in the revision summary.
$cleanSummary = $wgParser->stripSectionName( $this->summary );
return $this->context->msg( 'newsectionsummary' )
- ->rawParams( $cleanSummary )->inContentLanguage()->text();
+ ->plaintextParams( $cleanSummary )->inContentLanguage()->text();
}
return $this->summary;
}
}
# Check image redirect
- if ( $this->mTitle->getNamespace() === NS_FILE &&
+ if ( $this->mTitle->getNamespace() == NS_FILE &&
$textbox_content->isRedirect() &&
!$user->isAllowed( 'upload' )
) {
# Check for spam
$match = self::matchSummarySpamRegex( $this->summary );
- if ( $match === false && $this->section === 'new' ) {
+ if ( $match === false && $this->section == 'new' ) {
# $wgSpamRegex is enforced on this new heading/summary because, unlike
# regular summaries, it is added to the actual wikitext.
if ( $this->sectiontitle !== '' ) {
$status->fatal( 'hookaborted' );
$status->value = self::AS_HOOK_ERROR;
return $status;
- } elseif ( $this->hookError !== '' ) {
+ } elseif ( $this->hookError != '' ) {
# ...or the hook could be expecting us to produce an error
$status->fatal( 'hookaborted' );
$status->value = self::AS_HOOK_ERROR_EXPECTED;
$content = $textbox_content;
$result['sectionanchor'] = '';
- if ( $this->section === 'new' ) {
+ if ( $this->section == 'new' ) {
if ( $this->sectiontitle !== '' ) {
// Insert the section title above the content.
$content = $content->addSectionHeader( $this->sectiontitle );
// revision that was current when editing was initiated on the client.
// This is checked based on the timestamp and revision ID.
// TODO: the timestamp based check can probably go away now.
- if ( $timestamp !== $this->edittime
- || ( $this->editRevId !== null && $this->editRevId !== $latest )
+ if ( $timestamp != $this->edittime
+ || ( $this->editRevId !== null && $this->editRevId != $latest )
) {
$this->isConflict = true;
- if ( $this->section === 'new' ) {
- if ( $this->page->getUserText() === $user->getName() &&
- $this->page->getComment() === $this->newSectionSummary()
+ if ( $this->section == 'new' ) {
+ if ( $this->page->getUserText() == $user->getName() &&
+ $this->page->getComment() == $this->newSectionSummary()
) {
// Probably a duplicate submission of a new comment.
// This can happen when CDN resends a request after
return $status;
}
- if ( $this->section === 'new' ) {
+ if ( $this->section == 'new' ) {
// Handle the user preference to force summaries here
- if ( !$this->allowBlankSummary && trim( $this->summary ) === '' ) {
+ if ( !$this->allowBlankSummary && trim( $this->summary ) == '' ) {
$this->missingSummary = true;
$status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
$status->value = self::AS_SUMMARY_NEEDED;
}
// Do not allow the user to post an empty comment
- if ( $this->textbox1 === '' ) {
+ if ( $this->textbox1 == '' ) {
$this->missingComment = true;
$status->fatal( 'missingcommenttext' );
$status->value = self::AS_TEXTBOX_EMPTY;
} elseif ( !$this->allowBlankSummary
&& !$content->equals( $this->getOriginalContent( $user ) )
&& !$content->isRedirect()
- && md5( $this->summary ) === $this->autoSumm
+ && md5( $this->summary ) == $this->autoSumm
) {
$this->missingSummary = true;
$status->fatal( 'missingsummary' );
# All's well
$sectionanchor = '';
- if ( $this->section === 'new' ) {
+ if ( $this->section == 'new' ) {
$this->summary = $this->newSectionSummary( $sectionanchor );
- } elseif ( $this->section !== '' ) {
+ } elseif ( $this->section != '' ) {
# Try to get a section anchor from the section source, redirect
# to edited section if header found.
# XXX: Might be better to integrate this into Article::replaceSectionAtRev
$watch = $this->watchthis;
// Do this in its own transaction to reduce contention...
DeferredUpdates::addCallableUpdate( function () use ( $user, $title, $watch ) {
- if ( $watch === $user->isWatched( $title, User::IGNORE_USER_RIGHTS ) ) {
+ if ( $watch == $user->isWatched( $title, User::IGNORE_USER_RIGHTS ) ) {
return; // nothing to change
}
WatchAction::doWatchOrUnwatch( $watch, $title, $user );
* Returns the revision that was current at the time editing was initiated on the client,
* even if the edit was based on an old revision.
*
- * @warning: this method is very poorly named. If the user opened the form with ?oldid=X,
+ * @warning this method is very poorly named. If the user opened the form with ?oldid=X,
* one might think of X as the "base revision", which is NOT what this returns,
* see oldid for that. One might further assume that this corresponds to the $baseRevId
* parameter of WikiPage::doEditContent, which is not the case either.
$contextTitle = $this->getContextTitle();
if ( $this->isConflict ) {
$msg = 'editconflict';
- } elseif ( $contextTitle->exists() && $this->section !== '' ) {
- $msg = $this->section === 'new' ? 'editingcomment' : 'editingsection';
+ } elseif ( $contextTitle->exists() && $this->section != '' ) {
+ $msg = $this->section == 'new' ? 'editingcomment' : 'editingsection';
} else {
$msg = $contextTitle->exists()
- || ( $contextTitle->getNamespace() === NS_MEDIAWIKI
+ || ( $contextTitle->getNamespace() == NS_MEDIAWIKI
&& $contextTitle->getDefaultMessageText() !== false
)
? 'editing'
$displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
if ( $displayTitle === false ) {
$displayTitle = $contextTitle->getPrefixedText();
+ } else {
+ $out->setDisplayTitle( $displayTitle );
}
$out->setPageTitle( $this->context->msg( $msg, $displayTitle ) );
$out = $this->context->getOutput();
$namespace = $this->mTitle->getNamespace();
- if ( $namespace === NS_MEDIAWIKI ) {
+ if ( $namespace == NS_MEDIAWIKI ) {
# Show a warning if editing an interface message
$out->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
# If this is a default message (but not css, json, or js),
'translateinterface' );
}
}
- } elseif ( $namespace === NS_FILE ) {
+ } elseif ( $namespace == NS_FILE ) {
# Show a hint to shared repo
$file = wfFindFile( $this->mTitle );
if ( $file && !$file->isLocal() ) {
# Show a warning message when someone creates/edits a user (talk) page but the user does not exist
# Show log extract when the user is currently blocked
- if ( $namespace === NS_USER || $namespace === NS_USER_TALK ) {
+ if ( $namespace == NS_USER || $namespace == NS_USER_TALK ) {
$username = explode( '/', $this->mTitle->getText(), 2 )[0];
$user = User::newFromName( $username, false /* allow IP users */ );
$ip = User::isIP( $username );
if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
$out->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n$1\n</div>",
[ 'userpage-userdoesnotexist', wfEscapeWikiText( $username ) ] );
- } elseif ( !is_null( $block ) && $block->getType() !== Block::TYPE_AUTO ) {
+ } elseif ( !is_null( $block ) && $block->getType() != Block::TYPE_AUTO ) {
# Show log extract if the user is currently blocked
LogEventsList::showLogExtract(
$out,
# we parse this near the beginning so that setHeaders can do the title
# setting work instead of leaving it in getPreviewText
$previewOutput = '';
- if ( $this->formtype === 'preview' ) {
+ if ( $this->formtype == 'preview' ) {
$previewOutput = $this->getPreviewText();
}
$this->addEditNotices();
if ( !$this->isConflict &&
- $this->section !== '' &&
+ $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.
$showToolbar = true;
if ( $this->wasDeletedSinceLastEdit() ) {
- if ( $this->formtype === 'save' ) {
+ if ( $this->formtype == 'save' ) {
// Hide the toolbar and edit area, user can click preview to get it back
// Add an confirmation checkbox and explanation.
$showToolbar = false;
// Put these up at the top to ensure they aren't lost on early form submission
$this->showFormBeforeText();
- if ( $this->wasDeletedSinceLastEdit() && 'save' === $this->formtype ) {
+ if ( $this->wasDeletedSinceLastEdit() && 'save' == $this->formtype ) {
$username = $this->lastDelete->user_name;
$comment = CommentStore::getStore()
->getComment( 'log_comment', $this->lastDelete )->text;
# ####
# 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 ) ) {
+ if ( $this->missingSummary || ( $this->section == 'new' && $this->nosummary ) ) {
$out->addHTML( Html::hidden( 'wpIgnoreBlankSummary', true ) );
}
$this->autoSumm = md5( '' );
}
- $autosumm = $this->autoSumm ?: md5( $this->summary );
+ $autosumm = $this->autoSumm !== '' ? $this->autoSumm : md5( $this->summary );
$out->addHTML( Html::hidden( 'wpAutoSummary', $autosumm ) );
$out->addHTML( Html::hidden( 'oldid', $this->oldid ) );
$out->enableOOUI();
- if ( $this->section === 'new' ) {
+ if ( $this->section == 'new' ) {
$this->showSummaryInput( true, $this->summary );
$out->addHTML( $this->getSummaryPreview( true, $this->summary ) );
}
$type = false;
if ( $this->preview ) {
$type = 'preview';
- } elseif ( $this->section !== '' ) {
+ } elseif ( $this->section != '' ) {
$type = 'section';
}
$this->addExplainConflictHeader( $out );
$this->editRevId = $this->page->getLatest();
} else {
- if ( $this->section !== '' && $this->section !== 'new' ) {
+ if ( $this->section != '' && $this->section != 'new' ) {
if ( !$this->summary && !$this->preview && !$this->diff ) {
$sectionTitle = self::extractSectionTitle( $this->textbox1 ); // FIXME: use Content object
if ( $sectionTitle !== false ) {
$out->wrapWikiMsg( "<div id='mw-missingcommenttext'>\n$1\n</div>", 'missingcommenttext' );
}
- if ( $this->missingSummary && $this->section !== 'new' ) {
+ if ( $this->missingSummary && $this->section != 'new' ) {
$out->wrapWikiMsg(
"<div id='mw-missingsummary'>\n$1\n</div>",
[ 'missingsummary', $buttonLabel ]
);
}
- if ( $this->missingSummary && $this->section === 'new' ) {
+ if ( $this->missingSummary && $this->section == 'new' ) {
$out->wrapWikiMsg(
"<div id='mw-missingcommentheader'>\n$1\n</div>",
[ 'missingcommentheader', $buttonLabel ]
$out->addWikiText( $this->hookError );
}
- if ( $this->section !== 'new' ) {
+ if ( $this->section != 'new' ) {
$revision = $this->mArticle->getRevisionFetched();
if ( $revision ) {
// Let sysop know that this will make private content public if saved
[ 'readonlywarning', wfReadOnlyReason() ]
);
} elseif ( $user->isAnon() ) {
- if ( $this->formtype !== 'preview' ) {
+ if ( $this->formtype != 'preview' ) {
$out->wrapWikiMsg(
"<div id='mw-anon-edit-warning' class='warningbox'>\n$1\n</div>",
[ 'anoneditwarning',
}
/**
- * Helper function for summary input functions, which returns the neccessary
+ * Helper function for summary input functions, which returns the necessary
* attributes for the input.
*
* @param array|null $inputAttrs Array of attrs to use on the input
* @param string|null $textoverride Optional text to override $this->textarea1 with
*/
protected function showTextbox1( $customAttribs = null, $textoverride = null ) {
- if ( $this->wasDeletedSinceLastEdit() && $this->formtype === 'save' ) {
+ if ( $this->wasDeletedSinceLastEdit() && $this->formtype == 'save' ) {
$attribs = [ 'style' => 'display:none;' ];
} else {
$builder = new TextboxBuilder();
$attribs = [ 'id' => 'wikiPreview', 'class' => implode( ' ', $classes ) ];
- if ( $this->formtype !== 'preview' ) {
+ if ( $this->formtype != 'preview' ) {
$attribs['style'] = 'display: none;';
}
$out = $this->context->getOutput();
$out->addHTML( Xml::openElement( 'div', $attribs ) );
- if ( $this->formtype === 'preview' ) {
+ if ( $this->formtype == 'preview' ) {
$this->showPreview( $previewOutput );
} else {
// Empty content container for LivePreview
$out->addHTML( '</div>' );
- if ( $this->formtype === 'diff' ) {
+ if ( $this->formtype == 'diff' ) {
try {
$this->showDiff();
} catch ( MWContentSerializationException $ex ) {
* save and then make a comparison.
*/
public function showDiff() {
- global $wgContLang;
-
$oldtitlemsg = 'currentrev';
# if message does not exist, show diff against the preloaded default
- if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && !$this->mTitle->exists() ) {
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
$oldtext = $this->mTitle->getDefaultMessageText();
if ( $oldtext !== false ) {
$oldtitlemsg = 'defaultmessagetext';
Hooks::run( 'EditPageGetDiffContent', [ $this, &$newContent ] );
$user = $this->context->getUser();
- $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+ $popts = ParserOptions::newFromUserAndLang( $user,
+ MediaWikiServices::getInstance()->getContentLanguage() );
$newContent = $newContent->preSaveTransform( $this->mTitle, $user, $popts );
}
* Get the Limit report for page previews
*
* @since 1.22
- * @param ParserOutput $output ParserOutput object from the parse
+ * @param ParserOutput|null $output ParserOutput object from the parse
* @return string HTML
*/
- public static function getPreviewLimitReport( $output ) {
+ public static function getPreviewLimitReport( ParserOutput $output = null ) {
global $wgLang;
if ( !$output || !$output->getLimitReportData() ) {
$out = $this->context->getOutput();
$out->addHTML( "<div class='editOptions'>\n" );
- if ( $this->section !== 'new' ) {
+ if ( $this->section != 'new' ) {
$this->showSummaryInput( false, $this->summary );
$out->addHTML( $this->getSummaryPreview( false, $this->summary ) );
}
}
/**
+ * Get the last log record of this page being deleted, if ever. This is
+ * used to detect whether a delete occurred during editing.
* @return bool|stdClass
*/
protected function getLastDelete() {
$level = false;
}
- if ( $content->getModel() === CONTENT_MODEL_CSS ) {
+ if ( $content->getModel() == CONTENT_MODEL_CSS ) {
$format = 'css';
if ( $level === 'user' && !$config->get( 'AllowUserCss' ) ) {
$format = false;
}
- } elseif ( $content->getModel() === CONTENT_MODEL_JSON ) {
+ } elseif ( $content->getModel() == CONTENT_MODEL_JSON ) {
$format = 'json';
if ( $level === 'user' /* No comparable 'AllowUserJson' */ ) {
$format = false;
}
- } elseif ( $content->getModel() === CONTENT_MODEL_JAVASCRIPT ) {
+ } elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
$format = 'js';
if ( $level === 'user' && !$config->get( 'AllowUserJs' ) ) {
$format = false;
$parserOptions->setIsPreview( true );
$parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
$parserOptions->enableLimitReport();
+
+ // XXX: we could call $parserOptions->setCurrentRevisionCallback here to force the
+ // current revision to be null during PST, until setupFakeRevision is called on
+ // the ParserOptions. Currently, we rely on Parser::getRevisionObject() to ignore
+ // existing revisions in preview mode.
+
return $parserOptions;
}
protected function doPreviewParse( Content $content ) {
$user = $this->context->getUser();
$parserOptions = $this->getPreviewParserOptions();
+
+ // NOTE: preSaveTransform doesn't have a fake revision to operate on.
+ // Parser::getRevisionObject() will return null in preview mode,
+ // causing the context user to be used for {{subst:REVISIONUSER}}.
+ // XXX: Alternatively, we could also call setupFakeRevision() a second time:
+ // once before PST with $content, and then after PST with $pstContent.
$pstContent = $content->preSaveTransform( $this->mTitle, $user, $parserOptions );
- $scopedCallback = $parserOptions->setupFakeRevision(
- $this->mTitle, $pstContent, $user );
+ $scopedCallback = $parserOptions->setupFakeRevision( $this->mTitle, $pstContent, $user );
$parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
ScopedCallback::consume( $scopedCallback );
return [
* @return array
*/
public function getTemplates() {
- if ( $this->preview || $this->section !== '' ) {
+ if ( $this->preview || $this->section != '' ) {
$templates = [];
if ( !isset( $this->mParserOutput ) ) {
return $templates;
* @return string
*/
public static function getEditToolbar( $title = null ) {
- global $wgContLang, $wgOut;
- global $wgEnableUploads, $wgForeignFileRepos;
+ global $wgOut, $wgEnableUploads, $wgForeignFileRepos;
$imagesAvailable = $wgEnableUploads || count( $wgForeignFileRepos );
$showSignature = true;
$showSignature = MWNamespace::wantSignatures( $title->getNamespace() );
}
+ $contLang = MediaWikiServices::getInstance()->getContentLanguage();
+
/**
* $toolarray is an array of arrays each of which includes the
* opening tag, the closing tag, optionally a sample text that is
],
$imagesAvailable ? [
'id' => 'mw-editbutton-image',
- 'open' => '[[' . $wgContLang->getNsText( NS_FILE ) . ':',
+ 'open' => '[[' . $contLang->getNsText( NS_FILE ) . ':',
'close' => ']]',
'sample' => wfMessage( 'image_sample' )->text(),
'tip' => wfMessage( 'image_tip' )->text(),
] : false,
$imagesAvailable ? [
'id' => 'mw-editbutton-media',
- 'open' => '[[' . $wgContLang->getNsText( NS_MEDIA ) . ':',
+ 'open' => '[[' . $contLang->getNsText( NS_MEDIA ) . ':',
'close' => ']]',
'sample' => wfMessage( 'media_sample' )->text(),
'tip' => wfMessage( 'media_tip' )->text(),
]
];
- $script = 'mw.loader.using("mediawiki.toolbar", function () {';
+ $script = '';
foreach ( $toolarray as $tool ) {
if ( !$tool ) {
continue;
);
}
- $script .= '});';
-
$toolbar = '<div id="toolbar"></div>';
if ( Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] ) ) {
// Only add the old toolbar cruft to the page payload if the toolbar has not
// been over-written by a hook caller
$nonce = $wgOut->getCSPNonce();
- $wgOut->addScript( ResourceLoader::makeInlineScript( $script, $nonce ) );
+ $wgOut->addScript( Html::inlineScript(
+ ResourceLoader::makeInlineCodeWithModule( 'mediawiki.toolbar', $script ),
+ $nonce
+ ) );
};
return $toolbar;