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().' />'; }