From 9eacd21c9d6b14a7f386a1a0c41ef3154fb614a5 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Wed, 31 Mar 2021 11:59:08 -0400 Subject: [PATCH] Test edges of element serialization --- lib/DOM/Document.php | 6 ++++- lib/DOM/Element.php | 6 +++-- tests/cases/TestDOM.php | 40 ++++++++++++++++++++++++++++ tests/cases/TestSerializer.php | 7 +---- tests/cases/serializer/menbeam01.dat | 20 ++++++++++++++ tests/phpunit.dist.xml | 3 +++ 6 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 tests/cases/TestDOM.php create mode 100644 tests/cases/serializer/menbeam01.dat diff --git a/lib/DOM/Document.php b/lib/DOM/Document.php index 18c000f..4d60f6e 100644 --- a/lib/DOM/Document.php +++ b/lib/DOM/Document.php @@ -98,7 +98,11 @@ class Document extends \DOMDocument { // Replace any offending characters with "UHHHHHH" where H are the // uppercase hexadecimal digits of the character's code point $this->mangledElements = true; - $qualifiedName = $this->coerceName($qualifiedName); + if ($namespaceURI !== null) { + $qualifiedName = implode(":", array_map([$this, "coerceName"], explode(":", $qualifiedName, 2))); + } else { + $qualifiedName = $this->coerceName($qualifiedName); + } return parent::createElementNS($namespaceURI, $qualifiedName, $value); } } diff --git a/lib/DOM/Element.php b/lib/DOM/Element.php index 8df8133..3e8d6ad 100644 --- a/lib/DOM/Element.php +++ b/lib/DOM/Element.php @@ -336,9 +336,11 @@ class Element extends \DOMElement { # The attribute’s serialized name is the attribute’s qualified name. $name = $attr->nodeName; } - + // undo any name mangling + if (strpos($name, 'U') !== false) { + $name = $this->uncoerceName($name); + } $value = $this->escapeString($attr->value, true); - $s .= " $name=\"$value\""; } diff --git a/tests/cases/TestDOM.php b/tests/cases/TestDOM.php new file mode 100644 index 0000000..497d467 --- /dev/null +++ b/tests/cases/TestDOM.php @@ -0,0 +1,40 @@ +createElementNS($ns, $name); + $this->assertSame($ns, $e->namespaceURI); + $this->assertSame($local, $e->localName); + $this->assertSame($prefix, $e->prefix); + } + + public function provideNamespacedElements(): iterable { + return [ + [null, "test", "test", ""], + [null, "test:test", "testU00003Atest", ""], + ["http://www.w3.org/2000/svg", "svg", "svg", ""], + ["http://www.w3.org/2000/svg", "svg:svg", "svg", "svg"], + ["fake_ns", "test:test", "test", "test"], + ["fake_ns", "test:test:test", "testU00003Atest", "test"], + ["fake_ns", "te st:test", "test", "teU000020st"], + ]; + } +} diff --git a/tests/cases/TestSerializer.php b/tests/cases/TestSerializer.php index 73fdfde..b807f01 100644 --- a/tests/cases/TestSerializer.php +++ b/tests/cases/TestSerializer.php @@ -18,11 +18,6 @@ use MensBeam\HTML\Parser; * @covers \MensBeam\HTML\Text */ class TestSerializer extends \PHPUnit\Framework\TestCase { - use \MensBeam\HTML\EscapeString; - - protected $out; - protected $depth; - /** @dataProvider provideStandardSerializerTests */ public function testStandardTreeTests(array $data, bool $fragment, string $exp): void { $node = $this->buildTree($data, $fragment); @@ -112,7 +107,7 @@ class TestSerializer extends \PHPUnit\Framework\TestCase { $cur->appendChild($document->implementation->createDocumentType($name, $public, $system)); } elseif (preg_match('/^<(?:([^ ]+) )?([^>]+)>$/', $d, $m)) { // element - $ns = strlen((string) $m[1]) ? (array_flip(Parser::NAMESPACE_MAP)[$m[1]] ?? null) : null; + $ns = strlen((string) $m[1]) ? (array_flip(Parser::NAMESPACE_MAP)[$m[1]] ?? $m[1]) : null; $cur = $cur->appendChild($document->createElementNS($ns, $m[2])); $pad += 2; } elseif (preg_match('/^(?:([^" ]+) )?([^"=]+)="((?:[^"]|"(?!$))*)"$/', $d, $m)) { diff --git a/tests/cases/serializer/menbeam01.dat b/tests/cases/serializer/menbeam01.dat new file mode 100644 index 0000000..ebc5130 --- /dev/null +++ b/tests/cases/serializer/menbeam01.dat @@ -0,0 +1,20 @@ +#fragment +| +#output + + +#fragment +| +#output + + +#fragment +| +#output + + +#fragment +| +| test diff --git a/tests/phpunit.dist.xml b/tests/phpunit.dist.xml index ea81c63..5d8d3c3 100644 --- a/tests/phpunit.dist.xml +++ b/tests/phpunit.dist.xml @@ -16,6 +16,9 @@ + + cases/TestDOM.php + cases/TestCharset.php