[gxml] GomElement: Improved namespace conflic detection



commit f0de5964ccec08172163b9dfb57625cba2540f11
Author: Daniel Espinosa <esodan gmail com>
Date:   Thu Nov 3 09:54:24 2016 -0600

    GomElement: Improved namespace conflic detection
    
    Now setting a namespace attribute doesn't update
    the one at Element. Updated Tests.
    
    Redefinition of xmlns detection improved.

 gxml/GomElement.vala      |   29 ++++++++++-------------------
 test/GomDocumentTest.vala |   25 ++++++++++++++-----------
 2 files changed, 24 insertions(+), 30 deletions(-)
---
diff --git a/gxml/GomElement.vala b/gxml/GomElement.vala
index 1cb79c9..b64e8b8 100644
--- a/gxml/GomElement.vala
+++ b/gxml/GomElement.vala
@@ -210,9 +210,11 @@ public class GXml.GomElement : GomNode,
         if (s.length > 2) return null;
         p = s[0];
         n = s[1];
+        if (p == "xml")
+          ns = "http://www.w3.org/2000/xmlns/";;
         if (p == "xmlns")
           ns = _element.lookup_namespace_uri (n);
-        else
+        if (p != "xmlns" && p != "xml")
           ns =  _element.lookup_namespace_uri (p);
       }
       string val = get (name);
@@ -288,8 +290,6 @@ public class GXml.GomElement : GomNode,
       if ((node as DomAttr).prefix == "xmlns"
           && node.node_name == "xmlns")
         throw new DomError.NAMESPACE_ERROR (_("Invalid namespace attribute's name."));
-    GLib.message ("Searching for duplicated ns..."+node.node_value
-                  +" NS: "+(node as DomAttr).namespace_uri);
       if ((node as DomAttr).prefix == "xmlns"
           || (node as DomAttr).local_name == "xmlns") {
         string asp = _element.get_attribute_ns (node.node_value,
@@ -298,6 +298,8 @@ public class GXml.GomElement : GomNode,
       }
       if ((node as DomAttr).namespace_uri == "http://www.w3.org/2000/xmlns/";
           || (node as DomAttr).namespace_uri == "http://www.w3.org/2000/xmlns";) {
+        GLib.message ("Searching for duplicated ns..."+node.node_value
+                  +" NS: "+(node as DomAttr).namespace_uri);
         if (node.node_name == "xmlns") {
           string ns_uri = _element.lookup_namespace_uri (null);
           if (ns_uri != null && ns_uri != node.node_value) {
@@ -308,12 +310,13 @@ public class GXml.GomElement : GomNode,
           }
         }
         if ((node as DomAttr).prefix == "xmlns") {
-        GLib.message ("Attr Prefix = "+(node as DomAttr).prefix
+          GLib.message ("Attr Prefix = "+(node as DomAttr).prefix
                       + "Attr Name: "+(node as DomAttr).local_name);
           string nsprefix = _element.lookup_prefix (node.node_value);
-          string nsuri = _element.lookup_namespace_uri (nsprefix);
-          if (nsprefix != (node as DomAttr).prefix
-              && nsuri != null && nsuri != node.node_value) {
+          string nsuri = _element.lookup_namespace_uri (node.node_name);
+          if ((nsprefix != null || nsuri != null)
+              && (nsprefix != (node as DomAttr).prefix
+                  || nsuri != node.node_value)) {
             GLib.message ("Prefix: "+nsprefix+" Prefix Attr:"+(node as DomAttr).local_name);
             throw new DomError.NAMESPACE_ERROR
                       (_("Redefinition of namespace's prefix for %s")
@@ -401,18 +404,6 @@ public class GXml.GomElement : GomNode,
        throw new DomError.NAMESPACE_ERROR (_("Invalid namespace. If attribute's name is xmlns name space uri 
shoud be http://www.w3.org/2000/xmlns/";));
     if (p == "" && n != "xmlns" && n != "xml")
       throw new DomError.NAMESPACE_ERROR (_("Invalid attribute name. No prefixed attributes should use xmlns 
name"));
-    // Check if a namespace is set
-    if (_prefix == null && _namespace_uri == null) {
-      GLib.message ("Setting NS:"+p+":"+n+":"+namespace_uri+":"+value);
-      if (p == "xmlns" &&
-          (namespace_uri == "http://www.w3.org/2000/xmlns/";
-           || namespace_uri == "http://www.w3.org/2000/xmlns";)) {
-        _prefix = n;
-        _namespace_uri = value;
-      }
-      if (n == "xmlns" && p == "")
-        _namespace_uri = value;
-    }
     var a = new GomAttr.namespace (this, namespace_uri, p, n, value);
     try { _attributes.set_named_item_ns (a); }
     catch (GLib.Error e) {
diff --git a/test/GomDocumentTest.vala b/test/GomDocumentTest.vala
index 3b29639..de1c1ca 100644
--- a/test/GomDocumentTest.vala
+++ b/test/GomDocumentTest.vala
@@ -102,6 +102,7 @@ class GomDocumentTest : GXmlTest {
                                var d = new GomDocument.from_file (rf);
                                assert (d != null);
                                assert (d.document_element != null);
+                               GLib.message ("File read: "+d.to_string ());
                                assert (d.document_element.node_name == "Project");
                                bool fname, fshordesc, fdescription, fhomepage;
                                fname = fshordesc = fdescription = fhomepage = false;
@@ -306,24 +307,23 @@ class GomDocumentTest : GXmlTest {
                                doc.document_element.set_attribute_ns ("http://www.w3.org/2000/xmlns/";,
                                                                                                              
                                                                          
"xmlns","http://www.gnome.org/GXml";);
                                assert (doc.document_element != null);
-                               assert (doc.document_element.namespace_uri != null);
-                               assert (doc.document_element.namespace_uri == "http://www.gnome.org/GXml";);
+                               assert (doc.document_element.namespace_uri == null);
                                assert (doc.document_element.prefix == null);
                                assert (doc.document_element.child_nodes != null);
                                assert (doc.document_element.child_nodes.size == 1);
                                var c = doc.document_element.child_nodes[0] as DomElement;
                                assert (c is DomElement);
                                c.set_attribute_ns ("http://www.w3.org/2000/xmlns/","xmlns:gxml2";, 
"http://www.gnome.org/GXml2";);
-                               assert (c.prefix == "gxml2");
-                               assert (c.namespace_uri == "http://www.gnome.org/GXml2";);
+                               assert (c.prefix == null);
+                               assert (c.namespace_uri == null);
                                c.set_attribute_ns ("http://www.gnome.org/GXml2","gxml2:prop","val";);
                                var p = (c as DomElement).get_attribute_ns ("http://www.gnome.org/GXml2";, 
"prop");
                                assert (p != null);
                                assert (p == "val");
                                assert (doc.document_element.lookup_namespace_uri (null) != null);
                                GLib.message ("NS default: "+doc.document_element.lookup_namespace_uri 
(null));
-                               assert (c.prefix == "gxml2");
-                               assert (c.namespace_uri == "http://www.gnome.org/GXml2";);
+                               assert (c.prefix == null);
+                               assert (c.namespace_uri == null);
                                assert (c.lookup_namespace_uri (null) == "http://www.gnome.org/GXml";);
                                assert (c.lookup_namespace_uri ("gxml2") == "http://www.gnome.org/GXml2";);
                                assert (c.lookup_prefix ("http://www.gnome.org/GXml3";) == null);
@@ -357,18 +357,21 @@ class GomDocumentTest : GXmlTest {
                        c.set_attribute_ns ("http://www.w3.org/2000/xmlns/","xmlns:gxml2";,
                                                                                                         
"http://www.gnome.org/GXml2";);
                        assert (c.attributes.size == 1);
-                       assert (c.prefix == "gxml2");
-                       assert (c.namespace_uri == "http://www.gnome.org/GXml2";);
-                       c.set_attribute_ns ("http://www.w3.org/2000/xmlns/","xmlns:gxml2";,
+                       assert (c.prefix == null);
+                       assert (c.namespace_uri == null);
+                       try { c.set_attribute_ns ("http://www.w3.org/2000/xmlns/","xmlns:gxml2";,
                                                                                                        
"http://www.gnome.org/GXml3";);
+                       } catch {}
                        assert (c.attributes.size == 1);
-                       assert (c.prefix == "gxml2");
-                       //assert (c.namespace_uri == "http://www.gnome.org/GXml3";);
+                       assert (c.prefix == null);
+                       assert (c.namespace_uri == null);
                        try {
                                c.set_attribute_ns ("http://www.gnome.org/GXml2","gxml3:prop","val";);
                                assert_not_reached ();
                        } catch {}
+                       try {
                                c.set_attribute_ns ("http://www.gnome.org/GXml3","gxml2:prop","val";);
+                       } catch {}
                                var p = (c as DomElement).get_attribute_ns ("http://www.gnome.org/GXml4";, 
"prop");
                                assert (p == null);
                });


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]