Skip to content

Commit

Permalink
[WebProfilerBundle] Fix dump header not being displayed
Browse files Browse the repository at this point in the history
  • Loading branch information
HypeMC authored and nicolas-grekas committed Dec 13, 2022
1 parent 4164629 commit 6c7635f
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 4 deletions.
61 changes: 61 additions & 0 deletions Tests/Twig/WebProfilerExtensionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\WebProfilerBundle\Tests\Twig;

use PHPUnit\Framework\TestCase;
use Symfony\Bundle\WebProfilerBundle\Twig\WebProfilerExtension;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Twig\Environment;
use Twig\Extension\CoreExtension;
use Twig\Extension\EscaperExtension;

class WebProfilerExtensionTest extends TestCase
{
/**
* @dataProvider provideMessages
*/
public function testDumpHeaderIsDisplayed(string $message, array $context, bool $dump1HasHeader, bool $dump2HasHeader)
{
class_exists(CoreExtension::class); // Load twig_convert_encoding()
class_exists(EscaperExtension::class); // Load twig_escape_filter()

$twigEnvironment = $this->mockTwigEnvironment();
$varCloner = new VarCloner();

$webProfilerExtension = new WebProfilerExtension();

$needle = 'window.Sfdump';

$dump1 = $webProfilerExtension->dumpLog($twigEnvironment, $message, $varCloner->cloneVar($context));
self::assertSame($dump1HasHeader, str_contains($dump1, $needle));

$dump2 = $webProfilerExtension->dumpData($twigEnvironment, $varCloner->cloneVar([]));
self::assertSame($dump2HasHeader, str_contains($dump2, $needle));
}

public function provideMessages(): iterable
{
yield ['Some message', ['foo' => 'foo', 'bar' => 'bar'], false, true];
yield ['Some message {@see some text}', ['foo' => 'foo', 'bar' => 'bar'], false, true];
yield ['Some message {foo}', ['foo' => 'foo', 'bar' => 'bar'], true, false];
yield ['Some message {foo}', ['bar' => 'bar'], false, true];
}

private function mockTwigEnvironment()
{
$twigEnvironment = $this->createMock(Environment::class);

$twigEnvironment->expects($this->any())->method('getCharset')->willReturn('UTF-8');

return $twigEnvironment;
}
}
14 changes: 10 additions & 4 deletions Twig/WebProfilerExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,19 @@ public function dumpLog(Environment $env, string $message, Data $context = null)
$message = twig_escape_filter($env, $message);
$message = preg_replace('/&quot;(.*?)&quot;/', '&quot;<b>$1</b>&quot;', $message);

if (null === $context || !str_contains($message, '{')) {
$replacements = [];
foreach ($context ?? [] as $k => $v) {
$k = '{'.twig_escape_filter($env, $k).'}';
if (str_contains($message, $k)) {
$replacements[$k] = $v;
}
}

if (!$replacements) {
return '<span class="dump-inline">'.$message.'</span>';
}

$replacements = [];
foreach ($context as $k => $v) {
$k = '{'.twig_escape_filter($env, $k).'}';
foreach ($replacements as $k => $v) {
$replacements['&quot;<b>'.$k.'</b>&quot;'] = $replacements['&quot;'.$k.'&quot;'] = $replacements[$k] = $this->dumpData($env, $v);
}

Expand Down

0 comments on commit 6c7635f

Please sign in to comment.