From 7e28ed514aeca58baba0be32b7b370ee64d66b5c Mon Sep 17 00:00:00 2001
From: nod_ <nod_@598310.no-reply.drupal.org>
Date: Mon, 8 Apr 2024 10:50:38 +0200
Subject: [PATCH] Issue #3419621 by dburiak, sijumpk, smustgrave, pameeela,
 alexpott: tablePositionSticky should not be called on a non-array variable

---
 .../KernelTests/Core/Theme/ClaroTableTest.php | 32 +++++++++++++++++++
 core/themes/claro/src/ClaroPreRender.php      |  2 +-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/core/tests/Drupal/KernelTests/Core/Theme/ClaroTableTest.php b/core/tests/Drupal/KernelTests/Core/Theme/ClaroTableTest.php
index 70dcd6606e2d..213f54b34e78 100644
--- a/core/tests/Drupal/KernelTests/Core/Theme/ClaroTableTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Theme/ClaroTableTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\KernelTests\Core\Theme;
 
+use Drupal\claro\ClaroPreRender;
 use Drupal\KernelTests\KernelTestBase;
 
 /**
@@ -38,4 +39,35 @@ public function testThemeTableStickyHeaders() {
     $this->assertRaw('position-sticky');
   }
 
+  /**
+   * Confirm Claro prerender callback is not executed for non-array class.
+   */
+  public function testThemeTablePositionStickyPreRender(): void {
+    // Enable the Claro theme.
+    \Drupal::service('theme_installer')->install(['claro']);
+    $this->config('system.theme')->set('default', 'claro')->save();
+    $header = ['one', 'two', 'three'];
+    $rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
+    $table = [
+      '#type' => 'table',
+      '#header' => $header,
+      '#rows' => $rows,
+      '#sticky' => TRUE,
+      '#attributes' => [
+        'class' => 'class',
+      ],
+      '#pre_render' => [
+        [
+          ClaroPreRender::class,
+          'tablePositionSticky',
+        ],
+      ],
+    ];
+
+    $renderedTable = \Drupal::service('renderer')->renderRoot($table);
+
+    // Confirm that table is rendered.
+    $this->assertStringContainsString('class="class"', $renderedTable);
+  }
+
 }
diff --git a/core/themes/claro/src/ClaroPreRender.php b/core/themes/claro/src/ClaroPreRender.php
index e18d0906c984..a47f4ac26e71 100644
--- a/core/themes/claro/src/ClaroPreRender.php
+++ b/core/themes/claro/src/ClaroPreRender.php
@@ -193,7 +193,7 @@ public static function messagePlaceholder(array $element) {
    * Prerender callback for table elements.
    */
   public static function tablePositionSticky(array $element) {
-    if (isset($element['#attributes']['class']) && in_array('sticky-enabled', $element['#attributes']['class'])) {
+    if (isset($element['#attributes']['class']) && is_array($element['#attributes']['class']) && in_array('sticky-enabled', $element['#attributes']['class'], TRUE)) {
       unset($element['#attributes']['class'][array_search('sticky-enabled', $element['#attributes']['class'])]);
       $element['#attributes']['class'][] = 'position-sticky';
     }
-- 
GitLab