Skip to content

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

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 2 commits into from
Jan 8, 2024

Conversation

javiercn
Copy link
Member

@javiercn javiercn commented Jan 4, 2024

Fixes #47477

Check on the DI container for an encoder implementation and use that if available. Otherwise, fallback to the default.

@javiercn javiercn requested a review from a team as a code owner January 4, 2024 15:21
@ghost ghost added the area-blazor Includes: Blazor, Razor Components label Jan 4, 2024
@javiercn
Copy link
Member Author

javiercn commented Jan 4, 2024

/azp run

Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@javiercn javiercn merged commit de52c21 into main Jan 8, 2024
@javiercn javiercn deleted the javiercn/issue-47477 branch January 8, 2024 13:24
@ghost ghost added this to the 9.0-preview1 milestone Jan 8, 2024
@javiercn
Copy link
Member Author

javiercn commented Jan 8, 2024

/backport to release/8.0

Copy link
Contributor

github-actions bot commented Jan 8, 2024

Started backporting to release/8.0: https://github.com/dotnet/aspnetcore/actions/runs/7448075541

mkArtakMSFT pushed a commit that referenced this pull request Jan 17, 2024
…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>
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
area-blazor Includes: Blazor, Razor Components
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Ensure ability to customize the HtmlEncoder used for the RazorComponentEndpoint
2 participants