diff --git a/src/Microsoft.AspNetCore.Blazor/Components/ParameterCollection.cs b/src/Microsoft.AspNetCore.Blazor/Components/ParameterCollection.cs index ddfd18ffce..09fff59113 100644 --- a/src/Microsoft.AspNetCore.Blazor/Components/ParameterCollection.cs +++ b/src/Microsoft.AspNetCore.Blazor/Components/ParameterCollection.cs @@ -169,7 +169,6 @@ namespace Microsoft.AspNetCore.Blazor.Components => type.IsPrimitive || type == typeof(string) || type == typeof(DateTime) - || type == typeof(RenderFragment) || type == typeof(decimal); } } diff --git a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs index 46479a831e..75a7191756 100644 --- a/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Test/RenderTreeDiffBuilderTest.cs @@ -853,7 +853,6 @@ namespace Microsoft.AspNetCore.Blazor.Test tree.AddAttribute(1, "MyDouble", double.MaxValue); tree.AddAttribute(1, "MyDecimal", decimal.MinusOne); tree.AddAttribute(1, "MyDate", dateTimeWillNotChange); - tree.AddAttribute(1, "MyFragment", fragmentWillNotChange); // Treat fragments as primitive tree.CloseComponent(); } @@ -870,6 +869,32 @@ namespace Microsoft.AspNetCore.Blazor.Test Assert.Equal(1, originalComponentInstance.SetParametersCallCount); // Received no further parameter change notification } + [Fact] + public void AlwaysRegardsRenderFragmentAsPossiblyChanged() + { + // Even if the RenderFragment instance itself is unchanged, the output you get + // when invoking it might have changed (they aren't pure functions in general) + + // Arrange: Populate old and new with equivalent content + RenderFragment fragmentWillNotChange = builder => throw new NotImplementedException(); + foreach (var tree in new[] { oldTree, newTree }) + { + tree.OpenComponent(0); + tree.AddAttribute(1, "MyFragment", fragmentWillNotChange); + tree.CloseComponent(); + } + + RenderTreeDiffBuilder.ComputeDiff(renderer, new RenderBatchBuilder(), 0, new RenderTreeBuilder(renderer).GetFrames(), oldTree.GetFrames()); + var componentInstance = (CaptureSetParametersComponent)oldTree.GetFrames().Array[0].Component; + Assert.Equal(1, componentInstance.SetParametersCallCount); + + // Act + var renderBatch = GetRenderedBatch(); + + // Assert + Assert.Equal(2, componentInstance.SetParametersCallCount); + } + [Fact] public void QueuesRemovedChildComponentsForDisposal() {