Make HTML comments more resilient to extra end dashes.

aspnet/Mvc#4465
This commit is contained in:
N. Taylor Mullen 2016-05-23 12:29:55 -07:00
parent 80ebb4a068
commit d0bf6bf841
2 changed files with 85 additions and 1 deletions

View File

@ -252,7 +252,30 @@ namespace Microsoft.AspNetCore.Razor.Parser
if (CurrentSymbol.Type == HtmlSymbolType.DoubleHyphen)
{
AcceptAndMoveNext();
return AcceptUntilAll(HtmlSymbolType.DoubleHyphen, HtmlSymbolType.CloseAngle);
Span.EditHandler.AcceptedCharacters = AcceptedCharacters.Any;
while (!EndOfFile)
{
SkipToAndParseCode(HtmlSymbolType.DoubleHyphen);
if (At(HtmlSymbolType.DoubleHyphen))
{
AcceptWhile(HtmlSymbolType.DoubleHyphen);
if (At(HtmlSymbolType.Text) &&
string.Equals(CurrentSymbol.Content, "-", StringComparison.Ordinal))
{
AcceptAndMoveNext();
}
if (At(HtmlSymbolType.CloseAngle))
{
AcceptAndMoveNext();
return true;
}
}
}
return false;
}
else if (CurrentSymbol.Type == HtmlSymbolType.LeftBracket)
{

View File

@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Razor.Parser;
using Microsoft.AspNetCore.Razor.Parser.SyntaxTree;
using Microsoft.AspNetCore.Razor.Test.Framework;
using Microsoft.AspNetCore.Razor.Text;
using Microsoft.AspNetCore.Razor.Tokenizer;
using Microsoft.AspNetCore.Razor.Tokenizer.Symbols;
using Xunit;
@ -356,6 +357,66 @@ namespace Microsoft.AspNetCore.Razor.Test.Parser.Html
Factory.Markup("</foo>").Accepts(AcceptedCharacters.None))));
}
public static TheoryData HtmlCommentSupportsMultipleDashesData
{
get
{
var factory = new SpanFactory
{
MarkupTokenizerFactory = doc => new HtmlTokenizer(doc),
CodeTokenizerFactory = doc => new CSharpTokenizer(doc)
};
return new TheoryData<string, MarkupBlock>
{
{
"<div><!--- Hello World ---></div>",
new MarkupBlock(
new MarkupTagBlock(
factory.Markup("<div>").Accepts(AcceptedCharacters.None)),
factory.Markup("<!--- Hello World --->").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
factory.Markup("</div>").Accepts(AcceptedCharacters.None)))
},
{
"<div><!---- Hello World ----></div>",
new MarkupBlock(
new MarkupTagBlock(
factory.Markup("<div>").Accepts(AcceptedCharacters.None)),
factory.Markup("<!---- Hello World ---->").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
factory.Markup("</div>").Accepts(AcceptedCharacters.None)))
},
{
"<div><!----- Hello World -----></div>",
new MarkupBlock(
new MarkupTagBlock(
factory.Markup("<div>").Accepts(AcceptedCharacters.None)),
factory.Markup("<!----- Hello World ----->").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
factory.Markup("</div>").Accepts(AcceptedCharacters.None)))
},
{
"<div><!----- Hello < --- > World </div> -----></div>",
new MarkupBlock(
new MarkupTagBlock(
factory.Markup("<div>").Accepts(AcceptedCharacters.None)),
factory.Markup("<!----- Hello < --- > World </div> ----->").Accepts(AcceptedCharacters.None),
new MarkupTagBlock(
factory.Markup("</div>").Accepts(AcceptedCharacters.None)))
},
};
}
}
[Theory]
[MemberData(nameof(HtmlCommentSupportsMultipleDashesData))]
public void HtmlCommentSupportsMultipleDashes(string documentContent, MarkupBlock expectedOutput)
{
ParseBlockTest(documentContent, expectedOutput);
}
[Fact]
public void ParseBlockProperlyBalancesCommentStartAndEndTags()
{