Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 89ba0e5

Browse filesBrowse files
bug #59390 [VarDumper] Fix blank strings display (MatTheCat)
This PR was merged into the 6.4 branch. Discussion ---------- [VarDumper] Fix blank strings display | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | Fix #57980 | License | MIT Because `sf-dump-ellipsis` `span`s needed a `text-ellipsis`, their overflowing content was cut using `overflow: hidden`. As it required their inner display type to be `block`, this broke the alignment with the ellipsis’ “tail”. This was fixed by #53147 by making every dump’s `span`s `inline-flex`. This change made `sf-dump-ellipsis`’ `display`, `max-width` and `vertical-align` properties useless so this PR removes them, as well as a duplicated `overflow` one. Now, `inline-flex` elements’ content becomes flex items, which caused #57980 because > if the entire sequence of [a flex item’s] text runs contains only white space […] it is […] not rendered > > https://www.w3.org/TR/css-flexbox-1/#flex-items Instead of making every dump’s `span`s `inline-flex`, this PR targets a new `sf-dump-ellipsization` class added to `sf-dump-ellipsis`’ parents. It also wraps ellipsis tails with elements bearing the `sf-dump-ellipsis-tail` class so that we can prevent them to shrink: **Before**: ![](https://github.com/user-attachments/assets/8dfb21ac-ce39-4202-a5aa-af93bac5c7f5) **After**: ![](https://github.com/user-attachments/assets/15e8b344-5d12-4c89-8b29-3ef0a3928495) Commits ------- b0c2a59 [VarDumper] Fix blank strings display
2 parents a6ead57 + b0c2a59 commit 89ba0e5
Copy full SHA for 89ba0e5

File tree

Expand file treeCollapse file tree

4 files changed

+59
-54
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+59
-54
lines changed

‎src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php
+43-38Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ function showCurrent(state)
663663
height: 0;
664664
clear: both;
665665
}
666-
pre.sf-dump span {
666+
pre.sf-dump .sf-dump-ellipsization {
667667
display: inline-flex;
668668
}
669669
pre.sf-dump a {
@@ -681,16 +681,12 @@ function showCurrent(state)
681681
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAHUlEQVQY02O8zAABilCaiQEN0EeA8QuUcX9g3QEAAjcC5piyhyEAAAAASUVORK5CYII=) #D3D3D3;
682682
}
683683
pre.sf-dump .sf-dump-ellipsis {
684-
display: inline-block;
685-
overflow: visible;
686684
text-overflow: ellipsis;
687-
max-width: 5em;
688685
white-space: nowrap;
689686
overflow: hidden;
690-
vertical-align: top;
691687
}
692-
pre.sf-dump .sf-dump-ellipsis+.sf-dump-ellipsis {
693-
max-width: none;
688+
pre.sf-dump .sf-dump-ellipsis-tail {
689+
flex-shrink: 0;
694690
}
695691
pre.sf-dump code {
696692
display:inline;
@@ -863,66 +859,75 @@ protected function style(string $style, string $value, array $attr = []): string
863859
return sprintf('<a class=sf-dump-ref href=#%s-ref%s title="%d occurrences">%s</a>', $this->dumpId, $r, 1 + $attr['count'], $v);
864860
}
865861

862+
$dumpClasses = ['sf-dump-'.$style];
863+
$dumpTitle = '';
864+
866865
if ('const' === $style && isset($attr['value'])) {
867-
$style .= sprintf(' title="%s"', esc(\is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value'])));
866+
$dumpTitle = esc(\is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value']));
868867
} elseif ('public' === $style) {
869-
$style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property');
868+
$dumpTitle = empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property';
870869
} elseif ('str' === $style && 1 < $attr['length']) {
871-
$style .= sprintf(' title="%d%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : '');
870+
$dumpTitle = sprintf('%d%s characters', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : '');
872871
} elseif ('note' === $style && 0 < ($attr['depth'] ?? 0) && false !== $c = strrpos($value, '\\')) {
873-
$style .= ' title=""';
874872
$attr += [
875873
'ellipsis' => \strlen($value) - $c,
876874
'ellipsis-type' => 'note',
877875
'ellipsis-tail' => 1,
878876
];
879877
} elseif ('protected' === $style) {
880-
$style .= ' title="Protected property"';
878+
$dumpTitle = 'Protected property';
881879
} elseif ('meta' === $style && isset($attr['title'])) {
882-
$style .= sprintf(' title="%s"', esc($this->utf8Encode($attr['title'])));
880+
$dumpTitle = esc($this->utf8Encode($attr['title']));
883881
} elseif ('private' === $style) {
884-
$style .= sprintf(' title="Private property defined in class:&#10;`%s`"', esc($this->utf8Encode($attr['class'])));
882+
$dumpTitle = sprintf('Private property defined in class:&#10;`%s`"', esc($this->utf8Encode($attr['class'])));
885883
}
886884

887885
if (isset($attr['ellipsis'])) {
888-
$class = 'sf-dump-ellipsis';
886+
$dumpClasses[] = 'sf-dump-ellipsization';
887+
$ellipsisClass = 'sf-dump-ellipsis';
889888
if (isset($attr['ellipsis-type'])) {
890-
$class = sprintf('"%s sf-dump-ellipsis-%s"', $class, $attr['ellipsis-type']);
889+
$ellipsisClass .= ' sf-dump-ellipsis-'.$attr['ellipsis-type'];
891890
}
892891
$label = esc(substr($value, -$attr['ellipsis']));
893-
$style = str_replace(' title="', " title=\"$v\n", $style);
894-
$v = sprintf('<span class=%s>%s</span>', $class, substr($v, 0, -\strlen($label)));
892+
$dumpTitle = $v."\n".$dumpTitle;
893+
$v = sprintf('<span class="%s">%s</span>', $ellipsisClass, substr($v, 0, -\strlen($label)));
895894

896895
if (!empty($attr['ellipsis-tail'])) {
897896
$tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail'])));
898-
$v .= sprintf('<span class=%s>%s</span>%s', $class, substr($label, 0, $tail), substr($label, $tail));
897+
$v .= sprintf('<span class="%s">%s</span><span class="sf-dump-ellipsis-tail">%s</span>', $ellipsisClass, substr($label, 0, $tail), substr($label, $tail));
899898
} else {
900-
$v .= $label;
899+
$v .= sprintf('<span class="sf-dump-ellipsis-tail">%s</span>', $label);
901900
}
902901
}
903902

904903
$map = static::$controlCharsMap;
905-
$v = "<span class=sf-dump-{$style}>".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) {
906-
$s = $b = '<span class="sf-dump-default';
907-
$c = $c[$i = 0];
908-
if ($ns = "\r" === $c[$i] || "\n" === $c[$i]) {
909-
$s .= ' sf-dump-ns';
910-
}
911-
$s .= '">';
912-
do {
913-
if (("\r" === $c[$i] || "\n" === $c[$i]) !== $ns) {
914-
$s .= '</span>'.$b;
915-
if ($ns = !$ns) {
916-
$s .= ' sf-dump-ns';
917-
}
918-
$s .= '">';
904+
$v = sprintf(
905+
'<span class=%s%s%1$s%s>%s</span>',
906+
1 === count($dumpClasses) ? '' : '"',
907+
implode(' ', $dumpClasses),
908+
$dumpTitle ? ' title="'.$dumpTitle.'"' : '',
909+
preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) {
910+
$s = $b = '<span class="sf-dump-default';
911+
$c = $c[$i = 0];
912+
if ($ns = "\r" === $c[$i] || "\n" === $c[$i]) {
913+
$s .= ' sf-dump-ns';
919914
}
915+
$s .= '">';
916+
do {
917+
if (("\r" === $c[$i] || "\n" === $c[$i]) !== $ns) {
918+
$s .= '</span>'.$b;
919+
if ($ns = !$ns) {
920+
$s .= ' sf-dump-ns';
921+
}
922+
$s .= '">';
923+
}
920924

921-
$s .= $map[$c[$i]] ?? sprintf('\x%02X', \ord($c[$i]));
922-
} while (isset($c[++$i]));
925+
$s .= $map[$c[$i]] ?? sprintf('\x%02X', \ord($c[$i]));
926+
} while (isset($c[++$i]));
923927

924-
return $s.'</span>';
925-
}, $v).'</span>';
928+
return $s.'</span>';
929+
}, $v)
930+
);
926931

927932
if (!($attr['binary'] ?? false)) {
928933
$v = preg_replace_callback(static::$unicodeCharsRx, function ($c) {

‎src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php
+4-4Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,12 @@ public function testHtmlDump()
259259
<foo></foo><bar><span class=sf-dump-note>Exception</span> {<samp data-depth=1 class=sf-dump-expanded>
260260
#<span class=sf-dump-protected title="Protected property">message</span>: "<span class=sf-dump-str>1</span>"
261261
#<span class=sf-dump-protected title="Protected property">code</span>: <span class=sf-dump-num>0</span>
262-
#<span class=sf-dump-protected title="Protected property">file</span>: "<span class=sf-dump-str title="%sExceptionCasterTest.php
263-
%d characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%s%eVarDumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%e</span>Tests%eCaster%eExceptionCasterTest.php</span>"
262+
#<span class=sf-dump-protected title="Protected property">file</span>: "<span class="sf-dump-str sf-dump-ellipsization" title="%sExceptionCasterTest.php
263+
%d characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%s%eVarDumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%e</span><span class="sf-dump-ellipsis-tail">Tests%eCaster%eExceptionCasterTest.php</span></span>"
264264
#<span class=sf-dump-protected title="Protected property">line</span>: <span class=sf-dump-num>%d</span>
265265
<span class=sf-dump-meta>trace</span>: {<samp data-depth=2 class=sf-dump-compact>
266-
<span class=sf-dump-meta title="%sExceptionCasterTest.php
267-
Stack level %d."><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%s%eVarDumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%e</span>Tests%eCaster%eExceptionCasterTest.php</span>:<span class=sf-dump-num>%d</span>
266+
<span class="sf-dump-meta sf-dump-ellipsization" title="%sExceptionCasterTest.php
267+
Stack level %d."><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%s%eVarDumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%e</span><span class="sf-dump-ellipsis-tail">Tests%eCaster%eExceptionCasterTest.php</span></span>:<span class=sf-dump-num>%d</span>
268268
&#8230;%d
269269
</samp>}
270270
</samp>}

‎src/Symfony/Component/VarDumper/Tests/Caster/StubCasterTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/VarDumper/Tests/Caster/StubCasterTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ public function testClassStubWithNotExistingClass()
175175

176176
$expectedDump = <<<'EODUMP'
177177
<foo></foo><bar><span class=sf-dump-note>array:1</span> [<samp data-depth=1 class=sf-dump-expanded>
178-
<span class=sf-dump-index>0</span> => "<span class=sf-dump-str title="Symfony\Component\VarDumper\Tests\Caster\NotExisting
179-
52 characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-class">Symfony\Component\VarDumper\Tests\Caster</span><span class="sf-dump-ellipsis sf-dump-ellipsis-class">\</span>NotExisting</span>"
178+
<span class=sf-dump-index>0</span> => "<span class="sf-dump-str sf-dump-ellipsization" title="Symfony\Component\VarDumper\Tests\Caster\NotExisting
179+
52 characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-class">Symfony\Component\VarDumper\Tests\Caster</span><span class="sf-dump-ellipsis sf-dump-ellipsis-class">\</span><span class="sf-dump-ellipsis-tail">NotExisting</span></span>"
180180
</samp>]
181181
</bar>
182182
EODUMP;

‎src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php
+10-10Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,18 @@ public function testGet()
7979
<span class=sf-dump-meta>seekable</span>: <span class=sf-dump-const>true</span>
8080
%A <span class=sf-dump-meta>options</span>: []
8181
</samp>}
82-
"<span class=sf-dump-key>obj</span>" => <span class=sf-dump-note title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo
83-
"><span class="sf-dump-ellipsis sf-dump-ellipsis-note">Symfony\Component\VarDumper\Tests\Fixture</span><span class="sf-dump-ellipsis sf-dump-ellipsis-note">\</span>DumbFoo</span> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a><samp data-depth=2 id={$dumpId}-ref2%d class=sf-dump-compact>
82+
"<span class=sf-dump-key>obj</span>" => <span class="sf-dump-note sf-dump-ellipsization" title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo
83+
"><span class="sf-dump-ellipsis sf-dump-ellipsis-note">Symfony\Component\VarDumper\Tests\Fixture</span><span class="sf-dump-ellipsis sf-dump-ellipsis-note">\</span><span class="sf-dump-ellipsis-tail">DumbFoo</span></span> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a><samp data-depth=2 id={$dumpId}-ref2%d class=sf-dump-compact>
8484
+<span class=sf-dump-public title="Public property">foo</span>: "<span class=sf-dump-str title="3 characters">foo</span>"
8585
+"<span class=sf-dump-public title="Runtime added dynamic property">bar</span>": "<span class=sf-dump-str title="3 characters">bar</span>"
8686
</samp>}
8787
"<span class=sf-dump-key>closure</span>" => <span class=sf-dump-note>Closure(\$a, ?PDO &amp;\$b = null)</span> {<a class=sf-dump-ref>#%d</a><samp data-depth=2 class=sf-dump-compact>
88-
<span class=sf-dump-meta>class</span>: "<span class=sf-dump-str title="Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest
89-
55 characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-class">Symfony\Component\VarDumper\Tests\Dumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-class">\</span>HtmlDumperTest</span>"
90-
<span class=sf-dump-meta>this</span>: <span class=sf-dump-note title="Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest
91-
"><span class="sf-dump-ellipsis sf-dump-ellipsis-note">Symfony\Component\VarDumper\Tests\Dumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-note">\</span>HtmlDumperTest</span> {<a class=sf-dump-ref>#%d</a> &%s;}
92-
<span class=sf-dump-meta>file</span>: "<span class=sf-dump-str title="{$var['file']}
93-
%d characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%s%eVarDumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%e</span>Tests%eFixtures%edumb-var.php</span>"
88+
<span class=sf-dump-meta>class</span>: "<span class="sf-dump-str sf-dump-ellipsization" title="Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest
89+
55 characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-class">Symfony\Component\VarDumper\Tests\Dumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-class">\</span><span class="sf-dump-ellipsis-tail">HtmlDumperTest</span></span>"
90+
<span class=sf-dump-meta>this</span>: <span class="sf-dump-note sf-dump-ellipsization" title="Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest
91+
"><span class="sf-dump-ellipsis sf-dump-ellipsis-note">Symfony\Component\VarDumper\Tests\Dumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-note">\</span><span class="sf-dump-ellipsis-tail">HtmlDumperTest</span></span> {<a class=sf-dump-ref>#%d</a> &%s;}
92+
<span class=sf-dump-meta>file</span>: "<span class="sf-dump-str sf-dump-ellipsization" title="{$var['file']}
93+
%d characters"><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%s%eVarDumper</span><span class="sf-dump-ellipsis sf-dump-ellipsis-path">%e</span><span class="sf-dump-ellipsis-tail">Tests%eFixtures%edumb-var.php</span></span>"
9494
<span class=sf-dump-meta>line</span>: "<span class=sf-dump-str title="%d characters">{$var['line']} to {$var['line']}</span>"
9595
</samp>}
9696
"<span class=sf-dump-key>line</span>" => <span class=sf-dump-num>{$var['line']}</span>
@@ -101,8 +101,8 @@ public function testGet()
101101
<span class=sf-dump-index>0</span> => <a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a> <span class=sf-dump-note>array:1</span> [<a class=sf-dump-ref href=#{$dumpId}-ref04 title="2 occurrences">&amp;4</a>]
102102
</samp>]
103103
<span class=sf-dump-key>8</span> => <a class=sf-dump-ref href=#{$dumpId}-ref01 title="2 occurrences">&amp;1</a> <span class=sf-dump-const>null</span>
104-
"<span class=sf-dump-key>sobj</span>" => <span class=sf-dump-note title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo
105-
"><span class="sf-dump-ellipsis sf-dump-ellipsis-note">Symfony\Component\VarDumper\Tests\Fixture</span><span class="sf-dump-ellipsis sf-dump-ellipsis-note">\</span>DumbFoo</span> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a>}
104+
"<span class=sf-dump-key>sobj</span>" => <span class="sf-dump-note sf-dump-ellipsization" title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo
105+
"><span class="sf-dump-ellipsis sf-dump-ellipsis-note">Symfony\Component\VarDumper\Tests\Fixture</span><span class="sf-dump-ellipsis sf-dump-ellipsis-note">\</span><span class="sf-dump-ellipsis-tail">DumbFoo</span></span> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a>}
106106
"<span class=sf-dump-key>snobj</span>" => <a class=sf-dump-ref href=#{$dumpId}-ref03 title="2 occurrences">&amp;3</a> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
107107
"<span class=sf-dump-key>snobj2</span>" => {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="3 occurrences">#%d</a>}
108108
"<span class=sf-dump-key>file</span>" => "<span class=sf-dump-str title="%d characters">{$var['file']}</span>"

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.