diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 43c65f590bc..a81102fd56a 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -13,6 +13,8 @@ use Drupal\Core\Access\AccessResult; use Drupal\Core\Batch\BatchBuilder; use Drupal\Core\Cache\Cache; +use Drupal\Core\Cache\CacheableMetadata; +use Drupal\Core\Cache\RefinableCacheableDependencyInterface; use Drupal\Core\Database\Query\AlterableInterface; use Drupal\Core\Database\Query\SelectInterface; use Drupal\Core\Database\StatementInterface; @@ -404,10 +406,18 @@ function node_revision_delete($revision_id) { */ function node_is_page(NodeInterface $node) { $route_match = \Drupal::routeMatch(); - if ($route_match->getRouteName() == 'entity.node.canonical') { + if ($route_match->getRouteName() == 'entity.node.canonical' || $route_match->getRouteName() == 'entity.node.revision') { $page_node = $route_match->getParameter('node'); + // The Node's node parameter is typically a Node object. + if (is_a($page_node, 'Drupal\node\Entity\Node')) { + $nid = $page_node->id(); + } + // The Node Revision's node parameter is typically a string. + elseif (is_string($page_node)) { + $nid = $page_node; + } } - return (!empty($page_node) ? $page_node->id() == $node->id() : FALSE); + return (!empty($nid) ? $nid == $node->id() : FALSE); } /** @@ -1337,3 +1347,23 @@ function node_node_type_presave(NodeTypeInterface $node_type) { $node_type->set('help', NULL); } } + +/** + * Implements hook_menu_local_tasks_alter(). + */ +function node_menu_local_tasks_alter(&$local_tasks, $route_name, RefinableCacheableDependencyInterface &$cacheability): void { + if ($route_name === 'entity.node.revision') { + // Show the same local tasks on node revision pages as the ones displayed + // on node canonical pages. + $node_canonical_local_tasks = \Drupal::service('plugin.manager.menu.local_task') + ->getLocalTasks('entity.node.canonical'); + $local_tasks['tabs'][0] = $node_canonical_local_tasks['tabs']; + // Mark the version history local task as active when viewing a node + // revision. + foreach ($local_tasks['tabs'][0] as $route_name => &$tab) { + $tab['#active'] = $route_name === 'entity.node.version_history'; + } + $cacheability = CacheableMetadata::createFromObject($cacheability) + ->merge($node_canonical_local_tasks['cacheability']); + } +}