Skip to content

Commit

Permalink
[release/8.0] [Blazor] Accept an HTML encoder instance from DI if ava…
Browse files Browse the repository at this point in the history
…ilable (#53213)

Backport of #53140 to release/8.0

/cc @javiercn

# [Blazor] Accept an HTML encoder instance from DI if available

Checks the DI container to see if an instance of HtmlEncoder or JavaScriptEncoder has been registered and uses that instance when present. Falls back to the default implementation if not present. This aligns Blazor behavior in this area with MVC.

## Description

Blazor hardcodes the HtmlEncoder used by the app to encode strings into HTML to the default implementation. The defaults work well for English but can be too agressive in encoding characters in other alphabets, like Cyrillic, Greek, etc. or special letters within some languages (German, Spanish).

This results in the text being encoded and the pages significantly increasing in size and possibly displaying incorrectly in some contexts.

Fixes #47477

## Customer Impact

Customer's can't use more leaning HtmlEncoding options like in MVC/Razor pages. This can be a migration blocker from those if the app depends on this behavior. It's also a blocker if you need this, since there isn't a workaround that can be applied.

## Regression?

- [ ] Yes
- [X] No

[If yes, specify the version the behavior has regressed from]

## Risk

- [ ] High
- [ ] Medium
- [X] Low

The fix consists on checking in DI for the instance.

## Verification

- [X] Manual (required)
- [ ] Automated

```razor
    @{
        var value = "Тест текст";
    }
    <meta name="keywords" content="@value" />
```

Before:
`<meta name="keywords" content="&#x422;&#x435;&#x441;&#x442; &#x442;&#x435;&#x43A;&#x441;&#x442;" />`

After configuring a custom encoder in DI:
```
builder.Services.AddWebEncoders(encoders =>
{
    encoders.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All);
});
```

`<meta name="keywords" content="Тест текст" />`


## Packaging changes reviewed?

- [ ] Yes
- [ ] No
- [x] N/A

----

## When servicing release/2.1

- [ ] Make necessary changes in eng/PatchConfig.props

---------

Co-authored-by: jacalvar <jacalvar@microsoft.com>
  • Loading branch information
github-actions[bot] and javiercn authored Jan 17, 2024
1 parent 4e52054 commit cde2430
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public partial class StaticHtmlRenderer
string.Empty,
typeof(FormMappingContext));

private static readonly TextEncoder _javaScriptEncoder = JavaScriptEncoder.Default;
private TextEncoder _htmlEncoder = HtmlEncoder.Default;
private readonly TextEncoder _javaScriptEncoder;
private TextEncoder _htmlEncoder;
private string? _closestSelectValueAsString;

/// <summary>
Expand Down
3 changes: 3 additions & 0 deletions src/Components/Web/src/HtmlRendering/StaticHtmlRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System.Diagnostics.CodeAnalysis;
using System.Runtime.ExceptionServices;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Components.RenderTree;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.HtmlRendering;
Expand Down Expand Up @@ -30,6 +31,8 @@ public StaticHtmlRenderer(IServiceProvider serviceProvider, ILoggerFactory logge
: base(serviceProvider, loggerFactory)
{
_navigationManager = serviceProvider.GetService<NavigationManager>();
_htmlEncoder = serviceProvider.GetService<HtmlEncoder>() ?? HtmlEncoder.Default;
_javaScriptEncoder = serviceProvider.GetService<JavaScriptEncoder>() ?? JavaScriptEncoder.Default;
}

/// <inheritdoc/>
Expand Down

0 comments on commit cde2430

Please sign in to comment.