From 74b6cedac2d4b6dea995ce54c4fc10bdc6286fc8 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Wed, 10 Jul 2024 08:53:46 +0100
Subject: [PATCH] Issue #2998857 by Luke.Leber, e.chatrer, afem, bskibinski,
 mgifford: a11y: Input type file fields lack aria-describedby to the
 description

---
 core/modules/file/src/Element/ManagedFile.php            | 5 +++++
 .../file_module_test/src/Form/FileModuleTestForm.php     | 1 +
 .../tests/src/Functional/FileManagedFileElementTest.php  | 9 ++++++++-
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/core/modules/file/src/Element/ManagedFile.php b/core/modules/file/src/Element/ManagedFile.php
index 2d076bfa6819..7b80af79ebfb 100644
--- a/core/modules/file/src/Element/ManagedFile.php
+++ b/core/modules/file/src/Element/ManagedFile.php
@@ -320,6 +320,11 @@ public static function processManagedFile(&$element, FormStateInterface $form_st
       '#weight' => -10,
       '#error_no_message' => TRUE,
     ];
+
+    if (!empty($element['#description'])) {
+      $element['upload']['#attributes']['aria-describedby'] = $element['#id'] . '--description';
+    }
+
     if (!empty($element['#accept'])) {
       $element['upload']['#attributes'] = ['accept' => $element['#accept']];
     }
diff --git a/core/modules/file/tests/file_module_test/src/Form/FileModuleTestForm.php b/core/modules/file/tests/file_module_test/src/Form/FileModuleTestForm.php
index e97d792b74fb..7db60a46a960 100644
--- a/core/modules/file/tests/file_module_test/src/Form/FileModuleTestForm.php
+++ b/core/modules/file/tests/file_module_test/src/Form/FileModuleTestForm.php
@@ -41,6 +41,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $tree = T
     $form['nested']['file'] = [
       '#type' => 'managed_file',
       '#title' => $this->t('Managed <em>@type</em>', ['@type' => 'file & butter']),
+      '#description' => $this->t('Upload a <em>@type</em> file', ['@type' => 'file & butter']),
       '#upload_location' => 'public://test',
       '#progress_message' => $this->t('Processing...'),
       '#extended' => (bool) $extended,
diff --git a/core/modules/file/tests/src/Functional/FileManagedFileElementTest.php b/core/modules/file/tests/src/Functional/FileManagedFileElementTest.php
index 2d02bc486370..9cc2d3fd949c 100644
--- a/core/modules/file/tests/src/Functional/FileManagedFileElementTest.php
+++ b/core/modules/file/tests/src/Functional/FileManagedFileElementTest.php
@@ -4,6 +4,7 @@
 
 namespace Drupal\Tests\file\Functional;
 
+use Drupal\Component\Utility\Html;
 use Drupal\file\Entity\File;
 
 /**
@@ -40,8 +41,14 @@ public function testManagedFile(): void {
           $input_base_name = $tree ? 'nested_file' : 'file';
           $file_field_name = $multiple ? 'files[' . $input_base_name . '][]' : 'files[' . $input_base_name . ']';
 
-          // Submit without a file.
           $this->drupalGet($path);
+
+          // Ensure the aria-describedby relationship works as expected.
+          $input_id = Html::getId('edit_' . $input_base_name);
+          $this->assertSession()->elementExists('css', '#' . $input_id . '--description');
+          $this->assertSession()->elementExists('css', '[aria-describedby="' . $input_id . '--description"]');
+
+          // Submit without a file.
           $this->submitForm([], 'Save');
           $this->assertSession()->pageTextContains("The file ids are .");
 
-- 
GitLab