diff --git a/src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerAllTest.php b/src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerAllTest.php
index 7e53d8c3a3207..18c175ba296e8 100644
--- a/src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerAllTest.php
+++ b/src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerAllTest.php
@@ -237,16 +237,21 @@ public function provideSanitizeBody()
],
[
'
',
- '',
],
[
'',
- '',
+ '',
],
[
'
',
'
',
],
+ [
+ '
',
+ '
',
+ ],
+
[
'',
'',
@@ -445,6 +450,11 @@ public function provideSanitizeBody()
'Lorem ipsum',
'Lorem ipsum',
],
+ [
+ '',
+ '',
+ ],
+
[
'Lorem ipsum',
'Lorem ipsum',
diff --git a/src/Symfony/Component/HtmlSanitizer/Visitor/Node/Node.php b/src/Symfony/Component/HtmlSanitizer/Visitor/Node/Node.php
index 76838028dbc0d..8a4e5c32aa7ac 100644
--- a/src/Symfony/Component/HtmlSanitizer/Visitor/Node/Node.php
+++ b/src/Symfony/Component/HtmlSanitizer/Visitor/Node/Node.php
@@ -20,6 +20,25 @@
*/
final class Node implements NodeInterface
{
+ // HTML5 elements which are self-closing
+ private const VOID_ELEMENTS = [
+ 'area' => true,
+ 'base' => true,
+ 'br' => true,
+ 'col' => true,
+ 'embed' => true,
+ 'hr' => true,
+ 'img' => true,
+ 'input' => true,
+ 'keygen' => true,
+ 'link' => true,
+ 'meta' => true,
+ 'param' => true,
+ 'source' => true,
+ 'track' => true,
+ 'wbr' => true,
+ ];
+
private NodeInterface $parent;
private string $tagName;
private array $attributes = [];
@@ -56,7 +75,7 @@ public function addChild(NodeInterface $node): void
public function render(): string
{
- if (!$this->children) {
+ if (isset(self::VOID_ELEMENTS[$this->tagName])) {
return '<'.$this->tagName.$this->renderAttributes().' />';
}