From b7118cc9900a543b18c4c8538adf8dcf87202093 Mon Sep 17 00:00:00 2001
From: Oliver Hader <oliver@typo3.org>
Date: Thu, 18 Nov 2021 08:57:57 +0100
Subject: [PATCH] [TASK] Avoid inline JavaScript in f:be.menus.actionMenu

Uses GlobalEventHandler functionality instead of onchange events.

Resolves: #96018
Releases: master, 11.5
Change-Id: Ib217b294b9f3d0ff27c005b0d4f397aa2bfd665c
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/72221
Tested-by: core-ci <typo3@b13.com>
Tested-by: Torben Hansen <derhansen@gmail.com>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Torben Hansen <derhansen@gmail.com>
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
---
 .../Be/Menus/ActionMenuViewHelper.php         | 25 +++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php
index ee28a3f17a7a..6de1beb7dd14 100644
--- a/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php
+++ b/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php
@@ -15,6 +15,9 @@
 
 namespace TYPO3\CMS\Fluid\ViewHelpers\Be\Menus;
 
+use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
+use TYPO3\CMS\Core\Page\JavaScriptRenderer;
+use TYPO3\CMS\Core\Page\PageRenderer;
 use TYPO3Fluid\Fluid\Core\Compiler\TemplateCompiler;
 use TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper;
@@ -80,15 +83,19 @@ class ActionMenuViewHelper extends AbstractTagBasedViewHelper
      */
     public function render()
     {
-        $this->tag->addAttribute('onchange', 'window.location.href = this.options[this.selectedIndex].value;');
         $options = '';
         foreach ($this->childNodes as $childNode) {
             if ($childNode instanceof ViewHelperNode) {
                 $options .= $childNode->evaluate($this->renderingContext);
             }
         }
+        $this->tag->addAttributes([
+            'data-global-event' => 'change',
+            'data-action-navigate' => '$value',
+        ]);
         $this->tag->setContent($options);
-        return '<div class="docheader-funcmenu">' . $this->tag->render() . '</div>';
+        return $this->loadRequireJsModule('TYPO3/CMS/Backend/GlobalEventHandler')
+            . '<div class="docheader-funcmenu">' . $this->tag->render() . '</div>';
     }
 
     /**
@@ -104,4 +111,18 @@ class ActionMenuViewHelper extends AbstractTagBasedViewHelper
         $compiler->disable();
         return null;
     }
+
+    /**
+     * Renders `<script src="JavaScriptHandler.js">...</script>` for loading
+     * corresponding module. Using `JavaScriptRenderer` makes this independent
+     * from `PageRenderer` and its current application state.
+     */
+    protected function loadRequireJsModule(string $name): string
+    {
+        $javaScriptRenderer = JavaScriptRenderer::create();
+        $javaScriptRenderer->addJavaScriptModuleInstruction(
+            JavaScriptModuleInstruction::forRequireJS($name)
+        );
+        return $javaScriptRenderer->render();
+    }
 }
-- 
GitLab