Browse Source

bugfix #3231 - when XmlWriterSettings specifies Indent, some WriteWhitespace() is ignored.

Atsushi Eno 14 years ago
parent
commit
2927d27304

+ 6 - 3
mcs/class/System.XML/System.Xml/XmlTextWriter2.cs

@@ -226,6 +226,7 @@ namespace Mono.Xml
 		XmlNodeType node_state = XmlNodeType.None;
 		XmlNamespaceManager nsmanager;
 		int open_count;
+		bool top_level_space_ignored;
 		XmlNodeInfo [] elements = new XmlNodeInfo [10];
 		Stack new_local_namespaces = new Stack ();
 		ArrayList explicit_nsdecls = new ArrayList ();
@@ -1082,9 +1083,11 @@ namespace Mono.Xml
 			    XmlChar.IndexOfNonWhitespace (text) >= 0)
 				throw ArgumentError ("WriteWhitespace method accepts only whitespaces.");
 
+			bool pastTopLevelWSIgnored = top_level_space_ignored;
 			ShiftStateTopLevel ("Whitespace", true, false, true);
-
-			writer.Write (text);
+			if (!indent || WriteState != WriteState.Prolog || pastTopLevelWSIgnored)
+				writer.Write (text);
+			top_level_space_ignored = true;
 		}
 
 		public override void WriteCData (string text)
@@ -1330,7 +1333,7 @@ namespace Mono.Xml
 					CheckMixedContentState ();
 				break;
 			}
-
+			top_level_space_ignored = false;
 		}
 
 		void CheckMixedContentState ()

+ 19 - 0
mcs/class/System.XML/Test/System.Xml/XmlWriterSettingsTests.cs

@@ -284,6 +284,25 @@ namespace MonoTests.System.Xml
 			// no heading newline.
 			Assert.AreEqual ("<root />", sw.ToString ());
 		}
+		
+		[Test] // surprisingly niche behavior yet caused bug #3231.
+		public void IndentAndTopLevelWhitespaces ()
+		{
+			var sw = new StringWriter ();
+			var xw = XmlWriter.Create (sw, new XmlWriterSettings () { Indent = true });
+			xw.WriteProcessingInstruction ("xml", "version='1.0'");
+			xw.WriteWhitespace ("\n");
+			xw.WriteComment ("AAA");
+			xw.WriteWhitespace ("\n");
+			xw.WriteWhitespace ("\n");
+			xw.WriteStartElement ("root");
+			xw.Close ();
+			string xml = @"<?xml version='1.0'?>
+<!--AAA-->
+
+<root />";
+			Assert.AreEqual (xml, sw.ToString ().Replace ("\r\n", "\n"), "#1");
+		}
 	}
 }
 #endif