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

Reply via email to