From c494cb344d093779015400a7ff4b07d77f7d79e2 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 18 Sep 2015 15:33:19 -0700 Subject: [PATCH] Enable `TagHelper`s with `[RestrictChildren]` to log errors for no tag name tags when targeted by catch all. #534 --- .../TagHelpers/TagHelperParseTreeRewriter.cs | 10 ++- .../TagHelperParseTreeRewriterTest.cs | 80 +++++++++++++++++++ 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperParseTreeRewriter.cs b/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperParseTreeRewriter.cs index d4962dd9e3..4874a084c5 100644 --- a/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperParseTreeRewriter.cs +++ b/src/Microsoft.AspNet.Razor/Parser/TagHelpers/TagHelperParseTreeRewriter.cs @@ -325,7 +325,7 @@ namespace Microsoft.AspNet.Razor.Parser.TagHelpers.Internal private void ValidateParentTagHelperAllowsTagHelper(string tagName, Block tagBlock, ErrorSink errorSink) { - var currentlyAllowedChildren = _currentTagHelperTracker?.AllowedChildren; + var currentlyAllowedChildren = _currentTagHelperTracker?.PrefixedAllowedChildren; if (currentlyAllowedChildren != null && !currentlyAllowedChildren.Contains(tagName, StringComparer.OrdinalIgnoreCase)) @@ -583,9 +583,11 @@ namespace Microsoft.AspNet.Razor.Parser.TagHelpers.Internal var tagHelperPrefix = Builder.Descriptors.First().Prefix; AllowedChildren = Builder.Descriptors + .Where(descriptor => descriptor.AllowedChildren != null) .SelectMany(descriptor => descriptor.AllowedChildren) - .Distinct(StringComparer.OrdinalIgnoreCase) - .Select(allowedChild => tagHelperPrefix + allowedChild); + .Distinct(StringComparer.OrdinalIgnoreCase); + + PrefixedAllowedChildren = AllowedChildren.Select(allowedChild => tagHelperPrefix + allowedChild); } } @@ -594,6 +596,8 @@ namespace Microsoft.AspNet.Razor.Parser.TagHelpers.Internal public uint OpenMatchingTags { get; set; } public IEnumerable AllowedChildren { get; } + + public IEnumerable PrefixedAllowedChildren { get; } } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperParseTreeRewriterTest.cs b/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperParseTreeRewriterTest.cs index 59757d9bf7..37d61f6c49 100644 --- a/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperParseTreeRewriterTest.cs +++ b/test/Microsoft.AspNet.Razor.Test/TagHelpers/TagHelperParseTreeRewriterTest.cs @@ -747,6 +747,86 @@ namespace Microsoft.AspNet.Razor.Test.TagHelpers EvaluateData(descriptorProvider, documentContent, expectedOutput, expectedErrors); } + [Fact] + public void Rewrite_UnderstandsNullTagNameWithAllowedChildrenForCatchAll() + { + // Arrange + var documentContent = "

"; + var descriptors = new TagHelperDescriptor[] + { + new TagHelperDescriptor + { + TagName = "p", + TypeName = "PTagHelper", + AssemblyName = "SomeAssembly", + AllowedChildren = new[] { "custom" }, + }, + new TagHelperDescriptor + { + TagName = "*", + TypeName = "CatchAllTagHelper", + AssemblyName = "SomeAssembly", + } + }; + var expectedOutput = new MarkupBlock( + new MarkupTagHelperBlock("p", + BlockFactory.MarkupTagBlock(""; + var descriptors = new TagHelperDescriptor[] + { + new TagHelperDescriptor + { + TagName = "p", + TypeName = "PTagHelper", + AssemblyName = "SomeAssembly", + AllowedChildren = new[] { "custom" }, + Prefix = "th:", + }, + new TagHelperDescriptor + { + TagName = "*", + TypeName = "CatchAllTagHelper", + AssemblyName = "SomeAssembly", + Prefix = "th:", + } + }; + var expectedOutput = new MarkupBlock( + new MarkupTagHelperBlock("th:p", + BlockFactory.MarkupTagBlock("