From e66ad54db4e996b5aa25c22983a840322727eca8 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Mon, 1 Jun 2020 15:45:07 -0700 Subject: [PATCH] Improve handling for shared values in Blazor Server (#21299) --- .../test/Rendering/RenderRegistryTest.cs | 27 +++++++++++++++++++ .../Components/src/BindConverter.cs | 4 +-- src/Components/Web/src/Forms/InputNumber.cs | 2 +- .../src/Rendering/RendererRegistry.cs | 22 ++++++++++----- 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 src/Components/Blazor/Blazor/test/Rendering/RenderRegistryTest.cs diff --git a/src/Components/Blazor/Blazor/test/Rendering/RenderRegistryTest.cs b/src/Components/Blazor/Blazor/test/Rendering/RenderRegistryTest.cs new file mode 100644 index 0000000000..6f37bf34d4 --- /dev/null +++ b/src/Components/Blazor/Blazor/test/Rendering/RenderRegistryTest.cs @@ -0,0 +1,27 @@ +using System; +using Xunit; + +namespace Microsoft.AspNetCore.Blazor.Rendering +{ + public class RenderRegistryTest + { + [Fact] + public void RendererRegistry_Find_ThrowsErrorOnNonWASM() + { + // Act + Exception ex = Assert.Throws(() => RendererRegistry.Find(123)); + + // Assert + Assert.Equal("There is no renderer with ID 123.", ex.Message); + } + [Fact] + public void RendererRegistry_Remove_DoesNothingOnNonWASM() + { + // Act + var result = RendererRegistry.TryRemove(123); + + // Assert + Assert.False(result); + } + } +} diff --git a/src/Components/Components/src/BindConverter.cs b/src/Components/Components/src/BindConverter.cs index 0aadb8077e..c8fcfcff7e 100644 --- a/src/Components/Components/src/BindConverter.cs +++ b/src/Components/Components/src/BindConverter.cs @@ -537,8 +537,8 @@ namespace Microsoft.AspNetCore.Components return ConvertToNullableBoolCore(obj, culture, out value); } - internal static BindParser ConvertToBool = ConvertToBoolCore; - internal static BindParser ConvertToNullableBool = ConvertToNullableBoolCore; + internal readonly static BindParser ConvertToBool = ConvertToBoolCore; + internal readonly static BindParser ConvertToNullableBool = ConvertToNullableBoolCore; private static bool ConvertToBoolCore(object obj, CultureInfo culture, out bool value) { diff --git a/src/Components/Web/src/Forms/InputNumber.cs b/src/Components/Web/src/Forms/InputNumber.cs index efdb53c905..22ef566e38 100644 --- a/src/Components/Web/src/Forms/InputNumber.cs +++ b/src/Components/Web/src/Forms/InputNumber.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Components.Forms /// public class InputNumber : InputBase { - private static string _stepAttributeValue; // Null by default, so only allows whole numbers as per HTML spec + private readonly static string _stepAttributeValue; // Null by default, so only allows whole numbers as per HTML spec static InputNumber() { diff --git a/src/Components/WebAssembly/WebAssembly/src/Rendering/RendererRegistry.cs b/src/Components/WebAssembly/WebAssembly/src/Rendering/RendererRegistry.cs index 710ef85396..4584bb735e 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Rendering/RendererRegistry.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Rendering/RendererRegistry.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Runtime.InteropServices; namespace Microsoft.AspNetCore.Components.WebAssembly.Rendering { @@ -14,27 +15,36 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Rendering // them even though we might still receive incoming events from JS. private static int _nextId; - private static Dictionary _renderers = new Dictionary(); + private static Dictionary _renderers; + + static RendererRegistry() + { + bool _isWebAssembly = RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER")); + if (_isWebAssembly) + { + _renderers = new Dictionary(); + } + } internal static WebAssemblyRenderer Find(int rendererId) { - return _renderers.ContainsKey(rendererId) - ? _renderers[rendererId] + return _renderers != null && _renderers.ContainsKey(rendererId) + ? _renderers?[rendererId] : throw new ArgumentException($"There is no renderer with ID {rendererId}."); } public static int Add(WebAssemblyRenderer renderer) { var id = _nextId++; - _renderers.Add(id, renderer); + _renderers?.Add(id, renderer); return id; } public static bool TryRemove(int rendererId) { - if (_renderers.ContainsKey(rendererId)) + if (_renderers != null && _renderers.ContainsKey(rendererId)) { - _renderers.Remove(rendererId); + _renderers?.Remove(rendererId); return true; } else