XNodeNavigator could be used for a node tree without XDocument, so make it work for...
authorAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Mon, 14 May 2012 07:31:54 +0000 (16:31 +0900)
committerAtsushi Eno <atsushieno@veritas-vos-liberabit.com>
Mon, 14 May 2012 07:31:54 +0000 (16:31 +0900)
Fixed bug #4690, patch by eb1 sil.org.

mcs/class/System.Xml.Linq/System.Xml.Linq/XNodeNavigator.cs
mcs/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeNavigatorTest.cs

index 31138a00135f8050caeaa62817476b88edff20a8..84cb492334cf8ffe9c05502aac3e32e9ebd328f2 100644 (file)
@@ -413,8 +413,12 @@ namespace System.Xml.Linq
 
                public override void MoveToRoot ()
                {
-                       node = node.Document ?? node;
                        attr = null;
+                       if (node.Document != null)
+                               node = node.Document;
+                       else
+                               while (node.Owner != null)
+                                       node = node.Owner;
                }
        }
 }
index 590b0c34821a3d41d1cf59630f079ca2d535146f..329abee447a059f4697e4e535219361665ae5e58 100644 (file)
@@ -85,5 +85,17 @@ namespace MonoTests.System.Xml.Linq
                        var element = iterator.Current;
                        Assert.AreEqual ("B", element.InnerXml);
                }
+
+               [Test]
+               public void MoveToRoot_Bug4690 ()
+               {
+                       string data = "<root><parent><child/></parent></root>";
+                       XElement doc = XElement.Parse (data);
+                       var iterator = doc.CreateNavigator ().Select ("//child");
+                       iterator.MoveNext ();
+                       var element = iterator.Current;
+                       element.MoveToRoot ();
+                       Assert.AreEqual ("root", element.Name);
+               }
        }
 }