[gxml] GomElement: Improved namespace conflic detection
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] GomElement: Improved namespace conflic detection
- Date: Thu, 3 Nov 2016 19:32:19 +0000 (UTC)
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]