From 0c9b4fcd361962a4ce0233ad75e7642983c663af Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Sun, 12 Jan 2025 10:01:39 +0000
Subject: [PATCH] Issue #3081044 by shalini_jha, nlisgo, vivek panicker,
 smustgrave, alexpott, quietone: Allow default title arguments to be
 overridden

---
 .../Drupal/Core/Controller/TitleResolver.php  |  6 +--
 .../Core/Controller/TitleResolverTest.php     | 46 +++++++++++++++++++
 2 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/core/lib/Drupal/Core/Controller/TitleResolver.php b/core/lib/Drupal/Core/Controller/TitleResolver.php
index 9813242d880b..0e3e7a3ec31f 100644
--- a/core/lib/Drupal/Core/Controller/TitleResolver.php
+++ b/core/lib/Drupal/Core/Controller/TitleResolver.php
@@ -64,6 +64,9 @@ public function getTitle(Request $request, Route $route) {
         $options['context'] = $route->getDefault('_title_context');
       }
       $args = [];
+      if ($route->hasDefault('_title_arguments')) {
+        $args = (array) $route->getDefault('_title_arguments');
+      }
       if (($raw_parameters = $request->attributes->get('_raw_variables'))) {
         foreach ($raw_parameters->all() as $key => $value) {
           if (is_scalar($value)) {
@@ -72,9 +75,6 @@ public function getTitle(Request $request, Route $route) {
           }
         }
       }
-      if ($title_arguments = $route->getDefault('_title_arguments')) {
-        $args = array_merge($args, (array) $title_arguments);
-      }
 
       // Fall back to a static string from the route.
       // phpcs:ignore Drupal.Semantics.FunctionT.NotLiteralString
diff --git a/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php b/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php
index f27c647a047c..d5a196591dab 100644
--- a/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php
+++ b/core/tests/Drupal/Tests/Core/Controller/TitleResolverTest.php
@@ -108,6 +108,52 @@ public function testStaticTitleWithParameter(): void {
     $this->assertEquals(new TranslatableMarkup('static title %test', ['@test' => 'value', '%test' => 'value', '@test2' => 'value2', '%test2' => 'value2'], [], $this->translationManager), $this->titleResolver->getTitle($request, $route));
   }
 
+  /**
+   * Tests a static title with and without overridden default arguments.
+   *
+   * @see \Drupal\Core\Controller\TitleResolver::getTitle()
+   */
+  public function testStaticTitleWithArguments(): void {
+    // Set up the request with optional override variables.
+    $request = new Request();
+    $raw_variables = new InputBag(['test' => 'override value']);
+
+    // Array of cases.
+    $cases = [
+      // Case 1: No override, uses default arguments.
+      [
+        'route_args' => ['_title' => 'static title @test', '_title_arguments' => ['@test' => 'value', '@test2' => 'value2']],
+        'expected' => new TranslatableMarkup('static title @test', ['@test' => 'value', '@test2' => 'value2'], [], $this->translationManager),
+        'override' => FALSE,
+      ],
+      [
+        'route_args' => ['_title' => 'static title %test', '_title_arguments' => ['%test' => 'value', '%test2' => 'value2']],
+        'expected' => new TranslatableMarkup('static title %test', ['%test' => 'value', '%test2' => 'value2'], [], $this->translationManager),
+        'override' => FALSE,
+      ],
+      // Case 2: Override arguments.
+      [
+        'route_args' => ['_title' => 'static title @test @test2', '_title_arguments' => ['@test' => 'value', '@test2' => 'value2']],
+        'expected' => new TranslatableMarkup('static title @test @test2', ['@test' => 'override value', '%test' => 'override value', '@test2' => 'value2'], [], $this->translationManager),
+        'override' => TRUE,
+      ],
+      [
+        'route_args' => ['_title' => 'static title %test %test2', '_title_arguments' => ['%test' => 'value', '%test2' => 'value2']],
+        'expected' => new TranslatableMarkup('static title %test %test2', ['@test' => 'override value', '%test' => 'override value', '%test2' => 'value2'], [], $this->translationManager),
+        'override' => TRUE,
+      ],
+    ];
+
+    foreach ($cases as $case) {
+      // Adjust the request based on whether we expect overrides.
+      if ($case['override']) {
+        $request->attributes->set('_raw_variables', $raw_variables);
+      }
+      $route = new Route('/test-route', $case['route_args']);
+      $this->assertEquals($case['expected'], $this->titleResolver->getTitle($request, $route));
+    }
+  }
+
   /**
    * Tests a static title with a non-scalar value parameter.
    *
-- 
GitLab