From aaa1754e5289e876bd3e061f35e925d7834d4c60 Mon Sep 17 00:00:00 2001 From: Jonas Eberle <flightvision@googlemail.com> Date: Sat, 11 Apr 2020 16:40:59 +0200 Subject: [PATCH] [BUGFIX] Do not default to type="text/javascript" in AssetRenderer This omits type="text/javascript" by default for JavaScript assets. Resolves: #91000 Releases: master Change-Id: If8b6a0270a1afe35face8a410beea0736ac43cef Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64117 Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Riccardo De Contardi <erredeco@gmail.com> Tested-by: Benni Mack <benni@typo3.org> Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de> Reviewed-by: Benni Mack <benni@typo3.org> Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de> --- .../core/Classes/Page/AssetRenderer.php | 10 ++-- .../Feature-90522-IntroduceAssetCollector.rst | 15 ++++-- .../Tests/Unit/Page/AssetDataProvider.php | 52 +++++++++++++------ 3 files changed, 52 insertions(+), 25 deletions(-) diff --git a/typo3/sysext/core/Classes/Page/AssetRenderer.php b/typo3/sysext/core/Classes/Page/AssetRenderer.php index c41eaf714767..2d1c73c694d4 100644 --- a/typo3/sysext/core/Classes/Page/AssetRenderer.php +++ b/typo3/sysext/core/Classes/Page/AssetRenderer.php @@ -38,9 +38,6 @@ class AssetRenderer { $template = '<script%attributes%>%source%</script>'; $assets = $this->assetCollector->getInlineJavaScripts(); - foreach ($assets as &$assetData) { - $assetData['attributes']['type'] = $assetData['attributes']['type'] ?? 'text/javascript'; - } return $this->render($assets, $template, $priority); } @@ -50,7 +47,6 @@ class AssetRenderer $assets = $this->assetCollector->getJavaScripts(); foreach ($assets as &$assetData) { $assetData['attributes']['src'] = $this->getAbsoluteWebPath($assetData['source']); - $assetData['attributes']['type'] = $assetData['attributes']['type'] ?? 'text/javascript'; } return $this->render($assets, $template, $priority); } @@ -83,7 +79,11 @@ class AssetRenderer } $attributes = $assetData['attributes']; $attributesString = count($attributes) ? ' ' . GeneralUtility::implodeAttributes($attributes, true) : ''; - $results[] = str_replace(['%attributes%', '%source%'], [$attributesString, $assetData['source']], $template); + $results[] = str_replace( + ['%attributes%', '%source%'], + [$attributesString, $assetData['source']], + $template + ); } return implode(LF, $results); } diff --git a/typo3/sysext/core/Documentation/Changelog/10.3/Feature-90522-IntroduceAssetCollector.rst b/typo3/sysext/core/Documentation/Changelog/10.3/Feature-90522-IntroduceAssetCollector.rst index 8431547d2c3f..950dc6ce4d5e 100644 --- a/typo3/sysext/core/Documentation/Changelog/10.3/Feature-90522-IntroduceAssetCollector.rst +++ b/typo3/sysext/core/Documentation/Changelog/10.3/Feature-90522-IntroduceAssetCollector.rst @@ -101,18 +101,25 @@ Currently, JavaScript registered with AssetCollector is not affected by Examples -------- -Add a JavaScript file to the collector with script attribute data-foo="bar" +Add a JavaScript file to the collector with script attribute data-foo="bar": .. code-block:: php GeneralUtility::makeInstance(AssetCollector::class) - ->addJavaScript('my_ext_foo', 'EXT:my_ext/Resources/Public/JavaScript/foo.js', ['data-foo' => 'bar']]); + ->addJavaScript('my_ext_foo', 'EXT:my_ext/Resources/Public/JavaScript/foo.js', ['data-foo' => 'bar']); -Add a JavaScript file to the collector with script attribute :html:`data-foo="bar"` and priority which means rendering before other script tags +Add a JavaScript file to the collector with script attribute :html:`data-foo="bar"` and priority which means rendering before other script tags: .. code-block:: php GeneralUtility::makeInstance(AssetCollector::class) - ->addJavaScript('my_ext_foo', 'EXT:my_ext/Resources/Public/JavaScript/foo.js', ['data-foo' => 'bar'], ['priority' => true]]); + ->addJavaScript('my_ext_foo', 'EXT:my_ext/Resources/Public/JavaScript/foo.js', ['data-foo' => 'bar'], ['priority' => true]); + +Add a JavaScript file to the collector with :html:`type="module"` (by default, no type= is output for JavaScript): + +.. code-block:: php + + GeneralUtility::makeInstance(AssetCollector::class) + ->addJavaScript('my_ext_foo', 'EXT:my_ext/Resources/Public/JavaScript/foo.js', ['type' => 'module']); .. index:: Backend, Frontend, PHP-API, ext:core diff --git a/typo3/sysext/core/Tests/Unit/Page/AssetDataProvider.php b/typo3/sysext/core/Tests/Unit/Page/AssetDataProvider.php index 0c825331b322..109f8e3a06e2 100644 --- a/typo3/sysext/core/Tests/Unit/Page/AssetDataProvider.php +++ b/typo3/sysext/core/Tests/Unit/Page/AssetDataProvider.php @@ -22,7 +22,7 @@ class AssetDataProvider [ 'css_no_prio' => '<link href="fileadmin/foo.ext" rel="stylesheet" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script src="fileadmin/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script src="fileadmin/foo.ext"></script>', 'js_prio' => '', ] ], @@ -40,7 +40,7 @@ class AssetDataProvider [ 'css_no_prio' => '<link href="typo3/sysext/core/Resource/Public/foo.ext" rel="stylesheet" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script src="typo3/sysext/core/Resource/Public/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script src="typo3/sysext/core/Resource/Public/foo.ext"></script>', 'js_prio' => '', ] ], @@ -58,7 +58,7 @@ class AssetDataProvider [ 'css_no_prio' => '<link href="https://typo3.org/foo.ext" rel="stylesheet" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script src="https://typo3.org/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script src="https://typo3.org/foo.ext"></script>', 'js_prio' => '', ] ], @@ -82,7 +82,7 @@ class AssetDataProvider [ 'css_no_prio' => '<link href="fileadmin/foo.ext" rel="stylesheet" type="text/css" >' . LF . '<link href="typo3/sysext/core/Resource/Public/foo.ext" rel="stylesheet" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script src="fileadmin/foo.ext" type="text/javascript"></script>' . LF . '<script src="typo3/sysext/core/Resource/Public/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script src="fileadmin/foo.ext"></script>' . LF . '<script src="typo3/sysext/core/Resource/Public/foo.ext"></script>', 'js_prio' => '', ] ], @@ -107,7 +107,7 @@ class AssetDataProvider [ 'css_no_prio' => '<link href="typo3/sysext/core/Resource/Public/bar.ext" rel="stylesheet" type="text/css" >' . LF . '<link href="typo3/sysext/core/Resource/Public/foo.ext" rel="stylesheet" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script src="typo3/sysext/core/Resource/Public/bar.ext" type="text/javascript"></script>' . LF . '<script src="typo3/sysext/core/Resource/Public/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script src="typo3/sysext/core/Resource/Public/bar.ext"></script>' . LF . '<script src="typo3/sysext/core/Resource/Public/foo.ext"></script>', 'js_prio' => '', ] ], @@ -127,7 +127,27 @@ class AssetDataProvider [ 'css_no_prio' => '<link rel="foo" href="fileadmin/foo.ext" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script rel="foo" src="fileadmin/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script rel="foo" src="fileadmin/foo.ext"></script>', + 'js_prio' => '', + ] + ], + '1 file with controlled type' => [ + [ + ['file1', 'fileadmin/foo.ext', ['type' => 'module'], []] + ], + [ + 'file1' => [ + 'source' => 'fileadmin/foo.ext', + 'attributes' => [ + 'type' => 'module' + ], + 'options' => [], + ] + ], + [ + 'css_no_prio' => '<link type="module" href="fileadmin/foo.ext" rel="stylesheet" >', + 'css_prio' => '', + 'js_no_prio' => '<script type="module" src="fileadmin/foo.ext"></script>', 'js_prio' => '', ] ], @@ -149,7 +169,7 @@ class AssetDataProvider [ 'css_no_prio' => '<link rel="bar" another="keep on override" href="fileadmin/foo.ext" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script rel="bar" another="keep on override" src="fileadmin/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script rel="bar" another="keep on override" src="fileadmin/foo.ext"></script>', 'js_prio' => '', ] ], @@ -170,7 +190,7 @@ class AssetDataProvider 'css_no_prio' => '', 'css_prio' => '<link href="fileadmin/foo.ext" rel="stylesheet" type="text/css" >', 'js_no_prio' => '', - 'js_prio' => '<script src="fileadmin/foo.ext" type="text/javascript"></script>', + 'js_prio' => '<script src="fileadmin/foo.ext"></script>', ] ], '1 file with options override' => [ @@ -191,7 +211,7 @@ class AssetDataProvider [ 'css_no_prio' => '<link href="fileadmin/foo.ext" rel="stylesheet" type="text/css" >', 'css_prio' => '', - 'js_no_prio' => '<script src="fileadmin/foo.ext" type="text/javascript"></script>', + 'js_no_prio' => '<script src="fileadmin/foo.ext"></script>', 'js_prio' => '', ] ], @@ -215,7 +235,7 @@ class AssetDataProvider [ 'css_no_prio' => '<style>foo bar baz</style>', 'css_prio' => '', - 'js_no_prio' => '<script type="text/javascript">foo bar baz</script>', + 'js_no_prio' => '<script>foo bar baz</script>', 'js_prio' => '', ] ], @@ -239,7 +259,7 @@ class AssetDataProvider [ 'css_no_prio' => '<style>foo bar baz</style>' . LF . '<style>bar baz foo</style>', 'css_prio' => '', - 'js_no_prio' => '<script type="text/javascript">foo bar baz</script>' . LF . '<script type="text/javascript">bar baz foo</script>', + 'js_no_prio' => '<script>foo bar baz</script>' . LF . '<script>bar baz foo</script>', 'js_prio' => '', ] ], @@ -264,7 +284,7 @@ class AssetDataProvider [ 'css_no_prio' => '<style>baz foo bar</style>' . LF . '<style>bar baz foo</style>', 'css_prio' => '', - 'js_no_prio' => '<script type="text/javascript">baz foo bar</script>' . LF . '<script type="text/javascript">bar baz foo</script>', + 'js_no_prio' => '<script>baz foo bar</script>' . LF . '<script>bar baz foo</script>', 'js_prio' => '', ] ], @@ -284,7 +304,7 @@ class AssetDataProvider [ 'css_no_prio' => '<style rel="foo">foo bar baz</style>', 'css_prio' => '', - 'js_no_prio' => '<script rel="foo" type="text/javascript">foo bar baz</script>', + 'js_no_prio' => '<script rel="foo">foo bar baz</script>', 'js_prio' => '', ] ], @@ -306,7 +326,7 @@ class AssetDataProvider [ 'css_no_prio' => '<style rel="bar" another="keep on override">foo bar baz</style>', 'css_prio' => '', - 'js_no_prio' => '<script rel="bar" another="keep on override" type="text/javascript">foo bar baz</script>', + 'js_no_prio' => '<script rel="bar" another="keep on override">foo bar baz</script>', 'js_prio' => '', ] ], @@ -327,7 +347,7 @@ class AssetDataProvider 'css_no_prio' => '', 'css_prio' => '<style>foo bar baz</style>', 'js_no_prio' => '', - 'js_prio' => '<script type="text/javascript">foo bar baz</script>', + 'js_prio' => '<script>foo bar baz</script>', ] ], 'simple data with options override' => [ @@ -348,7 +368,7 @@ class AssetDataProvider [ 'css_no_prio' => '<style>foo bar baz</style>', 'css_prio' => '', - 'js_no_prio' => '<script type="text/javascript">foo bar baz</script>', + 'js_no_prio' => '<script>foo bar baz</script>', 'js_prio' => '', ] ], -- GitLab