Enable TagHelper directives to handle malformed text.
- Prior to this change we'd try to substring a TagHelper directive with length 1 but our substring call would be for -1 (explosions). - Added tests to validate that `@tagHelperPrefix`, `@removeTagHelper` and `@addTagHelper` all behave properly when they have malformed quotes. #1242
This commit is contained in:
parent
e856224682
commit
f31b45d84a
|
|
@ -345,7 +345,8 @@ namespace Microsoft.AspNetCore.Razor.Language
|
||||||
TagHelperDirectiveType directiveType)
|
TagHelperDirectiveType directiveType)
|
||||||
{
|
{
|
||||||
directiveText = directiveText.Trim();
|
directiveText = directiveText.Trim();
|
||||||
if (directiveText.StartsWith("\"", StringComparison.Ordinal) &&
|
if (directiveText.Length >= 2 &&
|
||||||
|
directiveText.StartsWith("\"", StringComparison.Ordinal) &&
|
||||||
directiveText.EndsWith("\"", StringComparison.Ordinal))
|
directiveText.EndsWith("\"", StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
directiveText = directiveText.Substring(1, directiveText.Length - 2);
|
directiveText = directiveText.Substring(1, directiveText.Length - 2);
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,132 @@ namespace Microsoft.AspNetCore.Razor.Language
|
||||||
{
|
{
|
||||||
public class TagHelperBinderSyntaxTreePassTest
|
public class TagHelperBinderSyntaxTreePassTest
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public void Execute_CanHandleSingleLengthAddTagHelperDirective()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var engine = RazorEngine.Create(builder =>
|
||||||
|
{
|
||||||
|
builder.AddTagHelpers(new TagHelperDescriptor[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
var pass = new TagHelperBinderSyntaxTreePass()
|
||||||
|
{
|
||||||
|
Engine = engine,
|
||||||
|
};
|
||||||
|
var expectedDiagnostics = new[]
|
||||||
|
{
|
||||||
|
RazorDiagnostic.Create(
|
||||||
|
new RazorError(
|
||||||
|
LegacyResources.ParseError_Unterminated_String_Literal,
|
||||||
|
new SourceLocation(16, 1, 14),
|
||||||
|
length: 1)),
|
||||||
|
RazorDiagnostic.Create(
|
||||||
|
new RazorError(
|
||||||
|
Resources.FormatInvalidTagHelperLookupText("\""),
|
||||||
|
new SourceLocation(16, 1, 14),
|
||||||
|
length: 1))
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var content =
|
||||||
|
@"
|
||||||
|
@addTagHelper """;
|
||||||
|
var sourceDocument = TestRazorSourceDocument.Create(content, fileName: null);
|
||||||
|
var codeDocument = RazorCodeDocument.Create(sourceDocument);
|
||||||
|
var originalTree = RazorSyntaxTree.Parse(sourceDocument);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var rewrittenTree = pass.Execute(codeDocument, originalTree);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expectedDiagnostics, rewrittenTree.Diagnostics);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Execute_CanHandleSingleLengthRemoveTagHelperDirective()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var engine = RazorEngine.Create(builder =>
|
||||||
|
{
|
||||||
|
builder.AddTagHelpers(new TagHelperDescriptor[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
var pass = new TagHelperBinderSyntaxTreePass()
|
||||||
|
{
|
||||||
|
Engine = engine,
|
||||||
|
};
|
||||||
|
var expectedDiagnostics = new[]
|
||||||
|
{
|
||||||
|
RazorDiagnostic.Create(
|
||||||
|
new RazorError(
|
||||||
|
LegacyResources.ParseError_Unterminated_String_Literal,
|
||||||
|
new SourceLocation(19, 1, 17),
|
||||||
|
length: 1)),
|
||||||
|
RazorDiagnostic.Create(
|
||||||
|
new RazorError(
|
||||||
|
Resources.FormatInvalidTagHelperLookupText("\""),
|
||||||
|
new SourceLocation(19, 1, 17),
|
||||||
|
length: 1))
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var content =
|
||||||
|
@"
|
||||||
|
@removeTagHelper """;
|
||||||
|
var sourceDocument = TestRazorSourceDocument.Create(content, fileName: null);
|
||||||
|
var codeDocument = RazorCodeDocument.Create(sourceDocument);
|
||||||
|
var originalTree = RazorSyntaxTree.Parse(sourceDocument);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var rewrittenTree = pass.Execute(codeDocument, originalTree);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expectedDiagnostics, rewrittenTree.Diagnostics);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Execute_CanHandleSingleLengthTagHelperPrefix()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var engine = RazorEngine.Create(builder =>
|
||||||
|
{
|
||||||
|
builder.AddTagHelpers(new TagHelperDescriptor[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
var pass = new TagHelperBinderSyntaxTreePass()
|
||||||
|
{
|
||||||
|
Engine = engine,
|
||||||
|
};
|
||||||
|
var expectedDiagnostics = new[]
|
||||||
|
{
|
||||||
|
RazorDiagnostic.Create(
|
||||||
|
new RazorError(
|
||||||
|
LegacyResources.ParseError_Unterminated_String_Literal,
|
||||||
|
new SourceLocation(19, 1, 17),
|
||||||
|
length: 1)),
|
||||||
|
RazorDiagnostic.Create(
|
||||||
|
new RazorError(
|
||||||
|
Resources.FormatInvalidTagHelperPrefixValue("tagHelperPrefix", "\"", "\""),
|
||||||
|
new SourceLocation(19, 1, 17),
|
||||||
|
length: 1))
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var content =
|
||||||
|
@"
|
||||||
|
@tagHelperPrefix """;
|
||||||
|
var sourceDocument = TestRazorSourceDocument.Create(content, fileName: null);
|
||||||
|
var codeDocument = RazorCodeDocument.Create(sourceDocument);
|
||||||
|
var originalTree = RazorSyntaxTree.Parse(sourceDocument);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var rewrittenTree = pass.Execute(codeDocument, originalTree);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expectedDiagnostics, rewrittenTree.Diagnostics);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Execute_RewritesTagHelpers()
|
public void Execute_RewritesTagHelpers()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue