From 37d6825c148f0b796c31ad834a40261a8aba5885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Dziewo=C5=84ski?= Date: Wed, 30 Jun 2021 22:24:29 +0200 Subject: [PATCH] EventDispatcher: Ensure we fetch page content from the primary database We used an internal API requests to fetch page content because it was easy, but there's no way to guarantee that it returns data from the primary database. Use ParserOutputAccess::getParserOutput() to fetch from cache if available. Also, use canonical output instead of user-specific, not that it should matter. Bug: T285895 Change-Id: I7dcd9659be77746dc2a0c4eeae2319887936b555 --- includes/Notifications/EventDispatcher.php | 37 ++++++++++++---------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/includes/Notifications/EventDispatcher.php b/includes/Notifications/EventDispatcher.php index 3c9139563..a2596911d 100644 --- a/includes/Notifications/EventDispatcher.php +++ b/includes/Notifications/EventDispatcher.php @@ -9,11 +9,9 @@ namespace MediaWiki\Extension\DiscussionTools\Notifications; -use ApiMain; use DOMElement; use EchoEvent; use Error; -use FauxRequest; use IDBAccessObject; use Iterator; use MediaWiki\Extension\DiscussionTools\CommentParser; @@ -22,30 +20,37 @@ use MediaWiki\Extension\DiscussionTools\SubscriptionItem; use MediaWiki\MediaWikiServices; use MediaWiki\Revision\RevisionRecord; use MediaWiki\User\UserIdentity; +use ParserOptions; use Title; +use Wikimedia\Assert\Assert; use Wikimedia\Parsoid\Utils\DOMUtils; class EventDispatcher { /** - * @param RevisionRecord $revision + * @param RevisionRecord $revRecord * @return CommentParser */ - private static function getParsedRevision( RevisionRecord $revision ) : CommentParser { - $api = new ApiMain( - new FauxRequest( - [ - 'action' => 'parse', - 'oldid' => $revision->getId() - ], - /* was posted? */ true - ), - /* enable write? */ true + private static function getParsedRevision( RevisionRecord $revRecord ) : CommentParser { + $services = MediaWikiServices::getInstance(); + + $pageRecord = $services->getPageStore()->getPageByReference( $revRecord->getPage() ); + Assert::postcondition( $pageRecord !== null, 'Revision had no page' ); + + // If the $revRecord was fetched from the primary database, this will also fetch the content + // from the primary database (using the same query flags) + $status = $services->getParserOutputAccess()->getParserOutput( + $pageRecord, + ParserOptions::newCanonical( 'canonical' ), + $revRecord ); + if ( !$status->isOK() ) { + throw new Error( 'Could not load revision for notifications' ); + } - $api->execute(); - $data = $api->getResult()->getResultData(); + $parserOutput = $status->getValue(); + $html = $parserOutput->getText(); - $doc = DOMUtils::parseHTML( $data['parse']['text'] ); + $doc = DOMUtils::parseHTML( $html ); $container = $doc->getElementsByTagName( 'body' )->item( 0 ); if ( !( $container instanceof DOMElement ) ) { throw new Error( 'Could not load revision for notifications' );