Skip to content

Commit fc2319d

Browse files
committed
Add regression test with wrong output
1 parent b30be40 commit fc2319d

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

ext/dom/tests/gh11404.phpt

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
--TEST--
2+
GH-11404: DOMDocument::savexml and friends ommit xmlns="" declaration for null namespace, creating incorrect xml representation of the DOM
3+
--EXTENSIONS--
4+
dom
5+
--FILE--
6+
<?php
7+
8+
echo "-- Test append and attributes: with default namespace variation --\n";
9+
10+
function testAppendAndAttributes($dom) {
11+
$nodeA = $dom->createElement('a');
12+
$nodeB = $dom->createElementNS(null, 'b');
13+
$nodeC = $dom->createElementNS('', 'c');
14+
$nodeD = $dom->createElement('d');
15+
$nodeD->setAttributeNS('some:ns', 'x:attrib', 'val');
16+
$nodeE = $dom->createElementNS('some:ns', 'e');
17+
// And these two respect the default ns.
18+
$nodeE->setAttributeNS(null, 'attrib1', 'val');
19+
$nodeE->setAttributeNS('', 'attrib2', 'val');
20+
21+
$dom->documentElement->appendChild($nodeA);
22+
$dom->documentElement->appendChild($nodeB);
23+
$dom->documentElement->appendChild($nodeC);
24+
$dom->documentElement->appendChild($nodeD);
25+
$dom->documentElement->appendChild($nodeE);
26+
27+
var_dump($nodeA->namespaceURI);
28+
var_dump($nodeB->namespaceURI);
29+
var_dump($nodeC->namespaceURI);
30+
var_dump($nodeD->namespaceURI);
31+
var_dump($nodeE->namespaceURI);
32+
33+
$subtree = $dom->createElement('subtree');
34+
$subtree->appendChild($dom->createElementNS('some:ns', 'subtreechild1'));
35+
$subtree->firstElementChild->appendChild($dom->createElement('subtreechild2'));
36+
$dom->documentElement->appendChild($subtree);
37+
38+
echo $dom->saveXML();
39+
}
40+
41+
$dom1 = new DOMDocument;
42+
$dom1->loadXML('<?xml version="1.0" ?><with xmlns="some:ns" />');
43+
testAppendAndAttributes($dom1);
44+
45+
echo "-- Test append and attributes: without default namespace variation --\n";
46+
47+
$dom1 = new DOMDocument;
48+
$dom1->loadXML('<?xml version="1.0" ?><with/>');
49+
testAppendAndAttributes($dom1);
50+
51+
echo "-- Test import --\n";
52+
53+
function testImport(?string $href, string $toBeImported) {
54+
$dom1 = new DOMDocument;
55+
$decl = $href === NULL ? '' : "xmlns=\"$href\"";
56+
$dom1->loadXML('<?xml version="1.0" ?><with ' . $decl . '/>');
57+
58+
$dom2 = new DOMDocument;
59+
$dom2->loadXML('<?xml version="1.0" ?>' . $toBeImported);
60+
61+
$dom1->documentElement->append(
62+
$imported = $dom1->importNode($dom2->documentElement, true)
63+
);
64+
65+
var_dump($imported->namespaceURI);
66+
67+
echo $dom1->saveXML();
68+
}
69+
70+
testImport(null, '<none/>');
71+
testImport('', '<none/>');
72+
testImport('some:ns', '<none/>');
73+
testImport('', '<none><div xmlns="some:ns"/></none>');
74+
testImport('some:ns', '<none xmlns="some:ns"><div xmlns=""/></none>');
75+
76+
echo "-- Namespace URI comparison --\n";
77+
78+
$dom1 = new DOMDocument;
79+
$dom1->loadXML('<?xml version="1.0"?><test xmlns="a:b"><div/></test>');
80+
var_dump($dom1->firstElementChild->namespaceURI);
81+
var_dump($dom1->firstElementChild->firstElementChild->namespaceURI);
82+
83+
$dom1 = new DOMDocument;
84+
$dom1->appendChild($dom1->createElementNS('a:b', 'parent'));
85+
$dom1->firstElementChild->appendChild($dom1->createElementNS('a:b', 'child1'));
86+
$dom1->firstElementChild->appendChild($second = $dom1->createElement('child2'));
87+
var_dump($dom1->firstElementChild->namespaceURI);
88+
var_dump($dom1->firstElementChild->firstElementChild->namespaceURI);
89+
var_dump($second->namespaceURI);
90+
var_dump($dom1->saveXML());
91+
92+
$dom1 = new DOMDocument;
93+
$dom1->loadXML('<?xml version="1.0"?><test xmlns="a:b"/>');
94+
var_dump($dom1->firstElementChild->namespaceURI);
95+
$dom1->firstElementChild->appendChild($dom1->createElementNS('a:b', 'tag'));
96+
var_dump($dom1->firstElementChild->firstElementChild->namespaceURI);
97+
?>
98+
--EXPECT--
99+
-- Test append and attributes: with default namespace variation --
100+
NULL
101+
NULL
102+
string(0) ""
103+
NULL
104+
string(7) "some:ns"
105+
<?xml version="1.0"?>
106+
<with xmlns="some:ns"><a/><b/><c xmlns=""/><d xmlns:x="some:ns" x:attrib="val"/><e attrib1="val" attrib2="val"/><subtree><subtreechild1 xmlns="some:ns"><subtreechild2/></subtreechild1></subtree></with>
107+
-- Test append and attributes: without default namespace variation --
108+
NULL
109+
NULL
110+
string(0) ""
111+
NULL
112+
string(7) "some:ns"
113+
<?xml version="1.0"?>
114+
<with><a/><b/><c xmlns=""/><d xmlns:x="some:ns" x:attrib="val"/><e xmlns="some:ns" attrib1="val" attrib2="val"/><subtree><subtreechild1 xmlns="some:ns"><subtreechild2/></subtreechild1></subtree></with>
115+
-- Test import --
116+
NULL
117+
<?xml version="1.0"?>
118+
<with><none/></with>
119+
NULL
120+
<?xml version="1.0"?>
121+
<with xmlns=""><none/></with>
122+
NULL
123+
<?xml version="1.0"?>
124+
<with xmlns="some:ns"><none/></with>
125+
NULL
126+
<?xml version="1.0"?>
127+
<with xmlns=""><none><div xmlns="some:ns"/></none></with>
128+
string(7) "some:ns"
129+
<?xml version="1.0"?>
130+
<with xmlns="some:ns"><none><div xmlns=""/></none></with>
131+
-- Namespace URI comparison --
132+
string(3) "a:b"
133+
string(3) "a:b"
134+
string(3) "a:b"
135+
string(3) "a:b"
136+
NULL
137+
string(70) "<?xml version="1.0"?>
138+
<parent xmlns="a:b"><child1/><child2/></parent>
139+
"
140+
string(3) "a:b"
141+
string(3) "a:b"

0 commit comments

Comments
 (0)