Merge "Do not override content format in EditPage when loading rev."
[lhc/web/wiklou.git] / includes / EditPage.php
index 2a80ea6..e4146c5 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * The edit page/HTML interface (split from Article)
  * The actual database and text munging is still in Article,
@@ -1249,9 +1251,31 @@ class EditPage {
 
                        return $handler->makeEmptyContent();
                } else {
-                       # nasty side-effect, but needed for consistency
-                       $this->contentModel = $rev->getContentModel();
-                       $this->contentFormat = $rev->getContentFormat();
+                       // Content models should always be the same since we error
+                       // out if they are different before this point.
+                       $logger = LoggerFactory::getInstance( 'editpage' );
+                       if ( $this->contentModel !== $rev->getContentModel() ) {
+                               $logger->warning( "Overriding content model from current edit {prev} to {new}", [
+                                       'prev' => $this->contentModel,
+                                       'new' => $rev->getContentModel(),
+                                       'title' => $this->getTitle()->getPrefixedDBkey(),
+                                       'method' => __METHOD__
+                               ] );
+                               $this->contentModel = $rev->getContentModel();
+                       }
+
+                       // Given that the content models should match, the current selected
+                       // format should be supported.
+                       if ( !$content->isSupportedFormat( $this->contentFormat ) ) {
+                               $logger->warning( "Current revision content format unsupported. Overriding {prev} to {new}", [
+
+                                       'prev' => $this->contentFormat,
+                                       'new' => $rev->getContentFormat(),
+                                       'title' => $this->getTitle()->getPrefixedDBkey(),
+                                       'method' => __METHOD__
+                               ] );
+                               $this->contentFormat = $rev->getContentFormat();
+                       }
 
                        return $content;
                }
@@ -3026,7 +3050,7 @@ class EditPage {
         * @param string $summary The text of the summary to display
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
-               global $wgOut, $wgContLang;
+               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 ) {
@@ -3038,7 +3062,6 @@ class EditPage {
                                return;
                        }
                }
-               $summary = $wgContLang->recodeForEdit( $summary );
                $labelText = wfMessage( $isSubjectPreview ? 'subject' : 'summary' )->parse();
                list( $label, $input ) = $this->getSummaryInput(
                        $summary,
@@ -3648,7 +3671,7 @@ HTML
         * @return string
         */
        function getPreviewText() {
-               global $wgOut, $wgUser, $wgRawHtml, $wgLang;
+               global $wgOut, $wgRawHtml, $wgLang;
                global $wgAllowUserCss, $wgAllowUserJs;
 
                $stats = $wgOut->getContext()->getStats();
@@ -3702,10 +3725,6 @@ HTML
                                $note = wfMessage( 'previewnote' )->plain() . ' ' . $continueEditing;
                        }
 
-                       $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() );
-                       $parserOptions->setIsPreview( true );
-                       $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
-
                        # don't parse non-wikitext pages, show message about preview
                        if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
                                if ( $this->mTitle->isCssJsSubpage() ) {
@@ -3749,18 +3768,9 @@ HTML
                        ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
                        Hooks::run( 'EditPageGetPreviewContent', $hook_args );
 
-                       $parserOptions->enableLimitReport();
-
-                       # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
-                       # But it's now deprecated, so never mind
-
-                       $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
-                       $scopedCallback = $parserOptions->setupFakeRevision(
-                               $this->mTitle, $pstContent, $wgUser );
-                       $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
-
-                       $parserOutput->setEditSectionTokens( false ); // no section edit links
-                       $previewHTML = $parserOutput->getText();
+                       $parserResult = $this->doPreviewParse( $content );
+                       $parserOutput = $parserResult['parserOutput'];
+                       $previewHTML = $parserResult['html'];
                        $this->mParserOutput = $parserOutput;
                        $wgOut->addParserOutputMetadata( $parserOutput );
 
@@ -3768,7 +3778,6 @@ HTML
                                $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
                        }
 
-                       ScopedCallback::consume( $scopedCallback );
                } catch ( MWContentSerializationException $ex ) {
                        $m = wfMessage(
                                'content-failed-to-parse',
@@ -3799,6 +3808,41 @@ HTML
                return $previewhead . $previewHTML . $this->previewTextAfterContent;
        }
 
+       /**
+        * Get parser options for a preview
+        * @return ParserOptions
+        */
+       protected function getPreviewParserOptions() {
+               $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() );
+               $parserOptions->setIsPreview( true );
+               $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
+               $parserOptions->enableLimitReport();
+               return $parserOptions;
+       }
+
+       /**
+        * 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:
+        *   - parserOutput: The ParserOutput object
+        *   - html: The HTML to be displayed
+        */
+       protected function doPreviewParse( Content $content ) {
+               global $wgUser;
+               $parserOptions = $this->getPreviewParserOptions();
+               $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
+               $scopedCallback = $parserOptions->setupFakeRevision(
+                       $this->mTitle, $pstContent, $wgUser );
+               $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
+               ScopedCallback::consume( $scopedCallback );
+               $parserOutput->setEditSectionTokens( false ); // no section edit links
+               return [
+                       'parserOutput' => $parserOutput,
+                       'html' => $parserOutput->getText() ];
+       }
+
        /**
         * @return array
         */
@@ -4154,11 +4198,9 @@ HTML
         * @return string
         */
        protected function safeUnicodeOutput( $text ) {
-               global $wgContLang;
-               $codedText = $wgContLang->recodeForEdit( $text );
                return $this->checkUnicodeCompliantBrowser()
-                       ? $codedText
-                       : $this->makeSafe( $codedText );
+                       ? $text
+                       : $this->makesafe( $text );
        }
 
        /**