From 5b5aa6837fd0c3d23e40c32129a6eb2cb62f0fa8 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Tue, 8 Jan 2019 09:42:01 -0800 Subject: [PATCH] Properly handle attr-value prefix in markup pass Fixes aspnet/AspNetCoredotnet/aspnetcore-tooling#6480 We were missing handling for the attribute value prefix of a markup attribute during the markup block rewrite pass. This is properly handled inside the runtime code writer so you wouldn't see this bug if the contents of the element were dynamic (and thus could not be rewritten). Most of the churn here is due to renaming classes. We generally prefer the term *markup* over *html* in code artifacts, and this was one piece of new code that refers to html. \n\nCommit migrated from https://github.com/dotnet/aspnetcore-tooling/commit/d16eafd667a04e40944158dd92d786cebadc1a2b --- ...{ComponentHtmlBlockPass.cs => ComponentMarkupBlockPass.cs} | 4 +++- .../src/RazorProjectEngine.cs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) rename src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/{ComponentHtmlBlockPass.cs => ComponentMarkupBlockPass.cs} (98%) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentHtmlBlockPass.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentMarkupBlockPass.cs similarity index 98% rename from src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentHtmlBlockPass.cs rename to src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentMarkupBlockPass.cs index 8327b33318..4d467d6203 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentHtmlBlockPass.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentMarkupBlockPass.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Razor.Language.Components // // Does not preserve insignificant details of the HTML, like tag closing style // or quote style. - internal class ComponentHtmlBlockPass : ComponentIntermediateNodePassBase, IRazorOptimizationPass + internal class ComponentMarkupBlockPass : ComponentIntermediateNodePassBase, IRazorOptimizationPass { // Runs LATE because we want to destroy structure. public override int Order => 10000; @@ -322,6 +322,8 @@ namespace Microsoft.AspNetCore.Razor.Language.Components { for (var i = 0; i < node.Children.Count; i++) { + Builder.Append(node.Prefix); + if (node.Children[i] is IntermediateToken token) { Builder.Append(token.Content); diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorProjectEngine.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorProjectEngine.cs index d29ba2e775..39afa6b0ae 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorProjectEngine.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorProjectEngine.cs @@ -231,7 +231,7 @@ namespace Microsoft.AspNetCore.Razor.Language builder.Features.Add(new ComponentTemplateDiagnosticPass()); builder.Features.Add(new ComponentGenericTypePass()); builder.Features.Add(new ComponentChildContentDiagnosticPass()); - builder.Features.Add(new ComponentHtmlBlockPass()); + builder.Features.Add(new ComponentMarkupBlockPass()); } private static void LoadExtensions(RazorProjectEngineBuilder builder, IReadOnlyList extensions)