You've already forked linux-packaging-mono
Imported Upstream version 5.10.0.69
Former-commit-id: fc39669a0b707dd3c063977486506b6793da2890
This commit is contained in:
parent
d8f8abd549
commit
e2950ec768
158
external/corefx/src/System.Private.Uri/tests/FunctionalTests/IriEncodingDecodingTests.cs
vendored
Normal file
158
external/corefx/src/System.Private.Uri/tests/FunctionalTests/IriEncodingDecodingTests.cs
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
// Licensed to the .NET Foundation under one or more agreements.
|
||||
// The .NET Foundation licenses this file to you under the MIT license.
|
||||
// See the LICENSE file in the project root for more information.
|
||||
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
|
||||
using Xunit;
|
||||
|
||||
namespace System.PrivateUri.Tests
|
||||
{
|
||||
public class IriEncodingDecodingTest
|
||||
{
|
||||
// This array contains potentially problematic URI data strings and their canonical encoding.
|
||||
private static string[,] RFC3986CompliantDecoding =
|
||||
{
|
||||
{ "%3B%2F%3F%3A%40%26%3D%2B%24%2C", "%3B%2F%3F%3A%40%26%3D%2B%24%2C" }, // Encoded RFC 2396 Reserved Marks.
|
||||
{ @"-_.~", @"-_.~" }, // RFC3986 Unreserved Marks.
|
||||
{ "%2D%5F%2E%7E", @"-_.~" }, // Encoded RFC 3986 Unreserved Marks.
|
||||
{ "%2F%3F%3A%40%23%5B%5D", "%2F%3F%3A%40%23%5B%5D" }, // Encoded RFC 3986 Gen Delims.
|
||||
{ @";&=+$,!'()*", @";&=+$,!'()*" }, // RFC 3986 Sub Delims.
|
||||
{ "%3B%26%3D%2B%24%2C%21%27%28%29%2A", "%3B%26%3D%2B%24%2C%21%27%28%29%2A" }, // Encoded RFC3986 Sub Delims.
|
||||
{ "%E2%80%8F%E2%80%8E%E2%80%AA%E2%80%AB%E2%80%AC%E2%80%AD%E2%80%AE",
|
||||
"%E2%80%8F%E2%80%8E%E2%80%AA%E2%80%AB%E2%80%AC%E2%80%AD%E2%80%AE" }, // Encoded Unicode Bidi Control Characters.
|
||||
{ "\u200E\u200F\u202A\u202B\u202C\u202D\u202E",
|
||||
"%E2%80%8E%E2%80%8F%E2%80%AA%E2%80%AB%E2%80%AC%E2%80%AD%E2%80%AE" }, // Unencoded Unicode Bidi Control Characters
|
||||
};
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void AbsoluteUri_DangerousPathSymbols_RFC3986CompliantAbsoluteUri()
|
||||
{
|
||||
Uri uri;
|
||||
string baseUri = "http://a/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
string sourceStr = baseUri + RFC3986CompliantDecoding[i, 0];
|
||||
uri = new Uri(sourceStr);
|
||||
Assert.Equal(baseUri + RFC3986CompliantDecoding[i, 1], uri.AbsoluteUri);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void AbsolutePath_DangerousPathSymbols_RFC3986CompliantAbsolutePath()
|
||||
{
|
||||
Uri uri;
|
||||
string host = "http://a";
|
||||
string path = "/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
string sourceStr = host + path + RFC3986CompliantDecoding[i, 0];
|
||||
uri = new Uri(sourceStr);
|
||||
Assert.Equal(path + RFC3986CompliantDecoding[i, 1], uri.AbsolutePath);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Segments_DangerousPathSymbols_RFC3986CompliantPathSegments()
|
||||
{
|
||||
Uri uri;
|
||||
string host = "http://a";
|
||||
string path = "/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
string sourceStr = host + path + RFC3986CompliantDecoding[i, 0];
|
||||
uri = new Uri(sourceStr);
|
||||
Assert.Equal(path + RFC3986CompliantDecoding[i, 1], String.Join(String.Empty, uri.Segments));
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Equality_DangerousPathSymbols_RFC3986CompliantEquality()
|
||||
{
|
||||
string baseUri = "http://a/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
Uri uri1 = new Uri(baseUri + RFC3986CompliantDecoding[i, 0]);
|
||||
Uri uri2 = new Uri(baseUri + RFC3986CompliantDecoding[i, 1]);
|
||||
Assert.Equal(uri1, uri2);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void PathAndQuery_DangerousQuerySymbols_RFC3986CompliantPathAndQuery()
|
||||
{
|
||||
Uri uri;
|
||||
string host = "http://a";
|
||||
string path = "/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
string sourceStr = host + path + "?" + RFC3986CompliantDecoding[i, 0];
|
||||
uri = new Uri(sourceStr);
|
||||
Assert.Equal(path + "?" + RFC3986CompliantDecoding[i, 1], uri.PathAndQuery);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Query_DangerousQuerySymbols_RFC3986CompliantQuery()
|
||||
{
|
||||
Uri uri;
|
||||
string baseUri = "http://a/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
string sourceStr = baseUri + "?" + RFC3986CompliantDecoding[i, 0];
|
||||
uri = new Uri(sourceStr);
|
||||
Assert.Equal("?" + RFC3986CompliantDecoding[i, 1], uri.Query);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Equality_DangerousQuerySymbols_RFC3986CompliantEquality()
|
||||
{
|
||||
string baseUri = "http://a/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
Uri uriTest = new Uri(baseUri + "?" + RFC3986CompliantDecoding[i, 0]);
|
||||
Uri uriTest1 = new Uri(baseUri + "?" + RFC3986CompliantDecoding[i, 1]);
|
||||
Assert.Equal(uriTest, uriTest1);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Fragment_DangerousFragmentSymbols_RFC3986CompliantFragment()
|
||||
{
|
||||
Uri uri;
|
||||
string baseUri = "http://a/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
string sourceStr = baseUri + "#" + RFC3986CompliantDecoding[i, 0];
|
||||
uri = new Uri(sourceStr);
|
||||
Assert.Equal("#" + RFC3986CompliantDecoding[i, 1], uri.Fragment);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void UserInfo_DangerousUserInfoSymbols_RFC3986CompliantUserInfo()
|
||||
{
|
||||
Uri uri;
|
||||
string baseUri = "http://";
|
||||
string host = "a";
|
||||
string path = "/%C3%88/";
|
||||
for (int i = 0; i < RFC3986CompliantDecoding.GetLength(0); i++)
|
||||
{
|
||||
string sourceStr = baseUri + RFC3986CompliantDecoding[i, 0] + "@" + host + path;
|
||||
uri = new Uri(sourceStr);
|
||||
Assert.Equal(RFC3986CompliantDecoding[i, 1], uri.UserInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,32 +64,36 @@ namespace System.PrivateUri.Tests
|
||||
public void Iri_Uri_SchemaParsing_ShouldNotThrowArgumentOutOfRange()
|
||||
{
|
||||
string root = "viewcode://./codeschema_class?";
|
||||
string uriDataFra = root + Uri.EscapeDataString("Type=\u00E9");
|
||||
string uriDataFra = root + "Type=" + Uri.EscapeDataString("\u00E9");
|
||||
|
||||
Uri u1 = new Uri(uriDataFra);
|
||||
|
||||
// TODO #8330 : Normalization should produce the same result for escaped/unescaped URIs.
|
||||
// Assert.Equal(root + "Type=%C3%A9", u1.AbsoluteUri);
|
||||
|
||||
Assert.NotEqual(root + "Type=%C3%A9", u1.AbsoluteUri);
|
||||
Assert.Equal(root + "Type=%C3%A9", u1.AbsoluteUri);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Iri_IncorrectNormalization()
|
||||
public void Iri_ReservedCharacters_NotNormalized()
|
||||
{
|
||||
Uri u1 = new Uri(@"http://test.com/%2c");
|
||||
Uri u2 = new Uri(@"http://test.com/,");
|
||||
|
||||
// TODO #8330 : Normalization should produce the same result for escaped/unescaped URIs.
|
||||
//Assert.Equal(
|
||||
// u1.ToString(),
|
||||
// u2.ToString());
|
||||
|
||||
Assert.NotEqual(
|
||||
u1.ToString(),
|
||||
u2.ToString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Iri_UnknownSchemeWithoutAuthority_DoesNormalize()
|
||||
{
|
||||
string[] paths = { "\u00E8", "%C3%A8" };
|
||||
foreach (string path in paths)
|
||||
{
|
||||
Uri noAuthority = new Uri("scheme:" + path);
|
||||
Assert.Equal("scheme:\u00E8", noAuthority.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Iri_804110_TryCreateUri_ShouldNotThrowIndexOutOfRange()
|
||||
{
|
||||
@@ -403,47 +407,47 @@ namespace System.PrivateUri.Tests
|
||||
|
||||
/// <summary>
|
||||
/// First column contains input characters found to be potential issues with the current implementation.
|
||||
/// The second column contains the current (.Net 4.5.2) Uri behavior for Uri normalization.
|
||||
/// The second column contains the current (.Net Core 2.1/Framework 4.7.2) Uri behavior for Uri normalization.
|
||||
/// </summary>
|
||||
private static string[,] s_checkIsReservedEscapingStrings =
|
||||
{
|
||||
// : [ ] in host
|
||||
// : [ ] in host.
|
||||
{"http://user@ser%3Aver.srv:123/path/path/resource.ext?query=expression#fragment", null},
|
||||
{"http://user@server.srv%3A999/path/path/resource.ext?query=expression#fragment", null},
|
||||
{"http://user@server.%5Bsrv:123/path/path/resource.ext?query=expression#fragment", null},
|
||||
{"http://user@ser%5Dver.srv:123/path/path/resource.ext?query=expression#fragment", null},
|
||||
|
||||
// [ ] in userinfo
|
||||
{"http://us%5Ber@server.srv:123/path/path/resource.ext?query=expression#fragment",
|
||||
// [ ] in userinfo.
|
||||
{"http://us%5Ber@server.srv:123/path/path/resource.ext?query=expression#fragment",
|
||||
"http://us%5Ber@server.srv:123/path/path/resource.ext?query=expression#fragment"},
|
||||
{"http://u%5Dser@server.srv:123/path/path/resource.ext?query=expression#fragment",
|
||||
{"http://u%5Dser@server.srv:123/path/path/resource.ext?query=expression#fragment",
|
||||
"http://u%5Dser@server.srv:123/path/path/resource.ext?query=expression#fragment"},
|
||||
{"http://us%5B%5Der@server.srv:123/path/path/resource.ext?query=expression#fragment",
|
||||
{"http://us%5B%5Der@server.srv:123/path/path/resource.ext?query=expression#fragment",
|
||||
"http://us%5B%5Der@server.srv:123/path/path/resource.ext?query=expression#fragment"},
|
||||
|
||||
// [ ] in path
|
||||
{"http://user@server.srv:123/path/pa%5Bth/resource.ext?query=expression#fragment",
|
||||
"http://user@server.srv:123/path/pa[th/resource.ext?query=expression#fragment"},
|
||||
{"http://user@server.srv:123/pa%5Dth/path%5D/resource.ext?query=expression#fragment",
|
||||
"http://user@server.srv:123/pa]th/path]/resource.ext?query=expression#fragment"},
|
||||
{"http://user@server.srv:123/path/p%5Ba%5Dth/resource.ext?query=expression#fragment",
|
||||
"http://user@server.srv:123/path/p[a]th/resource.ext?query=expression#fragment"},
|
||||
// [ ] : ' in path.
|
||||
{"http://user@server.srv:123/path/pa%5B%3A%27th/resource.ext?query=expression#fragment",
|
||||
"http://user@server.srv:123/path/pa%5B%3A%27th/resource.ext?query=expression#fragment"},
|
||||
{"http://user@server.srv:123/pa%5D%3A%27th/path%5D%3A%27/resource.ext?query=expression#fragment",
|
||||
"http://user@server.srv:123/pa%5D%3A%27th/path%5D%3A%27/resource.ext?query=expression#fragment"},
|
||||
{"http://user@server.srv:123/path/p%5B%3A%27a%5D%3A%27th/resource.ext?query=expression#fragment",
|
||||
"http://user@server.srv:123/path/p%5B%3A%27a%5D%3A%27th/resource.ext?query=expression#fragment"},
|
||||
|
||||
// [ ] in query
|
||||
{"http://user@server.srv:123/path/path/resource.ext?que%5Bry=expression#fragment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?que[ry=expression#fragment"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=exp%5Dression#fragment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=exp]ression#fragment"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?que%5Bry=exp%5Dression#fragment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?que[ry=exp]ression#fragment"},
|
||||
// [ ] : ' in query.
|
||||
{"http://user@server.srv:123/path/path/resource.ext?que%5B%3A%27ry=expression#fragment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?que%5B%3A%27ry=expression#fragment"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=exp%5D%3A%27ression#fragment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=exp%5D%3A%27ression#fragment"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?que%5B%3A%27ry=exp%5D%3A%27ression#fragment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?que%5B%3A%27ry=exp%5D%3A%27ression#fragment"},
|
||||
|
||||
// [ ] in fragment
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=expression#fr%5Bagment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=expression#fr[agment"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=expression#fragment%5D",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=expression#fragment]"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=expression#fr%5Bagment%5D",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=expression#fr[agment]"}
|
||||
// [ ] : ' in fragment.
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=expression#fr%5B%3A%27agment",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=expression#fr%5B%3A%27agment"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=expression#fragment%5D%3A%27",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=expression#fragment%5D%3A%27"},
|
||||
{"http://user@server.srv:123/path/path/resource.ext?query=expression#fr%5B%3A%27agment%5D%3A%27",
|
||||
"http://user@server.srv:123/path/path/resource.ext?query=expression#fr%5B%3A%27agment%5D%3A%27"}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
@@ -451,6 +455,7 @@ namespace System.PrivateUri.Tests
|
||||
/// CheckIsReserved().
|
||||
/// </summary>
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Iri_CheckIsReserved_EscapingBehavior()
|
||||
{
|
||||
for (int i = 0; i < s_checkIsReservedEscapingStrings.GetLength(0); i++)
|
||||
@@ -521,5 +526,19 @@ namespace System.PrivateUri.Tests
|
||||
catch (FormatException)
|
||||
{ }
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("\u00E8")]
|
||||
[InlineData("_\u00E8")]
|
||||
[InlineData("_")]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void Iri_FileUriUncFallback_DoesSupportUnicodeHost(string authority)
|
||||
{
|
||||
Uri fileTwoSlashes = new Uri("file://" + authority);
|
||||
Uri fileFourSlashes = new Uri("file:////" + authority);
|
||||
|
||||
Assert.Equal(authority, fileTwoSlashes.Authority); // Two slashes must be followed by an authority
|
||||
Assert.Equal(authority, fileFourSlashes.Authority); // More than three slashes looks like a UNC share
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<Compile Include="IdnCheckHostNameTest.cs" />
|
||||
<Compile Include="IdnDnsSafeHostTest.cs" />
|
||||
<Compile Include="IdnHostNameValidationTest.cs" />
|
||||
<Compile Include="IriEncodingDecodingTests.cs" />
|
||||
<Compile Include="IriRelativeFileResolutionTest.cs" />
|
||||
<Compile Include="IriTest.cs" />
|
||||
<Compile Include="UriBuilderParameterTest.cs" />
|
||||
|
||||
@@ -321,13 +321,14 @@ namespace System.PrivateUri.Tests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void UriAbsoluteUnEscaping_RFC2396UnreservedEscaped_AllUnescaped()
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void UriAbsoluteUnEscaping_RFC3986UnreservedEscaped_AllUnescaped()
|
||||
{
|
||||
string escaped = Escape(RFC2396Unreserved);
|
||||
string escaped = Escape(RFC3986Unreserved);
|
||||
string input = "http://" + AlphaNumeric.ToLowerInvariant() + "/" + escaped
|
||||
+ "?" + escaped + "#" + escaped;
|
||||
string expectedOutput = "http://" + AlphaNumeric.ToLowerInvariant() + "/" + RFC2396Unreserved
|
||||
+ "?" + RFC2396Unreserved + "#" + RFC2396Unreserved;
|
||||
string expectedOutput = "http://" + AlphaNumeric.ToLowerInvariant() + "/" + RFC3986Unreserved
|
||||
+ "?" + RFC3986Unreserved + "#" + RFC3986Unreserved;
|
||||
|
||||
Uri testUri = new Uri(input);
|
||||
Assert.Equal(expectedOutput, testUri.AbsoluteUri);
|
||||
@@ -398,12 +399,12 @@ namespace System.PrivateUri.Tests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "Requires fix shipping in .NET 4.7.2")]
|
||||
public void UriAbsoluteEscaping_SurrogatePair_LocaleIndependent()
|
||||
{
|
||||
string uriString = "http://contosotest.conto.soco.ntosoco.com/surrgtest()?$filter=";
|
||||
string expectedString = uriString + "%E6%95%B0%E6%8D%AE%20eq%20" +
|
||||
"'%F0%A0%80%80%F0%A0%80%81%F0%A0%80%82%F0%A0%80%83%F0%AA%9B%91%F0%AA%9B" +
|
||||
"%92%F0%AA%9B%93%F0%AA%9B%94%F0%AA%9B%95%F0%AA%9B%96'";
|
||||
string expectedString = uriString + "%E6%95%B0%E6%8D%AE%20eq%20%27%F0%A0%80%80%F0%A0%80%81%F0%A0%80%82%F0%A0%80%83%F0" +
|
||||
"%AA%9B%91%F0%AA%9B%92%F0%AA%9B%93%F0%AA%9B%94%F0%AA%9B%95%F0%AA%9B%96%27";
|
||||
|
||||
using (ThreadCultureChange iriHelper = new ThreadCultureChange())
|
||||
{
|
||||
|
||||
@@ -889,5 +889,12 @@ namespace System.PrivateUri.Tests
|
||||
s = uri.GetComponents(UriComponents.Host, UriFormat.UriEscaped);
|
||||
Assert.Equal(s, "www.contoso.com");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public static void TestCasingWhenCombiningAbsoluteAndRelativeUris()
|
||||
{
|
||||
Uri u = new Uri(new Uri("http://example.com/", UriKind.Absolute), new Uri("C(B:G", UriKind.Relative));
|
||||
Assert.Equal("http://example.com/C(B:G", u.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,5 +6,20 @@ namespace System
|
||||
{
|
||||
public class UriParser
|
||||
{
|
||||
internal static bool DontEnableStrictRFC3986ReservedCharacterSets
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
internal static bool DontKeepUnicodeBidiFormattingCharacters
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user