jenkins-bot has submitted this change and it was merged. Change subject: Fix fatal error in OutputPageBeforeHTMLHookHandler ......................................................................
Fix fatal error in OutputPageBeforeHTMLHookHandler Check that we have valid EntityId and EntityRevision objects before trying to load an Entity from EntityRevision. There are cases (e.g. an admin viewing a revision of a deleted item) where the EntityId is not available or an EntityRevision is not found. Bug: T132645 Change-Id: I839b7ccbd81de8ed8ac738130b524b7de3612325 --- M repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php 1 file changed, 62 insertions(+), 18 deletions(-) Approvals: Thiemo Mättig (WMDE): Looks good to me, approved jenkins-bot: Verified diff --git a/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php b/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php index 133497b..aa3ad4a 100644 --- a/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php +++ b/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php @@ -3,7 +3,11 @@ namespace Wikibase\Repo\Hooks; use OutputPage; +use User; +use Wikibase\DataModel\Entity\EntityDocument; +use Wikibase\DataModel\Entity\EntityId; use Wikibase\DataModel\Term\AliasesProvider; +use Wikibase\EntityRevision; use Wikibase\Lib\ContentLanguages; use Wikibase\Lib\LanguageNameLookup; use Wikibase\Lib\Store\EntityRevisionLookup; @@ -126,16 +130,7 @@ $placeholders = $out->getProperty( 'wikibase-view-chunks' ); if ( !empty( $placeholders ) ) { - // All user languages that are valid term languages - $termsLanguages = array_intersect( - $this->userLanguageLookup->getAllUserLanguages( $out->getUser() ), - $this->termsLanguages->getLanguages() - ); - - $injector = new TextInjector( $placeholders ); - $expander = $this->getEntityViewPlaceholderExpander( $out, $termsLanguages ); - - $html = $injector->inject( $html, array( $expander, 'getHtmlForPlaceholder' ) ); + $this->replacePlaceholders( $placeholders, $out, $html ); $out->addJsConfigVars( 'wbUserSpecifiedLanguages', @@ -151,30 +146,79 @@ } /** + * @param string[] $placeholders * @param OutputPage $out + * @param string &$html + */ + private function replacePlaceholders( array $placeholders, OutputPage $out, &$html ) { + $injector = new TextInjector( $placeholders ); + $entityId = $this->outputPageEntityIdReader->getEntityIdFromOutputPage( $out ); + + if ( $entityId instanceof EntityId ) { + $entityRev = $this->entityRevisionLookup->getEntityRevision( + $entityId, + $out->getRevisionId() + ); + + if ( $entityRev instanceof EntityRevision ) { + $expander = $this->getEntityViewPlaceholderExpander( + $entityRev->getEntity(), + $out->getUser(), + $this->getTermsLanguagesCodes( $out ), + $out->getLanguage()->getCode() + ); + + $html = $injector->inject( $html, [ $expander, 'getHtmlForPlaceholder' ] ); + + return; + } + } + + $html = $injector->inject( $html, function() { + return ''; + } ); + } + + /** + * @param OutputPage $out + * + * @return string[] + */ + private function getTermsLanguagesCodes( OutputPage $out ) { + // All user languages that are valid term languages + return array_intersect( + $this->userLanguageLookup->getAllUserLanguages( $out->getUser() ), + $this->termsLanguages->getLanguages() + ); + } + + /** + * @param EntityDocument $entity + * @param User $user * @param string[] $termsLanguages + * @param string $languageCode * * @return EntityViewPlaceholderExpander */ - private function getEntityViewPlaceholderExpander( OutputPage $out, array $termsLanguages ) { - $languageCode = $out->getLanguage()->getCode(); - - $entityId = $this->outputPageEntityIdReader->getEntityIdFromOutputPage( $out ); - $revisionId = $out->getRevisionId(); - $entity = $this->entityRevisionLookup->getEntityRevision( $entityId, $revisionId )->getEntity(); + private function getEntityViewPlaceholderExpander( + EntityDocument $entity, + User $user, + array $termsLanguages, + $languageCode + ) { $labelsProvider = $entity; $descriptionsProvider = $entity; $aliasesProvider = $entity instanceof AliasesProvider ? $entity : null; return new EntityViewPlaceholderExpander( $this->templateFactory, - $out->getUser(), + $user, $labelsProvider, $descriptionsProvider, $aliasesProvider, array_merge( [ $languageCode ], $termsLanguages ), $this->languageNameLookup, - new MediaWikiLocalizedTextProvider( $out->getLanguage()->getCode() ) + new MediaWikiLocalizedTextProvider( $languageCode ) ); } -- To view, visit https://gerrit.wikimedia.org/r/285289 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I839b7ccbd81de8ed8ac738130b524b7de3612325 Gerrit-PatchSet: 2 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Adrian Heine <adrian.l...@wikimedia.de> Gerrit-Reviewer: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de> Gerrit-Reviewer: JanZerebecki <jan.wikime...@zerebecki.de> Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits