From f31b45d84a23f52fc564b4892327e5e3e981d66a Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 20 Apr 2017 11:09:28 -0700 Subject: [PATCH] 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 --- .../TagHelperBinderSyntaxTreePass.cs | 3 +- .../TagHelperBinderSyntaxTreePassTest.cs | 126 ++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Razor.Language/TagHelperBinderSyntaxTreePass.cs b/src/Microsoft.AspNetCore.Razor.Language/TagHelperBinderSyntaxTreePass.cs index eae5ba5868..9fc97a3df6 100644 --- a/src/Microsoft.AspNetCore.Razor.Language/TagHelperBinderSyntaxTreePass.cs +++ b/src/Microsoft.AspNetCore.Razor.Language/TagHelperBinderSyntaxTreePass.cs @@ -345,7 +345,8 @@ namespace Microsoft.AspNetCore.Razor.Language TagHelperDirectiveType directiveType) { directiveText = directiveText.Trim(); - if (directiveText.StartsWith("\"", StringComparison.Ordinal) && + if (directiveText.Length >= 2 && + directiveText.StartsWith("\"", StringComparison.Ordinal) && directiveText.EndsWith("\"", StringComparison.Ordinal)) { directiveText = directiveText.Substring(1, directiveText.Length - 2); diff --git a/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperBinderSyntaxTreePassTest.cs b/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperBinderSyntaxTreePassTest.cs index 1ce4ae11f5..82033d21ba 100644 --- a/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperBinderSyntaxTreePassTest.cs +++ b/test/Microsoft.AspNetCore.Razor.Language.Test/TagHelperBinderSyntaxTreePassTest.cs @@ -13,6 +13,132 @@ namespace Microsoft.AspNetCore.Razor.Language { 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] public void Execute_RewritesTagHelpers() {