Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public static partial class PlatformDetection
public static bool IsSolaris => RuntimeInformation.IsOSPlatform(OSPlatform.Create("SOLARIS"));
public static bool IsBrowser => RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER"));
public static bool IsWasi => RuntimeInformation.IsOSPlatform(OSPlatform.Create("WASI"));
public static bool IsWasm => IsBrowser || IsWasi;
public static bool IsNotBrowser => !IsBrowser;
public static bool IsNotWasi => !IsWasi;
public static bool IsMobile => IsBrowser || IsWasi || IsAppleMobile || IsAndroid;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ private static unsafe bool IcuIsNormalized(ReadOnlySpan<char> source, Normalizat
Debug.Assert(!GlobalizationMode.Invariant);
Debug.Assert(!GlobalizationMode.UseNls);
Debug.Assert(!source.IsEmpty);
#pragma warning disable CA1416 // FormKC and FormKD are unsupported on browser, ValidateArguments is throwing PlatformNotSupportedException in that case so suppressing the warning here
#pragma warning disable CA1416 // FormKC and FormKD are unsupported on browser, CheckNormalizationForm is throwing PlatformNotSupportedException in that case so suppressing the warning here
Debug.Assert(normalizationForm is NormalizationForm.FormC or NormalizationForm.FormD or NormalizationForm.FormKC or NormalizationForm.FormKD);
#pragma warning restore CA1416

ValidateArguments(source, normalizationForm, nameof(source));
ValidateArguments(source, nameof(source));

int ret;
fixed (char* pInput = source)
Expand Down Expand Up @@ -50,7 +50,7 @@ private static unsafe string IcuNormalize(string strInput, NormalizationForm nor
Debug.Assert(!GlobalizationMode.UseNls);
Debug.Assert(normalizationForm == NormalizationForm.FormC || normalizationForm == NormalizationForm.FormD || normalizationForm == NormalizationForm.FormKC || normalizationForm == NormalizationForm.FormKD);

ValidateArguments(strInput, normalizationForm);
ValidateArguments(strInput);

char[]? toReturn = null;
try
Expand Down Expand Up @@ -132,7 +132,7 @@ private static unsafe bool IcuTryNormalize(ReadOnlySpan<char> source, Span<char>
return false;
}

ValidateArguments(source, normalizationForm, nameof(source));
ValidateArguments(source, nameof(source));

int realLen;
fixed (char* pInput = source)
Expand Down Expand Up @@ -172,7 +172,7 @@ private static unsafe int IcuGetNormalizedLength(ReadOnlySpan<char> source, Norm
Debug.Assert(!source.IsEmpty);
Debug.Assert(normalizationForm == NormalizationForm.FormC || normalizationForm == NormalizationForm.FormD || normalizationForm == NormalizationForm.FormKC || normalizationForm == NormalizationForm.FormKD);

ValidateArguments(source, normalizationForm, nameof(source));
ValidateArguments(source, nameof(source));

int realLen;
fixed (char* pInput = source)
Expand All @@ -197,14 +197,8 @@ private static unsafe int IcuGetNormalizedLength(ReadOnlySpan<char> source, Norm
return realLen;
}

private static void ValidateArguments(ReadOnlySpan<char> strInput, NormalizationForm normalizationForm, string paramName = "strInput")
private static void ValidateArguments(ReadOnlySpan<char> strInput, string paramName = "strInput")
{
if ((OperatingSystem.IsBrowser() || OperatingSystem.IsWasi()) && (normalizationForm == NormalizationForm.FormKC || normalizationForm == NormalizationForm.FormKD))
{
// Browser's ICU doesn't contain data needed for FormKC and FormKD
throw new PlatformNotSupportedException(SR.Argument_UnsupportedNormalizationFormInBrowser);
}

if (HasInvalidUnicodeSequence(strInput))
{
throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, paramName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,15 @@ private static void CheckNormalizationForm(NormalizationForm normalizationForm)
{
throw new ArgumentException(SR.Argument_InvalidNormalizationForm, nameof(normalizationForm));
}

if ((OperatingSystem.IsBrowser() || OperatingSystem.IsWasi()) &&
!GlobalizationMode.Invariant &&
!GlobalizationMode.UseNls &&
(normalizationForm == NormalizationForm.FormKC || normalizationForm == NormalizationForm.FormKD))
{
// Browser/WASI builds ship without compatibility normalization data.
throw new PlatformNotSupportedException(SR.Argument_UnsupportedNormalizationFormInBrowser);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -138,5 +138,29 @@ public void Normalize_Null()
{
AssertExtensions.Throws<ArgumentNullException>("strInput", () => StringNormalizationExtensions.Normalize(null));
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsWasm))]
public void NormalizationForms_ThrowOnNotSupportedPlatforms()
{
AssertNormalizationFormThrows(NormalizationForm.FormKC);
AssertNormalizationFormThrows(NormalizationForm.FormKD);
}

private static void AssertNormalizationFormThrows(NormalizationForm normalizationForm)
{
foreach (string value in new[] { "ascii", "😊" })
{
Assert.Throws<PlatformNotSupportedException>(() => value.IsNormalized(normalizationForm));
Assert.Throws<PlatformNotSupportedException>(() => value.AsSpan().IsNormalized(normalizationForm));
Assert.Throws<PlatformNotSupportedException>(() => value.Normalize(normalizationForm));

Assert.Throws<PlatformNotSupportedException>(() =>
{
Span<char> destination = stackalloc char[32];
value.AsSpan().TryNormalize(destination, out _, normalizationForm);
});
Assert.Throws<PlatformNotSupportedException>(() => value.AsSpan().GetNormalizedLength(normalizationForm));
}
}
}
}
Loading