Prevent white page in BookNavigation block blockAccess if Node is not a book
>>> [!note] Migrated issue
<!-- Drupal.org comment -->
<!-- Migrated from issue #3585615. -->
Reported by: [scorpionghost](https://www.drupal.org/user/1580648)
Related to !173
>>>
<h3 id="summary-problem-motivation">Problem/Motivation</h3>
<p>If the BlockNavigation block is not configured to be shown on all pages, Nodes that are not books where the block is rendered will display a white page.</p>
<h4 id="summary-steps-reproduce">Steps to reproduce</h4>
<ol>
<li>Add a book navigation block to a region. Make sure to <em>not</em> select a value different from "Show block on all pages" as configuration for "Book navigation block display".
</li>
<li>Go to a Node that is <em>not</em> configured to be a book page.</li>
</ol>
<h5 id="summary-steps-reproduce">Expected result</h5>
<p>Node shown as usual.</p>
<h5 id="summary-steps-reproduce">Actual result</h5>
<p>White page with error message. See below for a stack trace.</p>
<h3 id="summary-proposed-resolution">Proposed resolution</h3>
<p>Check, whether the Node implements BookInterface in blockAccess before calling a method from that interface.</p>
<h4>Stack trace provided by original reporter</h4>
<p>Error: Call to undefined method Drupal\node\Entity\Node::getBook() in Drupal\book\Plugin\Block\BookNavigationBlock->blockAccess() (line 310 of web\modules\contrib\book\src\Plugin\Block\BookNavigationBlock.php).</p>
<p>#0 web\core\lib\Drupal\Core\Block\BlockPluginTrait.php(127): Drupal\book\Plugin\Block\BookNavigationBlock->blockAccess(Object(Drupal\Core\Session\AccountProxy))<br>
#1 web\core\modules\block\src\BlockAccessControlHandler.php(124): Drupal\Core\Block\BlockBase->access(Object(Drupal\Core\Session\AccountProxy), true)<br>
#2 web\core\lib\Drupal\Core\Entity\EntityAccessControlHandler.php(109): Drupal\block\BlockAccessControlHandler->checkAccess(Object(Drupal\block\Entity\Block), 'view', Object(Drupal\Core\Session\AccountProxy))<br>
#3 web\core\lib\Drupal\Core\Entity\EntityBase.php(345): Drupal\Core\Entity\EntityAccessControlHandler->access(Object(Drupal\block\Entity\Block), 'view', Object(Drupal\Core\Session\AccountProxy), true)<br>
#4 web\core\modules\block\src\BlockRepository.php(63): Drupal\Core\Entity\EntityBase->access('view', NULL, true)<br>
#5 web\core\modules\block\src\Plugin\DisplayVariant\BlockPageVariant.php(138): Drupal\block\BlockRepository->getVisibleBlocksPerRegion(Array)<br>
#6 web\core\lib\Drupal\Core\Render\MainContent\HtmlRenderer.php(274): Drupal\block\Plugin\DisplayVariant\BlockPageVariant->build()<br>
#7 web\core\lib\Drupal\Core\Render\MainContent\HtmlRenderer.php(131): Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object(Symfony\Component\HttpFoundation\Request), Object(Drupal\Core\Routing\CurrentRouteMatch))<br>
#8 web\core\lib\Drupal\Core\EventSubscriber\MainContentViewSubscriber.php(90): Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object(Symfony\Component\HttpFoundation\Request), Object(Drupal\Core\Routing\CurrentRouteMatch))<br>
#9 vendor\symfony\event-dispatcher\EventDispatcher.php(246): Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object(Symfony\Component\HttpKernel\Event\ViewEvent), 'kernel.view', Object(Symfony\Component\EventDispatcher\EventDispatcher))<br>
#10 vendor\symfony\event-dispatcher\EventDispatcher.php(206): Symfony\Component\EventDispatcher\EventDispatcher::{closure:Symfony\Component\EventDispatcher\EventDispatcher::optimizeListeners():241}(Object(Symfony\Component\HttpKernel\Event\ViewEvent), 'kernel.view', Object(Symfony\Component\EventDispatcher\EventDispatcher))<br>
#11 vendor\symfony\event-dispatcher\EventDispatcher.php(56): Symfony\Component\EventDispatcher\EventDispatcher->callListeners(Array, 'kernel.view', Object(Symfony\Component\HttpKernel\Event\ViewEvent))<br>
#12 vendor\symfony\http-kernel\HttpKernel.php(188): Symfony\Component\EventDispatcher\EventDispatcher->dispatch(Object(Symfony\Component\HttpKernel\Event\ViewEvent), 'kernel.view')<br>
#13 vendor\symfony\http-kernel\HttpKernel.php(76): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)<br>
#14 web\core\lib\Drupal\Core\StackMiddleware\Session.php(53): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#15 web\core\lib\Drupal\Core\StackMiddleware\KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#16 web\core\lib\Drupal\Core\StackMiddleware\ContentLength.php(28): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#17 web\core\modules\big_pipe\src\StackMiddleware\ContentLength.php(32): Drupal\Core\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#18 web\core\modules\page_cache\src\StackMiddleware\PageCache.php(203): Drupal\big_pipe\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#19 web\core\modules\page_cache\src\StackMiddleware\PageCache.php(140): Drupal\page_cache\StackMiddleware\PageCache->fetch(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#20 web\core\modules\page_cache\src\StackMiddleware\PageCache.php(89): Drupal\page_cache\StackMiddleware\PageCache->lookup(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#21 web\core\lib\Drupal\Core\StackMiddleware\ReverseProxyMiddleware.php(48): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#22 web\core\lib\Drupal\Core\StackMiddleware\NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#23 web\core\lib\Drupal\Core\StackMiddleware\AjaxPageState.php(53): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#24 web\core\lib\Drupal\Core\StackMiddleware\StackedHttpKernel.php(54): Drupal\Core\StackMiddleware\AjaxPageState->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#25 web\core\lib\Drupal\Core\DrupalKernel.php(745): Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)<br>
#26 web\index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))<br>
#27 {main}</p>
issue