From e51c4c71788706354725fef94bb384d512232571 Mon Sep 17 00:00:00 2001 From: catch <6915-catch@users.noreply.drupalcode.org> Date: Sat, 28 Sep 2024 10:40:19 +0200 Subject: [PATCH] Issue #3457168 by raphaelbertrand, gauravvvv, bbrala, longwave: Since twig/twig 3.9: error with "twig_escape_filter" function usage in /core/lib/Drupal/Core/Template/TwigExtension.php (cherry picked from commit 128310c8c9e2913b3a7bc42ff1b0b19a30e64c78) --- core/lib/Drupal/Core/Template/TwigExtension.php | 3 ++- .../src/Functional/Theme/TwigExtensionTest.php | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php index 9200d025417..7ed77162080 100644 --- a/core/lib/Drupal/Core/Template/TwigExtension.php +++ b/core/lib/Drupal/Core/Template/TwigExtension.php @@ -23,6 +23,7 @@ use Twig\Node\Expression\ConstantExpression; use Twig\Node\Node; use Twig\TwigFilter; use Twig\TwigFunction; +use Twig\Runtime\EscaperRuntime; /** * A class providing Drupal Twig extensions. @@ -461,7 +462,7 @@ class TwigExtension extends AbstractExtension { if ($strategy == 'html') { return Html::escape($return); } - return twig_escape_filter($env, $return, $strategy, $charset, $autoescape); + return $env->getRuntime(EscaperRuntime::class)->escape($arg, $strategy, $charset, $autoescape); } // This is a normal render array, which is safe by definition, with diff --git a/core/modules/system/tests/src/Functional/Theme/TwigExtensionTest.php b/core/modules/system/tests/src/Functional/Theme/TwigExtensionTest.php index 88306414021..3bdbf7f976b 100644 --- a/core/modules/system/tests/src/Functional/Theme/TwigExtensionTest.php +++ b/core/modules/system/tests/src/Functional/Theme/TwigExtensionTest.php @@ -126,4 +126,17 @@ class TwigExtensionTest extends BrowserTestBase { } + /** + * Test if Drupal html strategy is done and the fallback to Twig itself works. + */ + public function testRenderStrategies(): void { + /** @var \Drupal\Core\Template\TwigExtension $extension */ + $extension = \Drupal::service('twig.extension'); + /** @var \Drupal\Core\Template\TwigEnvironment $twig */ + $twig = \Drupal::service('twig'); + + $this->assertSame('test&', $extension->escapeFilter($twig, 'test&'), 'TwigExtension::escapeFilter() renders escaped & when strategy is html (default).'); + $this->assertSame('test\u0026', $extension->escapeFilter($twig, 'test&', 'js'), 'TwigExtension::escapeFilter() renders escaped & when strategy is js.'); + } + }