Merge "EventDispatcher: Ensure we fetch page content from the primary database"

This commit is contained in:
jenkins-bot 2021-07-01 16:29:41 +00:00 committed by Gerrit Code Review
commit cced58b5cc

View file

@ -9,11 +9,9 @@
namespace MediaWiki\Extension\DiscussionTools\Notifications; namespace MediaWiki\Extension\DiscussionTools\Notifications;
use ApiMain;
use DOMElement; use DOMElement;
use EchoEvent; use EchoEvent;
use Error; use Error;
use FauxRequest;
use IDBAccessObject; use IDBAccessObject;
use Iterator; use Iterator;
use MediaWiki\Extension\DiscussionTools\CommentParser; use MediaWiki\Extension\DiscussionTools\CommentParser;
@ -22,30 +20,37 @@ use MediaWiki\Extension\DiscussionTools\SubscriptionItem;
use MediaWiki\MediaWikiServices; use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\RevisionRecord; use MediaWiki\Revision\RevisionRecord;
use MediaWiki\User\UserIdentity; use MediaWiki\User\UserIdentity;
use ParserOptions;
use Title; use Title;
use Wikimedia\Assert\Assert;
use Wikimedia\Parsoid\Utils\DOMUtils; use Wikimedia\Parsoid\Utils\DOMUtils;
class EventDispatcher { class EventDispatcher {
/** /**
* @param RevisionRecord $revision * @param RevisionRecord $revRecord
* @return CommentParser * @return CommentParser
*/ */
private static function getParsedRevision( RevisionRecord $revision ) : CommentParser { private static function getParsedRevision( RevisionRecord $revRecord ) : CommentParser {
$api = new ApiMain( $services = MediaWikiServices::getInstance();
new FauxRequest(
[ $pageRecord = $services->getPageStore()->getPageByReference( $revRecord->getPage() );
'action' => 'parse', Assert::postcondition( $pageRecord !== null, 'Revision had no page' );
'oldid' => $revision->getId()
], // If the $revRecord was fetched from the primary database, this will also fetch the content
/* was posted? */ true // from the primary database (using the same query flags)
), $status = $services->getParserOutputAccess()->getParserOutput(
/* enable write? */ true $pageRecord,
ParserOptions::newCanonical( 'canonical' ),
$revRecord
); );
if ( !$status->isOK() ) {
throw new Error( 'Could not load revision for notifications' );
}
$api->execute(); $parserOutput = $status->getValue();
$data = $api->getResult()->getResultData(); $html = $parserOutput->getText();
$doc = DOMUtils::parseHTML( $data['parse']['text'] ); $doc = DOMUtils::parseHTML( $html );
$container = $doc->getElementsByTagName( 'body' )->item( 0 ); $container = $doc->getElementsByTagName( 'body' )->item( 0 );
if ( !( $container instanceof DOMElement ) ) { if ( !( $container instanceof DOMElement ) ) {
throw new Error( 'Could not load revision for notifications' ); throw new Error( 'Could not load revision for notifications' );