diff --git a/src/Microsoft.AspNetCore.Razor/Parser/HtmlMarkupParser.Block.cs b/src/Microsoft.AspNetCore.Razor/Parser/HtmlMarkupParser.Block.cs index 356ccb858b..ee0de4eba8 100644 --- a/src/Microsoft.AspNetCore.Razor/Parser/HtmlMarkupParser.Block.cs +++ b/src/Microsoft.AspNetCore.Razor/Parser/HtmlMarkupParser.Block.cs @@ -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) { diff --git a/test/Microsoft.AspNetCore.Razor.Test/Parser/Html/HtmlBlockTest.cs b/test/Microsoft.AspNetCore.Razor.Test/Parser/Html/HtmlBlockTest.cs index 72954b5446..d10c3fc453 100644 --- a/test/Microsoft.AspNetCore.Razor.Test/Parser/Html/HtmlBlockTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Test/Parser/Html/HtmlBlockTest.cs @@ -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("").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 + { + { + "
", + new MarkupBlock( + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None)), + factory.Markup("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None))) + }, + { + "
", + new MarkupBlock( + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None)), + factory.Markup("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None))) + }, + { + "
", + new MarkupBlock( + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None)), + factory.Markup("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None))) + }, + { + "
", + new MarkupBlock( + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None)), + factory.Markup("").Accepts(AcceptedCharacters.None), + new MarkupTagBlock( + factory.Markup("
").Accepts(AcceptedCharacters.None))) + }, + }; + } + } + + [Theory] + [MemberData(nameof(HtmlCommentSupportsMultipleDashesData))] + public void HtmlCommentSupportsMultipleDashes(string documentContent, MarkupBlock expectedOutput) + { + ParseBlockTest(documentContent, expectedOutput); + } + + [Fact] public void ParseBlockProperlyBalancesCommentStartAndEndTags() {