From fdbc551f09a5b22284a058551094c1e80905e382 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Wed, 4 Aug 2021 21:25:32 +0200
Subject: [PATCH] [BUGFIX] Only minifyJS once in Frontend

If you have inline JS (or inlineFooterJS) code
the method "GeneralUtility::minifyJavaScript()"
is called twice for the same code to actually minify
the code, because PageRenderer takes
care of minification, so FE process does not
explicitly have to do that.

This does no harm, only if there is a hook
within minifyJavaScript(), the processing is triggered
twice. This also only happens if config.compressJs = 1
is called.

Resolves: #94716
Releases: master
Change-Id: I77af009bf252b9f249794ed5b8db1dd0ae26b769
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/70207
Tested-by: Oliver Bartsch <bo@cedev.de>
Tested-by: core-ci <typo3@b13.com>
Tested-by: Jochen <rothjochen@gmail.com>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Jochen <rothjochen@gmail.com>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../frontend/Classes/Http/RequestHandler.php  | 54 +++++--------------
 1 file changed, 13 insertions(+), 41 deletions(-)

diff --git a/typo3/sysext/frontend/Classes/Http/RequestHandler.php b/typo3/sysext/frontend/Classes/Http/RequestHandler.php
index 5698c28fa111..5fd87ea58cd7 100644
--- a/typo3/sysext/frontend/Classes/Http/RequestHandler.php
+++ b/typo3/sysext/frontend/Classes/Http/RequestHandler.php
@@ -21,7 +21,6 @@ use Psr\EventDispatcher\EventDispatcherInterface;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Server\RequestHandlerInterface;
-use Psr\Log\LogLevel;
 use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Http\Response;
 use TYPO3\CMS\Core\Information\Typo3Information;
@@ -739,39 +738,8 @@ class RequestHandler implements RequestHandlerInterface
         $inlineJS = $controller->cObj->cObjGet($controller->pSetup['jsInline.'] ?? null, 'jsInline.');
         // Javascript inline code for Footer
         $inlineFooterJs = $controller->cObj->cObjGet($controller->pSetup['jsFooterInline.'] ?? null, 'jsFooterInline.');
-        // Should minify?
-        if ($controller->config['config']['compressJs'] ?? false) {
-            $pageRenderer->enableCompressJavascript();
-            $minifyErrorScript = ($minifyErrorInline = '');
-            $scriptJsCode = GeneralUtility::minifyJavaScript($scriptJsCode, $minifyErrorScript);
-            if ($minifyErrorScript) {
-                $this->timeTracker->setTSlogMessage($minifyErrorScript, LogLevel::ERROR);
-            }
-            if ($inlineJS) {
-                $inlineJS = GeneralUtility::minifyJavaScript($inlineJS, $minifyErrorInline);
-                if ($minifyErrorInline) {
-                    $this->timeTracker->setTSlogMessage($minifyErrorInline, LogLevel::ERROR);
-                }
-            }
-            if ($inlineFooterJs) {
-                $inlineFooterJs = GeneralUtility::minifyJavaScript($inlineFooterJs, $minifyErrorInline);
-                if ($minifyErrorInline) {
-                    $this->timeTracker->setTSlogMessage($minifyErrorInline, LogLevel::ERROR);
-                }
-            }
-        }
-        if (!isset($controller->config['config']['removeDefaultJS']) || !$controller->config['config']['removeDefaultJS']) {
-            // include default and inlineJS
-            if ($scriptJsCode) {
-                $pageRenderer->addJsInlineCode('_scriptCode', $scriptJsCode, $controller->config['config']['compressJs']);
-            }
-            if ($inlineJS) {
-                $pageRenderer->addJsInlineCode('TS_inlineJS', $inlineJS, $controller->config['config']['compressJs']);
-            }
-            if ($inlineFooterJs) {
-                $pageRenderer->addJsFooterInlineCode('TS_inlineFooter', $inlineFooterJs, $controller->config['config']['compressJs']);
-            }
-        } elseif ($controller->config['config']['removeDefaultJS'] === 'external') {
+        $compressJs = (bool)($controller->config['config']['compressJs'] ?? false);
+        if (($controller->config['config']['removeDefaultJS'] ?? '') === 'external') {
             /*
              * This keeps inlineJS from *_INT Objects from being moved to external files.
              * At this point in frontend rendering *_INT Objects only have placeholders instead
@@ -784,26 +752,30 @@ class RequestHandler implements RequestHandlerInterface
             $inlineJSint = '';
             $this->stripIntObjectPlaceholder($inlineJS, $inlineJSint);
             if ($inlineJSint) {
-                $pageRenderer->addJsInlineCode('TS_inlineJSint', $inlineJSint, $controller->config['config']['compressJs']);
+                $pageRenderer->addJsInlineCode('TS_inlineJSint', $inlineJSint, $compressJs);
             }
             if (trim($scriptJsCode . $inlineJS)) {
-                $pageRenderer->addJsFile(GeneralUtility::writeJavaScriptContentToTemporaryFile($scriptJsCode . $inlineJS), $defaultTypeAttributeForJavaScript, $controller->config['config']['compressJs']);
+                $pageRenderer->addJsFile(GeneralUtility::writeJavaScriptContentToTemporaryFile($scriptJsCode . $inlineJS), $defaultTypeAttributeForJavaScript, $compressJs);
             }
             if ($inlineFooterJs) {
                 $inlineFooterJSint = '';
                 $this->stripIntObjectPlaceholder($inlineFooterJs, $inlineFooterJSint);
                 if ($inlineFooterJSint) {
-                    $pageRenderer->addJsFooterInlineCode('TS_inlineFooterJSint', $inlineFooterJSint, $controller->config['config']['compressJs']);
+                    $pageRenderer->addJsFooterInlineCode('TS_inlineFooterJSint', $inlineFooterJSint, $compressJs);
                 }
-                $pageRenderer->addJsFooterFile(GeneralUtility::writeJavaScriptContentToTemporaryFile($inlineFooterJs), $defaultTypeAttributeForJavaScript, $controller->config['config']['compressJs']);
+                $pageRenderer->addJsFooterFile(GeneralUtility::writeJavaScriptContentToTemporaryFile($inlineFooterJs), $defaultTypeAttributeForJavaScript, $compressJs);
             }
         } else {
+            // include default and inlineJS
+            if ($scriptJsCode && (!isset($controller->config['config']['removeDefaultJS']) || !$controller->config['config']['removeDefaultJS'])) {
+                $pageRenderer->addJsInlineCode('_scriptCode', $scriptJsCode, $compressJs);
+            }
             // Include only inlineJS
             if ($inlineJS) {
-                $pageRenderer->addJsInlineCode('TS_inlineJS', $inlineJS, $controller->config['config']['compressJs']);
+                $pageRenderer->addJsInlineCode('TS_inlineJS', $inlineJS, $compressJs);
             }
             if ($inlineFooterJs) {
-                $pageRenderer->addJsFooterInlineCode('TS_inlineFooter', $inlineFooterJs, $controller->config['config']['compressJs']);
+                $pageRenderer->addJsFooterInlineCode('TS_inlineFooter', $inlineFooterJs, $compressJs);
             }
         }
         if (isset($controller->pSetup['inlineLanguageLabelFiles.']) && is_array($controller->pSetup['inlineLanguageLabelFiles.'])) {
@@ -829,7 +801,7 @@ class RequestHandler implements RequestHandlerInterface
         if ($controller->config['config']['compressCss'] ?? false) {
             $pageRenderer->enableCompressCss();
         }
-        if ($controller->config['config']['compressJs'] ?? false) {
+        if ($compressJs ?? false) {
             $pageRenderer->enableCompressJavascript();
         }
         if ($controller->config['config']['concatenateCss'] ?? false) {
-- 
GitLab