Skip to content
This repository has been archived by the owner on Nov 25, 2019. It is now read-only.

Commit

Permalink
389622 - Escaping special characters in sections is not working
Browse files Browse the repository at this point in the history
  • Loading branch information
analogrelay committed Apr 5, 2012
1 parent 48e98c5 commit 88372a0
Show file tree
Hide file tree
Showing 5 changed files with 191 additions and 46 deletions.
35 changes: 13 additions & 22 deletions src/System.Web.Razor/Parser/HtmlMarkupParser.Section.cs
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -62,33 +62,24 @@ private void NestingSection(Tuple<string, string> nestingSequences)
int nesting = 1; int nesting = 1;
while (nesting > 0 && !EndOfFile) while (nesting > 0 && !EndOfFile)
{ {
SkipToAndParseCode(sym =>
sym.Type == HtmlSymbolType.Text ||
sym.Type == HtmlSymbolType.OpenAngle);
if (At(HtmlSymbolType.Text)) if (At(HtmlSymbolType.Text))
{ {
nesting += ProcessTextToken(nestingSequences, nesting); nesting += ProcessTextToken(nestingSequences, nesting);
if (CurrentSymbol != null)
{
AcceptAndMoveNext();
}
else if (nesting > 0)
{
NextToken();
}
} }
else if (At(HtmlSymbolType.Transition)) else
{
PutCurrentBack();
Output(SpanKind.Markup);
OtherParserBlock();
continue;
}
else if (At(HtmlSymbolType.RazorCommentTransition))
{
RazorComment();
}
else if (ScanTagInDocumentContext())
{
continue;
}

if (CurrentSymbol != null)
{
AcceptAndMoveNext();
}
else if (nesting > 0)
{ {
NextToken(); ScanTagInDocumentContext();
} }
} }
} }
Expand Down
12 changes: 0 additions & 12 deletions test/System.Web.Razor.Test/Parser/Html/HtmlBlockTest.cs
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -112,18 +112,6 @@ public void ParseBlockStopsParsingSingleLineBlockAtEOFIfNoEOLReached()
)); ));
} }


[Fact]
public void ParseBlockTreatsTwoAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunSingleAtEscapeTest(ParseBlockTest);
}

[Fact]
public void ParseBlockTreatsPairsOfAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunMultiAtEscapeTest(ParseBlockTest);
}

[Fact] [Fact]
public void ParseBlockStopsAtMatchingCloseTagToStartTag() public void ParseBlockStopsAtMatchingCloseTagToStartTag()
{ {
Expand Down
12 changes: 0 additions & 12 deletions test/System.Web.Razor.Test/Parser/Html/HtmlDocumentTest.cs
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -192,18 +192,6 @@ public void ParseDocumentNoLongerSupportsDollarOpenBraceCombination()
Factory.Markup("<foo>${bar}</foo>"))); Factory.Markup("<foo>${bar}</foo>")));
} }


[Fact]
public void ParseDocumentTreatsTwoAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunSingleAtEscapeTest(ParseDocumentTest, lastSpanAcceptedCharacters: AcceptedCharacters.Any);
}

[Fact]
public void ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunMultiAtEscapeTest(ParseDocumentTest, lastSpanAcceptedCharacters: AcceptedCharacters.Any);
}

[Fact] [Fact]
public void ParseDocumentIgnoresTagsInContentsOfScriptTag() public void ParseDocumentIgnoresTagsInContentsOfScriptTag()
{ {
Expand Down
128 changes: 128 additions & 0 deletions test/System.Web.Razor.Test/Parser/Html/HtmlToCodeSwitchTest.cs
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -195,6 +195,67 @@ public void ParseBlockGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLi
Factory.Markup(" </ul>").Accepts(AcceptedCharacters.None))); Factory.Markup(" </ul>").Accepts(AcceptedCharacters.None)));
} }


[Fact]
public void ParseDocumentGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine()
{
ParseDocumentTest(@" <ul>
@foreach(var p in Products) {
<li>Product: @p.Name</li>
}
</ul>",
new MarkupBlock(
Factory.Markup(" <ul>\r\n"),
new StatementBlock(
Factory.Code(" ").AsStatement(),
Factory.CodeTransition(),
Factory.Code("foreach(var p in Products) {\r\n").AsStatement(),
new MarkupBlock(
Factory.Markup(" <li>Product: "),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("p.Name")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</li>\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)),
Factory.Markup(" </ul>")));
}

[Fact]
public void SectionContextGivesWhitespacePreceedingAtToCodeIfThereIsNoMarkupOnThatLine()
{
ParseDocumentTest(@"@section foo {
<ul>
@foreach(var p in Products) {
<li>Product: @p.Name</li>
}
</ul>
}",
new MarkupBlock(
Factory.EmptyHtml(),
new SectionBlock(new SectionCodeGenerator("foo"),
Factory.CodeTransition(),
Factory.MetaCode("section foo {").AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock(
Factory.Markup("\r\n <ul>\r\n"),
new StatementBlock(
Factory.Code(" ").AsStatement(),
Factory.CodeTransition(),
Factory.Code("foreach(var p in Products) {\r\n").AsStatement(),
new MarkupBlock(
Factory.Markup(" <li>Product: "),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("p.Name")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</li>\r\n").Accepts(AcceptedCharacters.None)),
Factory.Code(" }\r\n").AsStatement().Accepts(AcceptedCharacters.None)),
Factory.Markup(" </ul>\r\n")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml()));
}

[Fact] [Fact]
public void CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode() public void CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode()
{ {
Expand All @@ -218,5 +279,72 @@ public void CSharpCodeParserDoesNotAcceptLeadingOrTrailingWhitespaceInDesignMode
Factory.Markup("\r\n </ul>").Accepts(AcceptedCharacters.None)), Factory.Markup("\r\n </ul>").Accepts(AcceptedCharacters.None)),
designTimeParser: true); designTimeParser: true);
} }

// Tests for "@@" escape sequence:
[Fact]
public void ParseBlockTreatsTwoAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunSingleAtEscapeTest(ParseBlockTest);
}

[Fact]
public void ParseBlockTreatsPairsOfAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunMultiAtEscapeTest(ParseBlockTest);
}

[Fact]
public void ParseDocumentTreatsTwoAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunSingleAtEscapeTest(ParseDocumentTest, lastSpanAcceptedCharacters: AcceptedCharacters.Any);
}

[Fact]
public void ParseDocumentTreatsPairsOfAtSignsAsEscapeSequence()
{
HtmlParserTestUtils.RunMultiAtEscapeTest(ParseDocumentTest, lastSpanAcceptedCharacters: AcceptedCharacters.Any);
}

[Fact]
public void SectionBodyTreatsTwoAtSignsAsEscapeSequence()
{
ParseDocumentTest("@section Foo { <foo>@@bar</foo> }",
new MarkupBlock(
Factory.EmptyHtml(),
new SectionBlock(new SectionCodeGenerator("Foo"),
Factory.CodeTransition(),
Factory.MetaCode("section Foo {").AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock(
Factory.Markup(" <foo>"),
Factory.Markup("@").Hidden(),
Factory.Markup("@bar</foo> ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml()));
}

[Fact]
public void SectionBodyTreatsPairsOfAtSignsAsEscapeSequence()
{
ParseDocumentTest("@section Foo { <foo>@@@@@bar</foo> }",
new MarkupBlock(
Factory.EmptyHtml(),
new SectionBlock(new SectionCodeGenerator("Foo"),
Factory.CodeTransition(),
Factory.MetaCode("section Foo {").AutoCompleteWith(null, atEndOfSpan: true),
new MarkupBlock(
Factory.Markup(" <foo>"),
Factory.Markup("@").Hidden(),
Factory.Markup("@"),
Factory.Markup("@").Hidden(),
Factory.Markup("@"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("bar")
.AsImplicitExpression(CSharpCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</foo> ")),
Factory.MetaCode("}").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml()));
}
} }
} }
50 changes: 50 additions & 0 deletions test/System.Web.Razor.Test/Parser/VB/VBSectionTest.cs
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -221,5 +221,55 @@ public void ParseSectionAllowsEndSectionInVBExpression()
Factory.MetaCode("End Section").Accepts(AcceptedCharacters.None)), Factory.MetaCode("End Section").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml())); Factory.EmptyHtml()));
} }

// These are tests that are normally in HtmlToCodeSwitchTest, but we want to verify them for VB
// since VB has slightly different section terminating behavior which follow slightly different
// code paths

[Fact]
public void SectionBodyTreatsTwoAtSignsAsEscapeSequence()
{
ParseDocumentTest(@"@Section Foo
<foo>@@bar</foo>
End Section",
new MarkupBlock(
Factory.EmptyHtml(),
new SectionBlock(new SectionCodeGenerator("Foo"),
Factory.CodeTransition(),
Factory.MetaCode("Section Foo").AutoCompleteWith(null),
new MarkupBlock(
Factory.Markup("\r\n <foo>"),
Factory.Markup("@").Hidden(),
Factory.Markup("@bar</foo>\r\n")),
Factory.MetaCode("End Section").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml()));
}

[Fact]
public void SectionBodyTreatsPairsOfAtSignsAsEscapeSequence()
{
ParseDocumentTest(@"@Section Foo
<foo>@@@@@bar</foo>
End Section",
new MarkupBlock(
Factory.EmptyHtml(),
new SectionBlock(new SectionCodeGenerator("Foo"),
Factory.CodeTransition(),
Factory.MetaCode("Section Foo").AutoCompleteWith(null),
new MarkupBlock(
Factory.Markup("\r\n <foo>"),
Factory.Markup("@").Hidden(),
Factory.Markup("@"),
Factory.Markup("@").Hidden(),
Factory.Markup("@"),
new ExpressionBlock(
Factory.CodeTransition(),
Factory.Code("bar")
.AsImplicitExpression(VBCodeParser.DefaultKeywords)
.Accepts(AcceptedCharacters.NonWhiteSpace)),
Factory.Markup("</foo>\r\n")),
Factory.MetaCode("End Section").Accepts(AcceptedCharacters.None)),
Factory.EmptyHtml()));
}
} }
} }

0 comments on commit 88372a0

Please sign in to comment.