Replace Content::getParserOutput call to ContentRenderer::getParserOutput

Bug: T287158
Change-Id: I8a13f45027e08e2d8ddefa140dd47a0c55094934
This commit is contained in:
Roman Stolar 2021-10-14 17:01:58 +03:00
parent 2ae3e55f64
commit fa5237eb48
23 changed files with 198 additions and 129 deletions

View file

@ -4236,9 +4236,10 @@ class EditPage implements IEditObject {
// once before PST with $content, and then after PST with $pstContent.
$services = MediaWikiServices::getInstance();
$contentTransformer = $services->getContentTransformer();
$contentRenderer = $services->getContentRenderer();
$pstContent = $contentTransformer->preSaveTransform( $content, $this->mTitle, $user, $parserOptions );
$scopedCallback = $parserOptions->setupFakeRevision( $this->mTitle, $pstContent, $user );
$parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions );
$parserOutput = $contentRenderer->getParserOutput( $pstContent, $this->mTitle, null, $parserOptions );
ScopedCallback::consume( $scopedCallback );
return [
'parserOutput' => $parserOutput,

View file

@ -74,9 +74,6 @@ class RenderedRevision implements SlotRenderingProvider {
*/
private $slotsOutput = [];
/** @var ContentRenderer */
private $contentRenderer;
/**
* @var callable Callback for combining slot output into revision output.
* Signature: function ( RenderedRevision $this ): ParserOutput.
@ -88,6 +85,11 @@ class RenderedRevision implements SlotRenderingProvider {
*/
private $saveParseLogger;
/**
* @var ContentRenderer Service to render content.
*/
private $contentRenderer;
/**
* @note Application logic should not instantiate RenderedRevision instances directly,
* but should use a RevisionRenderer instead.
@ -113,6 +115,7 @@ class RenderedRevision implements SlotRenderingProvider {
Authority $performer = null
) {
$this->options = $options;
$this->contentRenderer = $contentRenderer;
$this->setRevisionInternal( $revision );
@ -238,7 +241,8 @@ class RenderedRevision implements SlotRenderingProvider {
throw new LogicException(
'HTML generation was requested, but '
. get_class( $content )
. '::getParserOutput() returns a ParserOutput with no text set.'
. ' that passed to '
. 'ContentRenderer::getParserOutput() returns a ParserOutput with no text set.'
);
}

View file

@ -131,6 +131,7 @@ class ApiMain extends ApiBase {
'ContentHandlerFactory',
'Parser',
'WikiPageFactory',
'ContentRenderer',
'ContentTransformer',
'CommentFormatter',
]

View file

@ -23,8 +23,10 @@
use MediaWiki\Cache\LinkBatchFactory;
use MediaWiki\CommentFormatter\CommentFormatter;
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Content\Renderer\ContentRenderer;
use MediaWiki\Content\Transform\ContentTransformer;
use MediaWiki\Languages\LanguageNameUtils;
use MediaWiki\Page\PageReference;
use MediaWiki\Page\WikiPageFactory;
use MediaWiki\Revision\RevisionLookup;
use MediaWiki\Revision\RevisionRecord;
@ -77,6 +79,9 @@ class ApiParse extends ApiBase {
/** @var CommentFormatter */
private $commentFormatter;
/** @var ContentRenderer */
private $contentRenderer;
/**
* @param ApiMain $main
* @param string $action
@ -88,6 +93,7 @@ class ApiParse extends ApiBase {
* @param IContentHandlerFactory $contentHandlerFactory
* @param Parser $parser
* @param WikiPageFactory $wikiPageFactory
* @param ContentRenderer $contentRenderer
* @param ContentTransformer $contentTransformer
* @param CommentFormatter $commentFormatter
*/
@ -102,6 +108,7 @@ class ApiParse extends ApiBase {
IContentHandlerFactory $contentHandlerFactory,
Parser $parser,
WikiPageFactory $wikiPageFactory,
ContentRenderer $contentRenderer,
ContentTransformer $contentTransformer,
CommentFormatter $commentFormatter
) {
@ -114,6 +121,7 @@ class ApiParse extends ApiBase {
$this->contentHandlerFactory = $contentHandlerFactory;
$this->parser = $parser;
$this->wikiPageFactory = $wikiPageFactory;
$this->contentRenderer = $contentRenderer;
$this->contentTransformer = $contentTransformer;
$this->commentFormatter = $commentFormatter;
}
@ -130,14 +138,14 @@ class ApiParse extends ApiBase {
private function getContentParserOutput(
Content $content,
Title $title,
PageReference $page,
$revId,
ParserOptions $popts
) {
$worker = new PoolCounterWorkViaCallback( 'ApiParser', $this->getPoolKey(),
[
'doWork' => static function () use ( $content, $title, $revId, $popts ) {
return $content->getParserOutput( $title, $revId, $popts );
'doWork' => function () use ( $content, $page, $revId, $popts ) {
return $this->contentRenderer->getParserOutput( $content, $page, $revId, $popts );
},
'error' => function () {
$this->dieWithError( 'apierror-concurrency-limit' );

View file

@ -64,6 +64,7 @@ class ApiQuery extends ApiBase {
'SlotRoleRegistry',
'ChangeTagDefStore',
'LinkBatchFactory',
'ContentRenderer',
'ContentTransformer',
]
],
@ -140,6 +141,7 @@ class ApiQuery extends ApiBase {
'SlotRoleRegistry',
'ChangeTagDefStore',
'ActorMigration',
'ContentRenderer',
'ContentTransformer',
]
],
@ -179,6 +181,7 @@ class ApiQuery extends ApiBase {
'SlotRoleRegistry',
'ChangeTagDefStore',
'NamespaceInfo',
'ContentRenderer',
'ContentTransformer',
]
],
@ -229,6 +232,7 @@ class ApiQuery extends ApiBase {
'SlotRoleRegistry',
'ActorMigration',
'NamespaceInfo',
'ContentRenderer',
'ContentTransformer',
]
],

View file

@ -24,6 +24,7 @@
*/
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Content\Renderer\ContentRenderer;
use MediaWiki\Content\Transform\ContentTransformer;
use MediaWiki\ParamValidator\TypeDef\UserDef;
use MediaWiki\Revision\RevisionRecord;
@ -57,6 +58,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
* @param SlotRoleRegistry $slotRoleRegistry
* @param NameTableStore $changeTagDefStore
* @param NamespaceInfo $namespaceInfo
* @param ContentRenderer $contentRenderer
* @param ContentTransformer $contentTransformer
*/
public function __construct(
@ -68,6 +70,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
SlotRoleRegistry $slotRoleRegistry,
NameTableStore $changeTagDefStore,
NamespaceInfo $namespaceInfo,
ContentRenderer $contentRenderer,
ContentTransformer $contentTransformer
) {
parent::__construct(
@ -78,6 +81,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
$contentHandlerFactory,
$parserFactory,
$slotRoleRegistry,
$contentRenderer,
$contentTransformer
);
$this->revisionStore = $revisionStore;

View file

@ -21,6 +21,7 @@
*/
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Content\Renderer\ContentRenderer;
use MediaWiki\Content\Transform\ContentTransformer;
use MediaWiki\ParamValidator\TypeDef\UserDef;
use MediaWiki\Revision\RevisionRecord;
@ -53,6 +54,7 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
* @param SlotRoleRegistry $slotRoleRegistry
* @param ActorMigration $actorMigration
* @param NamespaceInfo $namespaceInfo
* @param ContentRenderer $contentRenderer
* @param ContentTransformer $contentTransformer
*/
public function __construct(
@ -64,6 +66,7 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
SlotRoleRegistry $slotRoleRegistry,
ActorMigration $actorMigration,
NamespaceInfo $namespaceInfo,
ContentRenderer $contentRenderer,
ContentTransformer $contentTransformer
) {
parent::__construct(
@ -74,6 +77,7 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
$contentHandlerFactory,
$parserFactory,
$slotRoleRegistry,
$contentRenderer,
$contentTransformer
);
$this->revisionStore = $revisionStore;

View file

@ -25,6 +25,7 @@
use MediaWiki\Cache\LinkBatchFactory;
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Content\Renderer\ContentRenderer;
use MediaWiki\Content\Transform\ContentTransformer;
use MediaWiki\ParamValidator\TypeDef\UserDef;
use MediaWiki\Revision\RevisionRecord;
@ -58,6 +59,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
* @param SlotRoleRegistry $slotRoleRegistry
* @param NameTableStore $changeTagDefStore
* @param LinkBatchFactory $linkBatchFactory
* @param ContentRenderer $contentRenderer
* @param ContentTransformer $contentTransformer
*/
public function __construct(
@ -69,6 +71,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
SlotRoleRegistry $slotRoleRegistry,
NameTableStore $changeTagDefStore,
LinkBatchFactory $linkBatchFactory,
ContentRenderer $contentRenderer,
ContentTransformer $contentTransformer
) {
parent::__construct(
@ -79,6 +82,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
$contentHandlerFactory,
$parserFactory,
$slotRoleRegistry,
$contentRenderer,
$contentTransformer
);
$this->revisionStore = $revisionStore;

View file

@ -21,6 +21,7 @@
*/
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Content\Renderer\ContentRenderer;
use MediaWiki\Content\Transform\ContentTransformer;
use MediaWiki\ParamValidator\TypeDef\UserDef;
use MediaWiki\Revision\RevisionRecord;
@ -57,6 +58,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
* @param SlotRoleRegistry $slotRoleRegistry
* @param NameTableStore $changeTagDefStore
* @param ActorMigration $actorMigration
* @param ContentRenderer $contentRenderer
* @param ContentTransformer $contentTransformer
*/
public function __construct(
@ -68,6 +70,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
SlotRoleRegistry $slotRoleRegistry,
NameTableStore $changeTagDefStore,
ActorMigration $actorMigration,
ContentRenderer $contentRenderer,
ContentTransformer $contentTransformer
) {
parent::__construct(
@ -78,6 +81,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
$contentHandlerFactory,
$parserFactory,
$slotRoleRegistry,
$contentRenderer,
$contentTransformer
);
$this->revisionStore = $revisionStore;

View file

@ -21,6 +21,7 @@
*/
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Content\Renderer\ContentRenderer;
use MediaWiki\Content\Transform\ContentTransformer;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
@ -73,6 +74,9 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
/** @var SlotRoleRegistry */
private $slotRoleRegistry;
/** @var ContentRenderer */
private $contentRenderer;
/** @var ContentTransformer */
private $contentTransformer;
@ -86,6 +90,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
* @param IContentHandlerFactory|null $contentHandlerFactory
* @param ParserFactory|null $parserFactory
* @param SlotRoleRegistry|null $slotRoleRegistry
* @param ContentRenderer|null $contentRenderer
* @param ContentTransformer|null $contentTransformer
*/
public function __construct(
@ -96,6 +101,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
IContentHandlerFactory $contentHandlerFactory = null,
ParserFactory $parserFactory = null,
SlotRoleRegistry $slotRoleRegistry = null,
ContentRenderer $contentRenderer = null,
ContentTransformer $contentTransformer = null
) {
parent::__construct( $queryModule, $moduleName, $paramPrefix );
@ -106,6 +112,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
$this->contentHandlerFactory = $contentHandlerFactory ?? $services->getContentHandlerFactory();
$this->parserFactory = $parserFactory ?? $services->getParserFactory();
$this->slotRoleRegistry = $slotRoleRegistry ?? $services->getSlotRoleRegistry();
$this->contentRenderer = $contentRenderer ?? $services->getContentRenderer();
$this->contentTransformer = $contentTransformer ?? $services->getContentTransformer();
}
@ -617,7 +624,8 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
}
}
if ( $this->parseContent ) {
$po = $content->getParserOutput(
$po = $this->contentRenderer->getParserOutput(
$content,
$title,
$revision->getId(),
ParserOptions::newFromContext( $this->getContext() )

View file

@ -252,8 +252,8 @@ class WikitextContent extends TextContent {
$context = RequestContext::getMain();
$title = $context->getTitle();
}
$po = $this->getParserOutput( $title, null, null, false );
$contentRenderer = MediaWikiServices::getInstance()->getContentRenderer();
$po = $contentRenderer->getParserOutput( $this, $title, null, null, false );
$links = $po->getLinks();
$hasLinks = !empty( $links );
}

View file

@ -159,9 +159,8 @@ class BenchmarkParse extends Maintenance {
*/
private function runParser( RevisionRecord $revision ) {
$content = $revision->getContent( SlotRecord::MAIN );
$title = Title::newFromLinkTarget( $revision->getPageAsLinkTarget() );
$content->getParserOutput( $title, $revision->getId() );
$contentRenderer = MediaWikiServices::getInstance()->getContentRenderer();
$contentRenderer->getParserOutput( $content, $revision->getPage(), $revision->getId() );
if ( $this->clearLinkCache ) {
$this->linkCache->clear();
}

View file

@ -114,7 +114,8 @@ class DumpRenderer extends Maintenance {
$options = ParserOptions::newFromUser( $user );
$content = $rev->getContent();
$output = $content->getParserOutput( $title, null, $options );
$contentRenderer = MediaWikiServices::getInstance()->getContentRenderer();
$output = $contentRenderer->getParserOutput( $content, $title, null, $options );
file_put_contents( $filename,
"<!DOCTYPE html>\n" .

View file

@ -5,7 +5,7 @@ namespace MediaWiki\Tests\Revision;
use Content;
use InvalidArgumentException;
use LogicException;
use MediaWiki\Page\PageIdentity;
use MediaWiki\Content\Renderer\ContentRenderer;
use MediaWiki\Page\PageIdentityValue;
use MediaWiki\Revision\MutableRevisionRecord;
use MediaWiki\Revision\MutableRevisionSlots;
@ -36,12 +36,17 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
/** @var callable */
private $combinerCallback;
/** @var ContentRenderer */
private $contentRenderer;
protected function setUp(): void {
parent::setUp();
$this->combinerCallback = function ( RenderedRevision $rr, array $hints = [] ) {
return $this->combineOutput( $rr, $hints );
};
$this->contentRenderer = $this->getServiceContainer()->getContentRenderer();
}
private function combineOutput( RenderedRevision $rrev, array $hints = [] ) {
@ -156,7 +161,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback,
RevisionRecord::FOR_THIS_USER
);
@ -172,7 +177,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -204,7 +209,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -223,7 +228,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -253,7 +258,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -283,7 +288,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -314,7 +319,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -334,7 +339,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback,
RevisionRecord::FOR_THIS_USER,
$this->mockRegisteredUltimateAuthority()
@ -368,7 +373,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback,
RevisionRecord::RAW
);
@ -406,7 +411,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -452,7 +457,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -490,8 +495,9 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->combinerCallback );
$this->contentRenderer,
$this->combinerCallback
);
// MutableRevisionRecord with ID should not be used by the parser,
// revision should be loaded instead!
@ -523,7 +529,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -565,7 +571,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -593,7 +599,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);
@ -638,7 +644,7 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase {
$rr = new RenderedRevision(
$rev,
$options,
$this->getServiceContainer()->getContentRenderer(),
$this->contentRenderer,
$this->combinerCallback
);

View file

@ -456,7 +456,8 @@ class ContentHandlerTest extends MediaWikiIntegrationTestCase {
$fields['testDataField'] = 'test content';
} );
$output = $page->getContent()->getParserOutput( $title );
$contentRenderer = $this->getServiceContainer()->getContentRenderer();
$output = $contentRenderer->getParserOutput( $page->getContent(), $title );
$data = $page->getContentHandler()->getDataForSearchIndex( $page, $output, $mockEngine );
$this->assertArrayHasKey( 'text', $data );
$this->assertArrayHasKey( 'text_bytes', $data );

View file

@ -7,6 +7,26 @@
*/
class FallbackContentHandlerTest extends MediaWikiLangTestCase {
private const CONTENT_MODEL = 'xyzzy';
protected function setUp(): void {
parent::setUp();
$this->mergeMwGlobalArrayValue(
'wgContentHandlers',
[ self::CONTENT_MODEL => FallbackContentHandler::class ]
);
}
/**
* @param string $data
* @param string $type
*
* @return FallbackContent
*/
public function newContent( $data, $type = self::CONTENT_MODEL ) {
return new FallbackContent( $data, $type );
}
/**
* @covers ContentHandler::getSlotDiffRenderer
*/
@ -24,4 +44,21 @@ class FallbackContentHandlerTest extends MediaWikiLangTestCase {
$this->assertNotEmpty( $diff );
}
/**
* @covers FallbackContentHandler::fillParserOutput
*/
public function testGetParserOutput() {
$this->setUserLang( 'en' );
$this->setContentLang( 'qqx' );
$title = Title::newFromText( 'Test' );
$content = $this->newContent( 'Horkyporky' );
$contentRenderer = $this->getServiceContainer()->getContentRenderer();
$po = $contentRenderer->getParserOutput( $content, $title );
$html = $po->getText();
$html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
$this->assertStringNotContainsString( 'Horkyporky', $html );
$this->assertStringNotContainsString( '(unsupported-content-model)', $html );
}
}

View file

@ -25,24 +25,6 @@ class FallbackContentTest extends MediaWikiLangTestCase {
return new FallbackContent( $data, $type );
}
/**
* @covers FallbackContent::getParserOutput
*/
public function testGetParserOutput() {
$this->setUserLang( 'en' );
$this->setContentLang( 'qqx' );
$title = Title::newFromText( 'Test' );
$content = $this->newContent( 'Horkyporky' );
$po = $content->getParserOutput( $title );
$html = $po->getText();
$html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
$this->assertStringNotContainsString( 'Horkyporky', $html );
$this->assertStringNotContainsString( '(unsupported-content-model)', $html );
}
/**
* @covers FallbackContent::getRedirectTarget
*/

View file

@ -1,12 +1,6 @@
<?php
/**
* See also unit tests at \MediaWiki\Tests\Unit\JsonContentTest
*
* @author Addshore
* @covers JsonContent
*/
class JsonContentTest extends MediaWikiLangTestCase {
class JsonContentHandlerIntegrationTest extends MediaWikiLangTestCase {
public function provideDataAndParserText() {
return [
@ -55,10 +49,13 @@ class JsonContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider provideDataAndParserText
* @covers JsonContentHandler::fillParserOutput
*/
public function testFillParserOutput( $data, $expected ) {
$obj = new JsonContent( FormatJson::encode( $data ) );
$parserOutput = $obj->getParserOutput(
$content = new JsonContent( FormatJson::encode( $data ) );
$contentRenderer = $this->getServiceContainer()->getContentRenderer();
$parserOutput = $contentRenderer->getParserOutput(
$content,
$this->createMock( Title::class ),
null,
null,

View file

@ -0,0 +1,45 @@
<?php
class TextContentHandlerIntegrationTest extends MediaWikiLangTestCase {
public static function provideGetParserOutput() {
yield 'Basic render' => [
'title' => 'TextContentTest_testGetParserOutput',
'model' => CONTENT_MODEL_TEXT,
'text' => "hello ''world'' & [[stuff]]\n",
'expectedHtml' => "hello ''world'' &amp; [[stuff]]",
'expectedFields' => [ 'Links' => [] ]
];
}
/**
* @dataProvider provideGetParserOutput
* @covers TextContentHandler::fillParserOutput
*/
public function testGetParserOutput( $title, $model, $text, $expectedHtml,
$expectedFields = null
) {
$title = Title::newFromText( $title );
$content = ContentHandler::makeContent( $text, $title, $model );
$contentRenderer = $this->getServiceContainer()->getContentRenderer();
$po = $contentRenderer->getParserOutput( $content, $title );
$html = $po->getText();
$html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
$this->assertEquals( $expectedHtml, trim( $html ) );
if ( $expectedFields ) {
foreach ( $expectedFields as $field => $exp ) {
$getter = 'get' . ucfirst( $field );
$v = $po->$getter();
if ( is_array( $exp ) ) {
$this->assertArrayEquals( $exp, $v );
} else {
$this->assertEquals( $exp, $v );
}
}
}
}
}

View file

@ -44,53 +44,6 @@ class TextContentTest extends MediaWikiLangTestCase {
return new TextContent( $text );
}
public static function dataGetParserOutput() {
return [
[
'TextContentTest_testGetParserOutput',
CONTENT_MODEL_TEXT,
"hello ''world'' & [[stuff]]\n", "hello ''world'' &amp; [[stuff]]",
[
'Links' => []
]
],
// TODO: more...?
];
}
/**
* @dataProvider dataGetParserOutput
* @covers TextContent::getParserOutput
*/
public function testGetParserOutput( $title, $model, $text, $expectedHtml,
$expectedFields = null
) {
$title = Title::newFromText( $title );
$content = ContentHandler::makeContent( $text, $title, $model );
$po = $content->getParserOutput( $title );
$html = $po->getText();
$html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
$this->assertEquals( $expectedHtml, trim( $html ) );
if ( $expectedFields ) {
foreach ( $expectedFields as $field => $exp ) {
$getter = 'get' . ucfirst( $field );
$v = $po->$getter();
if ( is_array( $exp ) ) {
$this->assertArrayEquals( $exp, $v );
} else {
$this->assertEquals( $exp, $v );
}
}
}
// TODO: assert more properties
}
public static function dataGetRedirectTarget() {
return [
[ '#REDIRECT [[Test]]',

View file

@ -1,6 +1,7 @@
<?php
use MediaWiki\MediaWikiServices;
use MediaWiki\Page\PageReferenceValue;
/**
* See also unit tests at \MediaWiki\Tests\Unit\WikitextContentHandlerTest
@ -293,4 +294,25 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
$this->assertEquals( 'This is file content', $data['file_text'] );
}
/**
* @covers WikitextContentHandler::fillParserOutput
*/
public function testHadSignature() {
$services = $this->getServiceContainer();
$contentTransformer = $services->getContentTransformer();
$contentRenderer = $services->getContentRenderer();
$this->hideDeprecated( 'AbstractContent::preSaveTransform' );
$pageObj = PageReferenceValue::localReference( NS_MAIN, __CLASS__ );
$content = new WikitextContent( '~~~~' );
$pstContent = $contentTransformer->preSaveTransform(
$content,
$pageObj,
$this->getTestUser()->getUser(),
ParserOptions::newFromAnon()
);
$this->assertTrue( $contentRenderer->getParserOutput( $pstContent, $pageObj )->getFlag( 'user-signature' ) );
}
}

View file

@ -288,6 +288,7 @@ just a test"
*/
public function testRedirectParserOption() {
$title = Title::newFromText( 'testRedirectParserOption' );
$contentRenderer = $this->getServiceContainer()->getContentRenderer();
// Set up hook and its reporting variables
$wikitext = null;
@ -307,7 +308,7 @@ just a test"
$content = $this->newContent( 'hello world.' );
$options = ParserOptions::newCanonical( 'canonical' );
$options->setRedirectTarget( $title );
$content->getParserOutput( $title, null, $options );
$contentRenderer->getParserOutput( $content, $title, null, $options );
$this->assertEquals( 'hello world.', $wikitext,
'Wikitext passed to hook was not as expected'
);
@ -323,7 +324,7 @@ just a test"
"#REDIRECT [[TestRedirectParserOption/redir]]\nhello redirect."
);
$options = ParserOptions::newCanonical( 'canonical' );
$content->getParserOutput( $title, null, $options );
$contentRenderer->getParserOutput( $content, $title, null, $options );
$this->assertEquals(
'hello redirect.',
$wikitext,
@ -367,22 +368,4 @@ just a test"
// @todo more...?
];
}
/**
* @covers WikitextContent::fillParserOutput
*/
public function testHadSignature() {
$this->hideDeprecated( 'AbstractContent::preSaveTransform' );
$titleObj = Title::newFromText( __CLASS__ );
$content = new WikitextContent( '~~~~' );
$pstContent = $content->preSaveTransform(
$titleObj,
$this->getTestUser()->getUser(),
ParserOptions::newFromAnon()
);
$this->assertTrue( $pstContent->getParserOutput( $titleObj )->getFlag( 'user-signature' ) );
}
}

View file

@ -12,7 +12,8 @@ class WikitextStructureTest extends MediaWikiLangTestCase {
*/
private function getStructure( $text ) {
$content = new WikitextContent( $text );
$parserOutput = $content->getParserOutput( Title::newFromText( 'TestTitle' ) );
$contentRenderer = $this->getServiceContainer()->getContentRenderer();
$parserOutput = $contentRenderer->getParserOutput( $content, Title::newFromText( 'TestTitle' ) );
return new WikiTextStructure( $parserOutput );
}