1--TEST--
2Cloning an attribute should retain its namespace 01
3--EXTENSIONS--
4dom
5--FILE--
6<?php
7
8function createTestDocument() {
9    $dom = new DOMDocument;
10    $dom->loadXML('<?xml version="1.0"?><container/>');
11    $dom->documentElement->setAttributeNs("some:ns", "foo:bar", "value");
12
13    $attr = $dom->documentElement->getAttributeNodeNs("some:ns", "bar");
14    $clone = $attr->cloneNode(true);
15
16    return [$dom, $clone];
17}
18
19[$dom, $clone] = createTestDocument();
20var_dump($clone->prefix, $clone->namespaceURI);
21
22echo "--- Re-adding a namespaced attribute ---\n";
23
24[$dom, $clone] = createTestDocument();
25$dom->documentElement->removeAttributeNs("some:ns", "bar");
26echo $dom->saveXML();
27$dom->documentElement->setAttributeNodeNs($clone);
28echo $dom->saveXML();
29
30echo "--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNodeNs variation) ---\n";
31
32function readd_test(string $method) {
33    [$dom, $clone] = createTestDocument();
34    $dom->documentElement->removeAttributeNs("some:ns", "bar");
35    $dom->documentElement->removeAttribute("xmlns:foo");
36    echo $dom->saveXML();
37    $child = $dom->documentElement->appendChild($dom->createElement("child"));
38    $child->{$method}($clone);
39    echo $dom->saveXML();
40}
41
42readd_test("setAttributeNodeNs");
43
44echo "--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNode variation) ---\n";
45
46readd_test("setAttributeNode");
47
48echo "--- Re-adding a namespaced attribute, with the namespace deleted (appendChild variation) ---\n";
49
50readd_test("appendChild");
51
52echo "--- Removing the document reference should not crash ---\n";
53
54[$dom, $clone] = createTestDocument();
55unset($dom);
56var_dump($clone->prefix, $clone->namespaceURI);
57
58?>
59--EXPECT--
60string(3) "foo"
61string(7) "some:ns"
62--- Re-adding a namespaced attribute ---
63<?xml version="1.0"?>
64<container xmlns:foo="some:ns"/>
65<?xml version="1.0"?>
66<container xmlns:foo="some:ns" foo:bar="value"/>
67--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNodeNs variation) ---
68<?xml version="1.0"?>
69<container/>
70<?xml version="1.0"?>
71<container><child xmlns:foo="some:ns" foo:bar="value"/></container>
72--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNode variation) ---
73<?xml version="1.0"?>
74<container/>
75<?xml version="1.0"?>
76<container><child xmlns:foo="some:ns" foo:bar="value"/></container>
77--- Re-adding a namespaced attribute, with the namespace deleted (appendChild variation) ---
78<?xml version="1.0"?>
79<container/>
80<?xml version="1.0"?>
81<container><child xmlns:foo="some:ns" foo:bar="value"/></container>
82--- Removing the document reference should not crash ---
83string(3) "foo"
84string(7) "some:ns"
85