public override XmlNodeOrder ComparePosition(XPathNavigator other) {
DocumentXPathNavigator that = other as DocumentXPathNavigator;
if (that == null) {
return XmlNodeOrder.Unknown;
}
this.CalibrateText();
that.CalibrateText();
if (this.source == that.source
&& this.namespaceParent == that.namespaceParent) {
return XmlNodeOrder.Same;
}
if (this.namespaceParent != null
|| that.namespaceParent != null) {
return base.ComparePosition(other);
}
XmlNode node1 = this.source;
XmlNode node2 = that.source;
XmlNode parent1 = OwnerNode(node1);
XmlNode parent2 = OwnerNode(node2);
if (parent1 == parent2) {
if (parent1 == null) {
return XmlNodeOrder.Unknown;
}
else {
Debug.Assert(node1 != node2);
return Compare(node1, node2);
}
}
int depth1 = GetDepth(node1);
int depth2 = GetDepth(node2);
if (depth2 > depth1) {
while (node2 != null
&& depth2 > depth1) {
node2 = OwnerNode(node2);
depth2--;
}
if (node1 == node2) {
return XmlNodeOrder.Before;
}
parent2 = OwnerNode(node2);
}
else if (depth1 > depth2) {
while (node1 != null
&& depth1 > depth2) {
node1 = OwnerNode(node1);
depth1--;
}
if (node1 == node2) {
return XmlNodeOrder.After;
}
parent1 = OwnerNode(node1);
}
while (parent1 != null
&& parent2 != null) {
if (parent1 == parent2) {
Debug.Assert(node1 != node2);
return Compare(node1, node2);
}
node1 = parent1;
node2 = parent2;
parent1 = OwnerNode(node1);
parent2 = OwnerNode(node2);
}
return XmlNodeOrder.Unknown;
}