Aude has uploaded a new change for review. https://gerrit.wikimedia.org/r/285289
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, 58 insertions(+), 18 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/89/285289/1 diff --git a/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php b/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php index 133497b..1da8940 100644 --- a/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php +++ b/repo/includes/Hooks/OutputPageBeforeHTMLHookHandler.php @@ -3,7 +3,10 @@ namespace Wikibase\Repo\Hooks; use OutputPage; +use User; +use Wikibase\DataModel\Entity\EntityDocument; use Wikibase\DataModel\Term\AliasesProvider; +use Wikibase\EntityRevision; use Wikibase\Lib\ContentLanguages; use Wikibase\Lib\LanguageNameLookup; use Wikibase\Lib\Store\EntityRevisionLookup; @@ -126,16 +129,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 +145,76 @@ } /** + * @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 !== null ) { + $entityRev = $this->entityRevisionLookup->getEntityRevision( + $entityId, + $out->getRevisionId() + ); + + if ( $entityRev instanceof EntityRevision ) { + // All user languages that are valid term languages + $termsLanguages = array_intersect( + $this->userLanguageLookup->getAllUserLanguages( $out->getUser() ), + $this->termsLanguages->getLanguages() + ); + + $expander = $this->getEntityViewPlaceholderExpander( + $entityRev->getEntity(), + $out->getUser(), + $termsLanguages, + $out->getLanguage()->getCode() + ); + + $html = $injector->inject( $html, [ $expander, 'getHtmlForPlaceholder' ] ); + + return; + } + } + + $html = $injector->inject( + $html, + function() { + return ''; + } + ); + } + + /** + * @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: newchange Gerrit-Change-Id: I839b7ccbd81de8ed8ac738130b524b7de3612325 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Aude <aude.w...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits