diff --git a/RELEASE-NOTES-1.38 b/RELEASE-NOTES-1.38 index abe46c326a4..109b4eca526 100644 --- a/RELEASE-NOTES-1.38 +++ b/RELEASE-NOTES-1.38 @@ -213,9 +213,10 @@ because of Phabricator reports. * The following methods from the User class now trigger deprecation warnings: - ::blockedBy - ::getBlockId -* Content::getParserOutput() was deprecated. - Use ContentRenderer::getParserOutput and override - ContentHandler::fillParserOutput instead. +* Content::getParserOutput and AbstractContent::fillParserOutput + was hard-deprecated, use ContentRenderer::getParserOutput instead. + Extensions defining a content model should + override ContentHandler::fillParserOutput. * Article::doDelete() was deprecated. Use WikiPage::doDeleteArticleReal if you only need to delete the article. If you also need things to happen with OutputPage, you may want to check the hooks in DeleteAction instead. diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php index 4f1e436a31d..7ee013a68b4 100644 --- a/includes/content/AbstractContent.php +++ b/includes/content/AbstractContent.php @@ -519,7 +519,7 @@ abstract class AbstractContent implements Content { * ContentGetParserOutput hook. * * @since 1.24 - * @deprecated since 1.38. Use ContentRenderer::getParserOutput instead. + * @deprecated since 1.38. Hard-deprecated since 1.38. Use ContentRenderer::getParserOutput instead. * Extensions defining a content model should override ContentHandler::fillParserOutput. * @param Title $title Context title for parsing * @param int|null $revId Revision ID being rendered @@ -531,15 +531,18 @@ abstract class AbstractContent implements Content { public function getParserOutput( Title $title, $revId = null, ParserOptions $options = null, $generateHtml = true ) { + wfDeprecated( __METHOD__, '1.38' ); $detectGPODeprecatedOverride = MWDebug::detectDeprecatedOverride( $this, self::class, - 'getParserOutput' + 'getParserOutput', + '1.38' ); $detectFPODeprecatedOverride = MWDebug::detectDeprecatedOverride( $this, self::class, - 'fillParserOutput' + 'fillParserOutput', + '1.38' ); if ( $detectGPODeprecatedOverride || $detectFPODeprecatedOverride ) { @@ -585,7 +588,7 @@ abstract class AbstractContent implements Content { * This placeholder implementation always throws an exception. * * @since 1.24 - * @deprecated since 1.37. Use ContentHandler::fillParserOutput instead. + * @deprecated since 1.38. Hard-deprecated since 1.38. Use ContentHandler::fillParserOutput instead. * @param Title $title Context title for parsing * @param int|null $revId ID of the revision being rendered. * See Parser::parse() for the ramifications. @@ -598,6 +601,7 @@ abstract class AbstractContent implements Content { protected function fillParserOutput( Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output ) { + wfDeprecated( __METHOD__, '1.38' ); $cpoParams = new ContentParseParams( $title, $revId, $options, $generateHtml ); return $this->getContentHandler()->fillParserOutputInternal( $this, $cpoParams, $output ); } diff --git a/includes/content/Content.php b/includes/content/Content.php index 9dfb01746f0..d860e66cd2f 100644 --- a/includes/content/Content.php +++ b/includes/content/Content.php @@ -268,7 +268,7 @@ interface Content { * @note To control which options are used in the cache key for the * generated parser output, implementations of this method * may call ParserOutput::recordOption() on the output object. - * @deprecated since 1.38. Use ContentRenderer::getParserOutput + * @deprecated since 1.38. Hard-deprecated since 1.38. Use ContentRenderer::getParserOutput * and override ContentHandler::fillParserOutput. * @param Title $title The page title to use as a context for rendering. * @param int|null $revId ID of the revision being rendered. diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php index cc626fbf1fb..1d096e08f52 100644 --- a/includes/content/ContentHandler.php +++ b/includes/content/ContentHandler.php @@ -1635,12 +1635,14 @@ abstract class ContentHandler { $detectGPODeprecatedOverride = MWDebug::detectDeprecatedOverride( $content, AbstractContent::class, - 'getParserOutput' + 'getParserOutput', + '1.38' ); $detectFPODeprecatedOverride = MWDebug::detectDeprecatedOverride( $content, AbstractContent::class, - 'fillParserOutput' + 'fillParserOutput', + '1.38' ); if ( $detectGPODeprecatedOverride || $detectFPODeprecatedOverride ) { return $this->callDeprecatedContentGPO( $content, $cpoParams ); diff --git a/tests/phpunit/includes/Revision/RenderedRevisionTest.php b/tests/phpunit/includes/Revision/RenderedRevisionTest.php index 7498f600d0e..a471b72af35 100644 --- a/tests/phpunit/includes/Revision/RenderedRevisionTest.php +++ b/tests/phpunit/includes/Revision/RenderedRevisionTest.php @@ -7,6 +7,7 @@ use InvalidArgumentException; use LogicException; use MediaWiki\Content\Renderer\ContentRenderer; use MediaWiki\Page\PageIdentityValue; +use MediaWiki\Page\PageReference; use MediaWiki\Revision\MutableRevisionRecord; use MediaWiki\Revision\MutableRevisionSlots; use MediaWiki\Revision\RenderedRevision; @@ -22,7 +23,6 @@ use MediaWikiIntegrationTestCase; use ParserOptions; use ParserOutput; use PHPUnit\Framework\MockObject\MockObject; -use Title; use TitleValue; use Wikimedia\TestingAccessWrapper; use WikitextContent; @@ -544,13 +544,15 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase { } public function testNoHtml() { - /** @var MockObject|Content $mockContent */ - $mockContent = $this->getMockBuilder( WikitextContent::class ) + $content = new WikitextContent( 'whatever' ); + + /** @var MockObject|ContentRenderer $mockContentRenderer */ + $mockContentRenderer = $this->getMockBuilder( ContentRenderer::class ) ->onlyMethods( [ 'getParserOutput' ] ) - ->setConstructorArgs( [ 'Whatever' ] ) + ->disableOriginalConstructor() ->getMock(); - $mockContent->method( 'getParserOutput' ) - ->willReturnCallback( function ( Title $title, $revId = null, + $mockContentRenderer->method( 'getParserOutput' ) + ->willReturnCallback( function ( Content $content, PageReference $page, $revId = null, ParserOptions $options = null, $generateHtml = true ) { if ( !$generateHtml ) { @@ -564,14 +566,14 @@ class RenderedRevisionTest extends MediaWikiIntegrationTestCase { $rev = new MutableRevisionRecord( PageIdentityValue::localIdentity( 7, NS_MAIN, 'RenderTestPage' ) ); - $rev->setContent( SlotRecord::MAIN, $mockContent ); - $rev->setContent( 'aux', $mockContent ); + $rev->setContent( SlotRecord::MAIN, $content ); + $rev->setContent( 'aux', $content ); $options = ParserOptions::newCanonical( 'canonical' ); $rr = new RenderedRevision( $rev, $options, - $this->contentRenderer, + $mockContentRenderer, $this->combinerCallback ); diff --git a/tests/phpunit/includes/Revision/RevisionRendererTest.php b/tests/phpunit/includes/Revision/RevisionRendererTest.php index 676dbba19b3..a174040693a 100644 --- a/tests/phpunit/includes/Revision/RevisionRendererTest.php +++ b/tests/phpunit/includes/Revision/RevisionRendererTest.php @@ -6,8 +6,10 @@ use CommentStoreComment; use Content; use LogicException; use MediaWiki\Content\IContentHandlerFactory; +use MediaWiki\Content\Renderer\ContentRenderer; use MediaWiki\HookContainer\HookContainer; use MediaWiki\Page\PageIdentityValue; +use MediaWiki\Page\PageReference; use MediaWiki\Revision\MainSlotRoleHandler; use MediaWiki\Revision\MutableRevisionRecord; use MediaWiki\Revision\RevisionRecord; @@ -21,7 +23,6 @@ use MediaWikiIntegrationTestCase; use ParserOptions; use ParserOutput; use PHPUnit\Framework\MockObject\MockObject; -use Title; use TitleFactory; use Wikimedia\Rdbms\DBConnRef; use Wikimedia\Rdbms\IDatabase; @@ -65,10 +66,16 @@ class RevisionRendererTest extends MediaWikiIntegrationTestCase { /** * @param int $maxRev * @param bool $usePrimary + * @param ContentRenderer|null $contentRenderer * @return RevisionRenderer */ - private function newRevisionRenderer( $maxRev = 100, $usePrimary = false ) { + private function newRevisionRenderer( + $maxRev = 100, + $usePrimary = false, + $contentRenderer = null + ) { $dbIndex = $usePrimary ? DB_PRIMARY : DB_REPLICA; + $cr = $contentRenderer ?? $this->getServiceContainer()->getContentRenderer(); /** @var ILoadBalancer|MockObject $lb */ $lb = $this->createMock( ILoadBalancer::class ); @@ -100,7 +107,7 @@ class RevisionRendererTest extends MediaWikiIntegrationTestCase { } ); $roleReg->defineRoleWithModel( 'aux', CONTENT_MODEL_WIKITEXT ); - return new RevisionRenderer( $lb, $roleReg, $this->getServiceContainer()->getContentRenderer() ); + return new RevisionRenderer( $lb, $roleReg, $cr ); } private function selectFieldCallback( $table, $fields, $cond, $maxRev ) { @@ -436,13 +443,15 @@ class RevisionRendererTest extends MediaWikiIntegrationTestCase { } public function testGetRenderedRevision_noHtml() { - /** @var MockObject|Content $mockContent */ - $mockContent = $this->getMockBuilder( WikitextContent::class ) + $content = new WikitextContent( 'Whatever' ); + + /** @var MockObject|ContentRenderer $mockContentRenderer */ + $mockContentRenderer = $this->getMockBuilder( ContentRenderer::class ) ->onlyMethods( [ 'getParserOutput' ] ) - ->setConstructorArgs( [ 'Whatever' ] ) + ->disableOriginalConstructor() ->getMock(); - $mockContent->method( 'getParserOutput' ) - ->willReturnCallback( function ( Title $title, $revId = null, + $mockContentRenderer->method( 'getParserOutput' ) + ->willReturnCallback( function ( Content $content, PageReference $page, $revId = null, ParserOptions $options = null, $generateHtml = true ) { if ( !$generateHtml ) { @@ -453,11 +462,11 @@ class RevisionRendererTest extends MediaWikiIntegrationTestCase { } } ); - $renderer = $this->newRevisionRenderer(); + $renderer = $this->newRevisionRenderer( 100, false, $mockContentRenderer ); $rev = new MutableRevisionRecord( $this->fakePage ); - $rev->setContent( SlotRecord::MAIN, $mockContent ); - $rev->setContent( 'aux', $mockContent ); + $rev->setContent( SlotRecord::MAIN, $content ); + $rev->setContent( 'aux', $content ); // NOTE: we are testing the private combineSlotOutput() callback here. $rr = $renderer->getRenderedRevision( $rev ); diff --git a/tests/phpunit/includes/page/WikiPageDbTest.php b/tests/phpunit/includes/page/WikiPageDbTest.php index 8fb3a44a8a6..2730e2ec714 100644 --- a/tests/phpunit/includes/page/WikiPageDbTest.php +++ b/tests/phpunit/includes/page/WikiPageDbTest.php @@ -1,5 +1,6 @@ getTestUser()->getUser(); $page = $this->newPage( __METHOD__, __METHOD__ ); + $content = new WikitextContent( 'Hello World' ); - /** @var Content $content */ - $content = $this->getMockBuilder( WikitextContent::class ) - ->setConstructorArgs( [ 'Hello World' ] ) + /** @var ContentRenderer $contentRenderer */ + $contentRenderer = $this->getMockBuilder( ContentRenderer::class ) ->onlyMethods( [ 'getParserOutput' ] ) + ->disableOriginalConstructor() ->getMock(); - $content->expects( $this->once() ) + $contentRenderer->expects( $this->once() ) ->method( 'getParserOutput' ) ->willReturn( new ParserOutput( 'HTML' ) ); + $this->setService( 'ContentRenderer', $contentRenderer ); + $preparedEditBefore = $page->prepareContentForEdit( $content, null, $user ); // provide context, so the cache can be kept in place