Merge "Cache redirects from Special:Redirect"
[lhc/web/wiklou.git] / includes / actions / McrUndoAction.php
index 90d1f68..47bbdc0 100644 (file)
@@ -6,9 +6,9 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\MutableRevisionRecord;
-use MediaWiki\Storage\RevisionRecord;
-use MediaWiki\Storage\SlotRecord;
+use MediaWiki\Revision\MutableRevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Revision\SlotRecord;
 
 /**
  * Temporary action for MCR undos
@@ -28,10 +28,10 @@ use MediaWiki\Storage\SlotRecord;
  */
 class McrUndoAction extends FormAction {
 
-       private $undo = 0, $undoafter = 0, $cur = 0;
+       protected $undo = 0, $undoafter = 0, $cur = 0;
 
        /** @param RevisionRecord|null */
-       private $curRev = null;
+       protected $curRev = null;
 
        public function getName() {
                return 'mcrundo';
@@ -90,9 +90,7 @@ class McrUndoAction extends FormAction {
                parent::show();
        }
 
-       protected function checkCanExecute( User $user ) {
-               parent::checkCanExecute( $user );
-
+       protected function initFromParameters() {
                $this->undoafter = $this->getRequest()->getInt( 'undoafter' );
                $this->undo = $this->getRequest()->getInt( 'undo' );
 
@@ -106,6 +104,12 @@ class McrUndoAction extends FormAction {
                }
                $this->curRev = $curRev->getRevisionRecord();
                $this->cur = $this->getRequest()->getInt( 'cur', $this->curRev->getId() );
+       }
+
+       protected function checkCanExecute( User $user ) {
+               parent::checkCanExecute( $user );
+
+               $this->initFromParameters();
 
                $revisionLookup = MediaWikiServices::getInstance()->getRevisionLookup();
 
@@ -219,7 +223,7 @@ class McrUndoAction extends FormAction {
                return $newRev;
        }
 
-       private function generateDiff() {
+       private function generateDiffOrPreview() {
                $newRev = $this->getNewRevision();
                if ( $newRev->hasSameContent( $this->curRev ) ) {
                        throw new ErrorPageError( 'mcrundofailed', 'undo-nochange' );
@@ -232,7 +236,7 @@ class McrUndoAction extends FormAction {
                $newtitle = $this->context->msg( 'yourtext' )->parse();
 
                if ( $this->getRequest()->getCheck( 'wpPreview' ) ) {
-                       $diffEngine->renderNewRevision();
+                       $this->showPreview( $newRev );
                        return '';
                } else {
                        $diffText = $diffEngine->getDiff( $oldtitle, $newtitle );
@@ -241,6 +245,62 @@ class McrUndoAction extends FormAction {
                }
        }
 
+       private function showPreview( RevisionRecord $rev ) {
+               // Mostly copied from EditPage::getPreviewText()
+               $out = $this->getOutput();
+
+               try {
+                       $previewHTML = '';
+
+                       # provide a anchor link to the form
+                       $continueEditing = '<span class="mw-continue-editing">' .
+                               '[[#mw-mcrundo-form|' .
+                               $this->context->getLanguage()->getArrow() . ' ' .
+                               $this->context->msg( 'continue-editing' )->text() . ']]</span>';
+
+                       $note = $this->context->msg( 'previewnote' )->plain() . ' ' . $continueEditing;
+
+                       $parserOptions = $this->page->makeParserOptions( $this->context );
+                       $parserOptions->setIsPreview( true );
+                       $parserOptions->setIsSectionPreview( false );
+                       $parserOptions->enableLimitReport();
+
+                       $parserOutput = MediaWikiServices::getInstance()->getRevisionRenderer()
+                               ->getRenderedRevision( $rev, $parserOptions, $this->context->getUser() )
+                               ->getRevisionParserOutput();
+                       $previewHTML = $parserOutput->getText( [ 'enableSectionEditLinks' => false ] );
+
+                       $out->addParserOutputMetadata( $parserOutput );
+                       if ( count( $parserOutput->getWarnings() ) ) {
+                               $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+                       }
+               } catch ( MWContentSerializationException $ex ) {
+                       $m = $this->context->msg(
+                               'content-failed-to-parse',
+                               $ex->getMessage()
+                       );
+                       $note .= "\n\n" . $m->parse();
+                       $previewHTML = '';
+               }
+
+               $previewhead = Html::rawElement(
+                       'div', [ 'class' => 'previewnote' ],
+                       Html::element(
+                               'h2', [ 'id' => 'mw-previewheader' ],
+                               $this->context->msg( 'preview' )->text()
+                       ) .
+                       $out->parseAsInterface( $note ) .
+                       "<hr />"
+               );
+
+               $pageViewLang = $this->getTitle()->getPageViewLanguage();
+               $attribs = [ 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(),
+                       'class' => 'mw-content-' . $pageViewLang->getDir() ];
+               $previewHTML = Html::rawElement( 'div', $attribs, $previewHTML );
+
+               $out->addHtml( $previewhead . $previewHTML );
+       }
+
        public function onSubmit( $data ) {
                global $wgUseRCPatrol;
 
@@ -298,15 +358,13 @@ class McrUndoAction extends FormAction {
 
        protected function getFormFields() {
                $request = $this->getRequest();
-               $config = $this->context->getConfig();
-               $oldCommentSchema = $config->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
                $ret = [
                        'diff' => [
                                'type' => 'info',
                                'vertical-label' => true,
                                'raw' => true,
                                'default' => function () {
-                                       return $this->generateDiff();
+                                       return $this->generateDiffOrPreview();
                                }
                        ],
                        'summary' => [
@@ -315,7 +373,7 @@ class McrUndoAction extends FormAction {
                                'name' => 'wpSummary',
                                'cssclass' => 'mw-summary',
                                'label-message' => 'summary',
-                               'maxlength' => $oldCommentSchema ? 200 : CommentStore::COMMENT_CHARACTER_LIMIT,
+                               'maxlength' => CommentStore::COMMENT_CHARACTER_LIMIT,
                                'value' => $request->getVal( 'wpSummary', '' ),
                                'size' => 60,
                                'spellcheck' => 'true',
@@ -343,6 +401,7 @@ class McrUndoAction extends FormAction {
 
                $labelAsPublish = $this->context->getConfig()->get( 'EditSubmitButtonLabelPublish' );
 
+               $form->setId( 'mw-mcrundo-form' );
                $form->setSubmitName( 'wpSave' );
                $form->setSubmitTooltip( $labelAsPublish ? 'publish' : 'save' );
                $form->setSubmitTextMsg( $labelAsPublish ? 'publishchanges' : 'savechanges' );
@@ -361,6 +420,10 @@ class McrUndoAction extends FormAction {
                        'attribs' => Linker::tooltipAndAccesskeyAttribs( 'diff' ),
                ] );
 
+               $this->addStatePropagationFields( $form );
+       }
+
+       protected function addStatePropagationFields( HTMLForm $form ) {
                $form->addHiddenField( 'undo', $this->undo );
                $form->addHiddenField( 'undoafter', $this->undoafter );
                $form->addHiddenField( 'cur', $this->curRev->getId() );