]> granicus.if.org Git - php/commitdiff
- fix bug #49463 (setAttributeNS fails setting default namespace)
authorPierre Joye <pajoye@php.net>
Wed, 3 Feb 2010 20:04:38 +0000 (20:04 +0000)
committerPierre Joye <pajoye@php.net>
Wed, 3 Feb 2010 20:04:38 +0000 (20:04 +0000)
ext/dom/element.c
ext/dom/tests/bug49463.phpt [new file with mode: 0644]

index c4e192b37d8b54523395de2f4eed50474d67676d..785bf3faeba7efb6e350238f85cce06067aab5e3 100644 (file)
@@ -777,9 +777,15 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
                                node_list_unlink(nodep->children TSRMLS_CC);
                        }
 
-                       if (xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") && xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
+                       if ((xmlStrEqual((xmlChar *) prefix, (xmlChar *)"xmlns") || 
+                               (prefix == NULL && xmlStrEqual((xmlChar *) localname, (xmlChar *)"xmlns"))) && 
+                               xmlStrEqual((xmlChar *) uri, (xmlChar *)DOM_XMLNS_NAMESPACE)) {
                                is_xmlns = 1;
-                               nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
+                               if (prefix == NULL) {
+                                       nsptr = dom_get_nsdecl(elemp, NULL);
+                               } else {
+                                       nsptr = dom_get_nsdecl(elemp, (xmlChar *)localname);
+                               }
                        } else {
                                nsptr = xmlSearchNsByHref(elemp->doc, elemp, (xmlChar *)uri);
                                if (nsptr && nsptr->prefix == NULL) {
@@ -802,7 +808,12 @@ PHP_FUNCTION(dom_element_set_attribute_ns)
 
                        if (nsptr == NULL) {
                                if (prefix == NULL) {
-                                       errorcode = NAMESPACE_ERR;
+                                       if (is_xmlns == 1) {
+                                               xmlNewNs(elemp, (xmlChar *)value, NULL);
+                                               xmlReconciliateNs(elemp->doc, elemp);
+                                       } else {
+                                               errorcode = NAMESPACE_ERR;
+                                       }
                                } else {
                                        if (is_xmlns == 1) {
                                                xmlNewNs(elemp, (xmlChar *)value, (xmlChar *)localname);
diff --git a/ext/dom/tests/bug49463.phpt b/ext/dom/tests/bug49463.phpt
new file mode 100644 (file)
index 0000000..4f232e3
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Bug #49463 (setAttributeNS fails setting default namespace).
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$doc = new DOMDocument('1.0', 'utf-8');
+$root = $doc->createElementNS('http://purl.org/rss/1.0/','rdf:RDF');
+$doc->appendChild($root);
+$root->setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://purl.org/rss/1.0/" );
+
+echo $doc->saveXML()."\n";
+?>
+--EXPECT--
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF xmlns:rdf="http://purl.org/rss/1.0/" xmlns="http://purl.org/rss/1.0/"/>