From 8e37bfb03f6922f1b25cb324a02f2ba003eb173e Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Thu, 13 Feb 2020 09:31:58 +0000
Subject: [PATCH] Issue #3088077 by Sam152, bkosborne, rensingh99,
 tim.plunkett: Layout builder does not correctly bubble up cache metadata for
 empty blocks

---
 .../BlockComponentRenderArray.php             |  7 +++++++
 .../Unit/BlockComponentRenderArrayTest.php    | 19 +++++++++++++++----
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php
index 8cde7674a16b..d9218b538776 100644
--- a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php
+++ b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php
@@ -5,6 +5,7 @@
 use Drupal\block_content\Access\RefinableDependentAccessInterface;
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Block\BlockPluginInterface;
+use Drupal\Core\Cache\CacheableMetadata;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Render\PreviewFallbackInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -102,6 +103,12 @@ public function onBuildRender(SectionComponentBuildRenderArrayEvent $event) {
       }
 
       $content = $block->build();
+
+      // We don't output the block render data if there are no render elements
+      // found, but we want to capture the cache metadata from the block
+      // regardless.
+      $event->addCacheableDependency(CacheableMetadata::createFromRenderArray($content));
+
       $is_content_empty = Element::isEmpty($content);
       $is_placeholder_ready = $event->inPreview() && $block instanceof PreviewFallbackInterface;
       // If the content is empty and no placeholder is available, return.
diff --git a/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php b/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php
index 117c76f7deec..31efc509abc0 100644
--- a/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php
+++ b/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php
@@ -99,7 +99,10 @@ public function testOnBuildRender($refinable_dependent_access) {
     $placeholder_label = 'Placeholder Label';
     $block->getPreviewFallbackString()->willReturn($placeholder_label);
 
-    $block_content = ['#markup' => 'The block content.'];
+    $block_content = [
+      '#markup' => 'The block content.',
+      '#cache' => ['tags' => ['build-tag']],
+    ];
     $block->build()->willReturn($block_content);
     $this->blockManager->createInstance('some_block_id', ['id' => 'some_block_id'])->willReturn($block->reveal());
 
@@ -122,7 +125,10 @@ public function testOnBuildRender($refinable_dependent_access) {
     $expected_cache = $expected_build + [
       '#cache' => [
         'contexts' => [],
-        'tags' => ['test'],
+        'tags' => [
+          'build-tag',
+          'test',
+        ],
         'max-age' => -1,
       ],
     ];
@@ -410,7 +416,9 @@ public function testOnBuildRenderEmptyBuild() {
     $block->getBaseId()->willReturn('block_plugin_id');
     $block->getDerivativeId()->willReturn(NULL);
 
-    $block->build()->willReturn([]);
+    $block->build()->willReturn([
+      '#cache' => ['tags' => ['build-tag']],
+    ]);
     $this->blockManager->createInstance('some_block_id', ['id' => 'some_block_id'])->willReturn($block->reveal());
 
     $component = new SectionComponent('some-uuid', 'some-region', ['id' => 'some_block_id']);
@@ -423,7 +431,10 @@ public function testOnBuildRenderEmptyBuild() {
     $expected_cache = $expected_build + [
       '#cache' => [
         'contexts' => [],
-        'tags' => ['test'],
+        'tags' => [
+          'build-tag',
+          'test',
+        ],
         'max-age' => -1,
       ],
     ];
-- 
GitLab