diff --git a/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php b/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php
index bcd8cf8566046fe205e2d1a69d4d538be1e44eb8..e81c213fde9a567afba3cb3d7b4507afd0278bec 100644
--- a/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php
+++ b/core/modules/views/tests/src/Functional/Plugin/StyleTableTest.php
@@ -211,6 +211,8 @@ public function testGrouping() {
 
     // Ensure that we don't find the caption containing unsafe markup.
     $this->assertNoRaw($unsafe_markup, "Didn't find caption containing unsafe markup.");
+    // Ensure that the summary isn't shown.
+    $this->assertEmpty($this->xpath('//caption/details'));
 
     // Ensure that all expected captions are found.
     foreach ($expected_captions as $raw_caption) {
diff --git a/core/modules/views/views.theme.inc b/core/modules/views/views.theme.inc
index ba955976088731e837b88be1a4c088e785f3d9c9..019899ada4a433e83e1c132f458f4b8115174ca0 100644
--- a/core/modules/views/views.theme.inc
+++ b/core/modules/views/views.theme.inc
@@ -664,20 +664,22 @@ function template_preprocess_views_view_table(&$variables) {
   // variables, although core templates now all use 'summary_element' instead.
   $variables['summary'] = $handler->options['summary'];
   $variables['description'] = $handler->options['description'];
-  $variables['summary_element'] = [
-    '#type' => 'details',
-    '#title' => $handler->options['summary'],
-    // To ensure that the description is properly escaped during rendering, use
-    // an 'inline_template' to let Twig do its magic, instead of 'markup'.
-    'description' => [
-      '#type' => 'inline_template',
-      '#template' => '{{ description }}',
-      '#context' => [
-        'description' => $handler->options['description'],
+  if (!empty($handler->options['summary']) || !empty($handler->options['description'])) {
+    $variables['summary_element'] = [
+      '#type' => 'details',
+      '#title' => $handler->options['summary'],
+      // To ensure that the description is properly escaped during rendering,
+      // use an 'inline_template' to let Twig do its magic, instead of 'markup'.
+      'description' => [
+        '#type' => 'inline_template',
+        '#template' => '{{ description }}',
+        '#context' => [
+          'description' => $handler->options['description'],
+        ],
       ],
-    ],
-  ];
-  $variables['caption_needed'] |= !empty($variables['summary']) || !empty($variables['description']);
+    ];
+    $variables['caption_needed'] = TRUE;
+  }
 
   $variables['responsive'] = FALSE;
   // If the table has headers and it should react responsively to columns hidden