Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLarry O'Brien <lobrien@knowing.net>2014-06-13 03:25:44 +0400
committerLarry O'Brien <lobrien@knowing.net>2014-06-14 01:13:24 +0400
commitd8d1b0be6baf6f8881871592b040d85be790926c (patch)
treefbc7ed3b2404c782636b136adcd8198e717186fb /mcs/class/monodoc
parent66aaa61cb7a33ffd84458e207ba780a3716a5023 (diff)
Monodoc: Fix for CDATA bug (https://bugzilla.xamarin.com/show_bug.cgi?id=17850). Reverts 3f361e1a263fc23680beab62eadde0cd3e4ac64d
Removed code that stripped CDATA statements (but not blocks) from input when showing a namespace page: The function Ecma2Html.WrapStream(TextReader,Dictionary<String,String>) very explicitly returns a new `AvoidCDataTextReader` when the system is showing a namespace. The `AvoidCDataTextReader` strips the CDATA statement, but not it's internal contents. The intent, according to AvoidCDataTextReaderTests, is to allow class summaries of this form: "<elements><summary>Addressbook APIs.</summary><remarks /><class name=""ABAddressBook"" fullname=""MonoTouch.AddressBook.ABAddressBook"" assembly=""monotouch""><summary><![CDATA[ Provides access to the system Address Book.]]> </summary></class></elements>" But that form is not desired. The bug arose because the input to `WrapStream` is very large (it actually includes the entire *description* for each class and member in the namespace!). If any CDATA-block contained entities such as, e.g., < or >, the resulting XML would (obviously) be ill-formed: "<xml>This should be valid <![CDATA[<T>]]> </xml>" would throw because the <T> would be attempted to be parsed as XML. Obviously, samples that contain generics or lambda or XAML would cause this problem. Although an XMLException was thrown, Macdoc swallows the exception in DocTools.GetHTML(). That is why this caused a silent failure on macdoc and was visible on Webdoc.
Diffstat (limited to 'mcs/class/monodoc')
-rw-r--r--mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs112
-rw-r--r--mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs86
2 files changed, 18 insertions, 180 deletions
diff --git a/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs b/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs
index c15c6137786..04353c45469 100644
--- a/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs
+++ b/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs
@@ -63,14 +63,21 @@ namespace Monodoc.Generators.Html
public string Htmlize (XmlReader ecma_xml, XsltArgumentList args)
{
- EnsureTransform ();
-
- var output = new StringBuilder ();
- ecma_transform.Transform (ecma_xml,
- args,
- XmlWriter.Create (output, ecma_transform.OutputSettings),
- CreateDocumentResolver ());
- return output.ToString ();
+ try{
+ EnsureTransform ();
+
+ var output = new StringBuilder ();
+ ecma_transform.Transform (ecma_xml,
+ args,
+ XmlWriter.Create (output, ecma_transform.OutputSettings),
+ CreateDocumentResolver ());
+ return output.ToString ();
+ }
+ catch(Exception x)
+ {
+ var msg = x.ToString ();
+ return msg;
+ }
}
protected virtual XmlResolver CreateDocumentResolver ()
@@ -81,21 +88,14 @@ namespace Monodoc.Generators.Html
public string Export (Stream stream, Dictionary<string, string> extraArgs)
{
- return Htmlize (XmlReader.Create (WrapStream (new StreamReader (stream), extraArgs)), extraArgs);
+ return Htmlize (XmlReader.Create (new StreamReader(stream)), extraArgs);
}
public string Export (string input, Dictionary<string, string> extraArgs)
{
- return Htmlize (XmlReader.Create (WrapStream (new StringReader (input), extraArgs)), extraArgs);
+ return Htmlize (XmlReader.Create (new StringReader(input)), extraArgs);
}
- TextReader WrapStream (TextReader initialReader, Dictionary<string, string> renderArgs)
- {
- string show;
- if (renderArgs.TryGetValue ("show", out show) && show == "namespace")
- return new AvoidCDataTextReader (initialReader);
- return initialReader;
- }
static void EnsureTransform ()
{
@@ -329,81 +329,5 @@ namespace Monodoc.Generators.Html
}
}
}
-
- public class AvoidCDataTextReader : TextReader
- {
- static readonly char[] CDataPattern = new[] {
- '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '['
- };
- static readonly char[] CDataClosingPattern = new[] {
- ']', ']', '>'
- };
- TextReader wrappedReader;
- char[] backingArray = new char[9]; // "<![CDATA[".Length
- int currentIndex = -1;
- int eofIndex = -1;
- bool inCData;
-
- public AvoidCDataTextReader (TextReader wrappedReader)
- {
- this.wrappedReader = wrappedReader;
- }
-
- public override int Peek ()
- {
- if (!EnsureBuffer ())
- return -1;
- return (int)backingArray[currentIndex];
- }
-
- public override int Read ()
- {
- if (!EnsureBuffer ())
- return -1;
- var result = (int)backingArray[currentIndex];
- var next = wrappedReader.Read ();
- if (next == -1 && eofIndex == -1)
- eofIndex = currentIndex;
- else
- backingArray[currentIndex] = (char)next;
- currentIndex = (currentIndex + 1) % backingArray.Length;
- return result;
- }
-
- void ReadLength (int length)
- {
- for (int i = 0; i < length; i++)
- Read ();
- }
-
- bool EnsureBuffer ()
- {
- if (currentIndex == -1) {
- currentIndex = 0;
- var read = wrappedReader.ReadBlock (backingArray, 0, backingArray.Length);
- if (read < backingArray.Length)
- eofIndex = read;
- return read > 0;
- } else if (currentIndex == eofIndex) {
- return false;
- }
- if (!inCData && PatternDetect (CDataPattern)) {
- inCData = true;
- ReadLength (CDataPattern.Length);
- return EnsureBuffer ();
- }
- if (inCData && PatternDetect (CDataClosingPattern)) {
- inCData = false;
- ReadLength (CDataClosingPattern.Length);
- return EnsureBuffer ();
- }
-
- return true;
- }
-
- bool PatternDetect (char[] pattern)
- {
- return backingArray[currentIndex] == pattern[0] && Enumerable.Range (1, pattern.Length - 1).All (i => backingArray[(currentIndex + i) % backingArray.Length] == pattern[i]);
- }
- }
+
}
diff --git a/mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs b/mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs
deleted file mode 100644
index 5ab8e84b809..00000000000
--- a/mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-using System;
-using System.IO;
-using System.Linq;
-using System.Xml;
-using System.Collections.Generic;
-
-using NUnit.Framework;
-
-using Monodoc;
-using Monodoc.Generators;
-using Monodoc.Generators.Html;
-
-namespace MonoTests.Monodoc.Generators
-{
- [TestFixture]
- public class AvoidCDataTextReaderTest
- {
- void AssertSameInputOutput (string expected, string input)
- {
- var processed = new AvoidCDataTextReader (new StringReader (input)).ReadToEnd ();
- Assert.AreEqual (expected, processed);
- }
-
- [Test]
- public void NoCDataXmlTest ()
- {
- var input = @"<elements><summary>Addressbook APIs.</summary><remarks /><class name=""ABAddressBook"" fullname=""MonoTouch.AddressBook.ABAddressBook"" assembly=""monotouch""><summary>
- Provides access to the system Address Book.
- </summary></class></elements>";
-
- AssertSameInputOutput (input, input);
- }
-
- [Test]
- public void WithCDataXmlTest ()
- {
- var input = @"<elements><summary>Addressbook APIs.</summary><remarks /><class name=""ABAddressBook"" fullname=""MonoTouch.AddressBook.ABAddressBook"" assembly=""monotouch""><summary><![CDATA[
- Provides access to the system Address Book.]]>
- </summary></class></elements>";
-
- AssertSameInputOutput (input.Replace ("<![CDATA[", string.Empty).Replace ("]]>", string.Empty), input);
- }
-
- [Test]
- public void PartialCDataXmlTest ()
- {
- var input = @"<elements><summary>Addressbook APIs.</summary><remarks /><class name=""ABAddressBook"" fullname=""MonoTouch.AddressBook.ABAddressBook"" assembly=""monotouch""><summary><![CDA[
- Provides access to the system Address Book.]]>
- </summary></class></elements>";
-
- AssertSameInputOutput (input, input);
- }
-
- [Test]
- public void FinishWithPartialCDataXmlTest ()
- {
- var input = @"<elements><summary>Addressbook APIs.</summary><remarks /><class name=""ABAddressBook"" fullname=""MonoTouch.AddressBook.ABAddressBook"" assembly=""monotouch""><summary>
- Provides access to the system Address Book.
- </summary></class></elements><![CDA[";
-
- AssertSameInputOutput (input, input);
- }
-
- [Test]
- public void FinishWithCDataXmlTest ()
- {
- var input = @"<elements><summary>Addressbook APIs.</summary><remarks /><class name=""ABAddressBook"" fullname=""MonoTouch.AddressBook.ABAddressBook"" assembly=""monotouch""><summary>
- Provides access to the system Address Book.
- </summary></class></elements><![CDATA[";
-
- AssertSameInputOutput (input.Replace ("<![CDATA[", string.Empty), input);
- }
-
- [Test]
- public void EmptyInputTest ()
- {
- AssertSameInputOutput (string.Empty, string.Empty);
- }
-
- [Test]
- public void LimitedInputTest ()
- {
- AssertSameInputOutput ("foo", "foo");
- }
- }
-}