Skip to content

Commit 6b2d9f2

Browse files
Prerender select elements with value; move HtmlRenderer into Mvc.ViewFeatures (#12996)
1 parent 826ed75 commit 6b2d9f2

14 files changed

+240
-194
lines changed

src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp3.0.cs

+1-18
Original file line numberDiff line numberDiff line change
@@ -363,30 +363,12 @@ public static partial class RuntimeHelpers
363363
}
364364
namespace Microsoft.AspNetCore.Components.Rendering
365365
{
366-
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
367-
public readonly partial struct ComponentRenderedText
368-
{
369-
private readonly object _dummy;
370-
private readonly int _dummyPrimitive;
371-
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
372-
public System.Collections.Generic.IEnumerable<string> Tokens { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
373-
}
374366
public partial class EventFieldInfo
375367
{
376368
public EventFieldInfo() { }
377369
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
378370
public object FieldValue { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
379371
}
380-
public partial class HtmlRenderer : Microsoft.AspNetCore.Components.Rendering.Renderer
381-
{
382-
public HtmlRenderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, System.Func<string, string> htmlEncoder) : base (default(System.IServiceProvider), default(Microsoft.Extensions.Logging.ILoggerFactory)) { }
383-
public override Microsoft.AspNetCore.Components.Dispatcher Dispatcher { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
384-
protected override void HandleException(System.Exception exception) { }
385-
[System.Diagnostics.DebuggerStepThroughAttribute]
386-
public System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Rendering.ComponentRenderedText> RenderComponentAsync(System.Type componentType, Microsoft.AspNetCore.Components.ParameterView initialParameters) { throw null; }
387-
public System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Rendering.ComponentRenderedText> RenderComponentAsync<TComponent>(Microsoft.AspNetCore.Components.ParameterView initialParameters) where TComponent : Microsoft.AspNetCore.Components.IComponent { throw null; }
388-
protected override System.Threading.Tasks.Task UpdateDisplayAsync(in Microsoft.AspNetCore.Components.Rendering.RenderBatch renderBatch) { throw null; }
389-
}
390372
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
391373
public readonly partial struct RenderBatch
392374
{
@@ -405,6 +387,7 @@ public event System.UnhandledExceptionEventHandler UnhandledSynchronizationExcep
405387
public virtual System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo fieldInfo, System.EventArgs eventArgs) { throw null; }
406388
public void Dispose() { }
407389
protected virtual void Dispose(bool disposing) { }
390+
protected Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) { throw null; }
408391
protected abstract void HandleException(System.Exception exception);
409392
protected Microsoft.AspNetCore.Components.IComponent InstantiateComponent(System.Type componentType) { throw null; }
410393
protected virtual void ProcessPendingRender() { }

src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs

+1-18
Original file line numberDiff line numberDiff line change
@@ -363,30 +363,12 @@ public static partial class RuntimeHelpers
363363
}
364364
namespace Microsoft.AspNetCore.Components.Rendering
365365
{
366-
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
367-
public readonly partial struct ComponentRenderedText
368-
{
369-
private readonly object _dummy;
370-
private readonly int _dummyPrimitive;
371-
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
372-
public System.Collections.Generic.IEnumerable<string> Tokens { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
373-
}
374366
public partial class EventFieldInfo
375367
{
376368
public EventFieldInfo() { }
377369
public int ComponentId { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
378370
public object FieldValue { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
379371
}
380-
public partial class HtmlRenderer : Microsoft.AspNetCore.Components.Rendering.Renderer
381-
{
382-
public HtmlRenderer(System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, System.Func<string, string> htmlEncoder) : base (default(System.IServiceProvider), default(Microsoft.Extensions.Logging.ILoggerFactory)) { }
383-
public override Microsoft.AspNetCore.Components.Dispatcher Dispatcher { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
384-
protected override void HandleException(System.Exception exception) { }
385-
[System.Diagnostics.DebuggerStepThroughAttribute]
386-
public System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Rendering.ComponentRenderedText> RenderComponentAsync(System.Type componentType, Microsoft.AspNetCore.Components.ParameterView initialParameters) { throw null; }
387-
public System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Rendering.ComponentRenderedText> RenderComponentAsync<TComponent>(Microsoft.AspNetCore.Components.ParameterView initialParameters) where TComponent : Microsoft.AspNetCore.Components.IComponent { throw null; }
388-
protected override System.Threading.Tasks.Task UpdateDisplayAsync(in Microsoft.AspNetCore.Components.Rendering.RenderBatch renderBatch) { throw null; }
389-
}
390372
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
391373
public readonly partial struct RenderBatch
392374
{
@@ -405,6 +387,7 @@ public event System.UnhandledExceptionEventHandler UnhandledSynchronizationExcep
405387
public virtual System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo fieldInfo, System.EventArgs eventArgs) { throw null; }
406388
public void Dispose() { }
407389
protected virtual void Dispose(bool disposing) { }
390+
protected Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) { throw null; }
408391
protected abstract void HandleException(System.Exception exception);
409392
protected Microsoft.AspNetCore.Components.IComponent InstantiateComponent(System.Type componentType) { throw null; }
410393
protected virtual void ProcessPendingRender() { }

src/Components/Components/src/Rendering/ComponentRenderedText.cs

-29
This file was deleted.

src/Components/Components/src/Rendering/Renderer.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ protected internal int AssignRootComponentId(IComponent component)
9393
/// </summary>
9494
/// <param name="componentId">The id for the component.</param>
9595
/// <returns>The <see cref="RenderTreeBuilder"/> representing the current render tree.</returns>
96-
private protected ArrayRange<RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) => GetRequiredComponentState(componentId).CurrentRenderTree.GetFrames();
96+
protected ArrayRange<RenderTreeFrame> GetCurrentRenderTreeFrames(int componentId) => GetRequiredComponentState(componentId).CurrentRenderTree.GetFrames();
9797

9898
/// <summary>
9999
/// Performs the first render for a root component, waiting for this component and all

src/Components/Components/test/Rendering/HtmlRendererTests.cs

-16
This file was deleted.

src/Components/Server/src/Circuits/DefaultCircuitFactory.cs

-2
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ public override CircuitHost CreateCircuitHost(
5050
var components = ResolveComponentMetadata(httpContext);
5151

5252
var scope = _scopeFactory.CreateScope();
53-
var encoder = scope.ServiceProvider.GetRequiredService<HtmlEncoder>();
5453
var jsRuntime = (RemoteJSRuntime)scope.ServiceProvider.GetRequiredService<IJSRuntime>();
5554
var componentContext = (RemoteComponentContext)scope.ServiceProvider.GetRequiredService<IComponentContext>();
5655
jsRuntime.Initialize(client);
@@ -76,7 +75,6 @@ public override CircuitHost CreateCircuitHost(
7675
_options,
7776
jsRuntime,
7877
client,
79-
encoder,
8078
_loggerFactory.CreateLogger<RemoteRenderer>());
8179

8280
var circuitHandlers = scope.ServiceProvider.GetServices<CircuitHandler>()

src/Components/Server/src/Circuits/RemoteRenderer.cs

+2-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System;
55
using System.Collections.Concurrent;
66
using System.Linq;
7-
using System.Text.Encodings.Web;
87
using System.Threading;
98
using System.Threading.Tasks;
109
using Microsoft.AspNetCore.Components.Rendering;
@@ -17,7 +16,7 @@
1716

1817
namespace Microsoft.AspNetCore.Components.Web.Rendering
1918
{
20-
internal class RemoteRenderer : HtmlRenderer
19+
internal class RemoteRenderer : Renderer
2120
{
2221
private static readonly Task CanceledTask = Task.FromCanceled(new CancellationToken(canceled: true));
2322

@@ -43,9 +42,8 @@ public RemoteRenderer(
4342
CircuitOptions options,
4443
IJSRuntime jsRuntime,
4544
CircuitClientProxy client,
46-
HtmlEncoder encoder,
4745
ILogger logger)
48-
: base(serviceProvider, loggerFactory, encoder.Encode)
46+
: base(serviceProvider, loggerFactory)
4947
{
5048
_jsRuntime = jsRuntime;
5149
_client = client;

src/Components/Server/test/Circuits/CircuitHostTest.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Reflection;
8-
using System.Text.Encodings.Web;
98
using System.Threading;
109
using System.Threading.Tasks;
11-
using Microsoft.AspNetCore.Components.Web;
1210
using Microsoft.AspNetCore.Components.Web.Rendering;
1311
using Microsoft.AspNetCore.SignalR;
1412
using Microsoft.Extensions.DependencyInjection;
@@ -238,7 +236,7 @@ private static TestRemoteRenderer GetRemoteRenderer()
238236
private class TestRemoteRenderer : RemoteRenderer
239237
{
240238
public TestRemoteRenderer(IServiceProvider serviceProvider, IJSRuntime jsRuntime, IClientProxy client)
241-
: base(serviceProvider, NullLoggerFactory.Instance, new CircuitOptions(), jsRuntime, new CircuitClientProxy(client, "connection"), HtmlEncoder.Default, NullLogger.Instance)
239+
: base(serviceProvider, NullLoggerFactory.Instance, new CircuitOptions(), jsRuntime, new CircuitClientProxy(client, "connection"), NullLogger.Instance)
242240
{
243241
}
244242

src/Components/Server/test/Circuits/RemoteRendererTest.cs

+27-40
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics;
7-
using System.Text.Encodings.Web;
87
using System.Threading;
98
using System.Threading.Tasks;
10-
using Microsoft.AspNetCore.Components.Rendering;
119
using Microsoft.AspNetCore.Components.Server;
1210
using Microsoft.AspNetCore.Components.Server.Circuits;
1311
using Microsoft.AspNetCore.SignalR;
@@ -20,23 +18,18 @@
2018

2119
namespace Microsoft.AspNetCore.Components.Web.Rendering
2220
{
23-
public class RemoteRendererTest : HtmlRendererTestBase
21+
public class RemoteRendererTest
2422
{
2523
// Nothing should exceed the timeout in a successful run of the the tests, this is just here to catch
2624
// failures.
2725
private static readonly TimeSpan Timeout = Debugger.IsAttached ? System.Threading.Timeout.InfiniteTimeSpan : TimeSpan.FromSeconds(10);
2826

29-
protected override HtmlRenderer GetHtmlRenderer(IServiceProvider serviceProvider)
30-
{
31-
return GetRemoteRenderer(serviceProvider, new CircuitClientProxy());
32-
}
33-
3427
[Fact]
3528
public void WritesAreBufferedWhenTheClientIsOffline()
3629
{
3730
// Arrange
3831
var serviceProvider = new ServiceCollection().BuildServiceProvider();
39-
var renderer = (RemoteRenderer)GetHtmlRenderer(serviceProvider);
32+
var renderer = GetRemoteRenderer(serviceProvider);
4033
var component = new TestComponent(builder =>
4134
{
4235
builder.OpenElement(0, "my element");
@@ -57,7 +50,7 @@ public void WritesAreBufferedWhenTheClientIsOffline()
5750
public void NotAcknowledgingRenders_ProducesBatches_UpToTheLimit()
5851
{
5952
var serviceProvider = new ServiceCollection().BuildServiceProvider();
60-
var renderer = (RemoteRenderer)GetHtmlRenderer(serviceProvider);
53+
var renderer = GetRemoteRenderer(serviceProvider);
6154
var component = new TestComponent(builder =>
6255
{
6356
builder.OpenElement(0, "my element");
@@ -81,7 +74,7 @@ public void NotAcknowledgingRenders_ProducesBatches_UpToTheLimit()
8174
public async Task NoNewBatchesAreCreated_WhenThereAreNoPendingRenderRequestsFromComponents()
8275
{
8376
var serviceProvider = new ServiceCollection().BuildServiceProvider();
84-
var renderer = (RemoteRenderer)GetHtmlRenderer(serviceProvider);
77+
var renderer = GetRemoteRenderer(serviceProvider);
8578
var component = new TestComponent(builder =>
8679
{
8780
builder.OpenElement(0, "my element");
@@ -107,7 +100,7 @@ public async Task NoNewBatchesAreCreated_WhenThereAreNoPendingRenderRequestsFrom
107100
public async Task ProducesNewBatch_WhenABatchGetsAcknowledged()
108101
{
109102
var serviceProvider = new ServiceCollection().BuildServiceProvider();
110-
var renderer = (RemoteRenderer)GetHtmlRenderer(serviceProvider);
103+
var renderer = GetRemoteRenderer(serviceProvider);
111104
var i = 0;
112105
var component = new TestComponent(builder =>
113106
{
@@ -215,7 +208,7 @@ public async Task OnRenderCompletedAsync_DoesNotThrowWhenReceivedDuplicateAcks()
215208
.Returns<string, object[], CancellationToken>((n, v, t) => (long)v[1] == 2 ? firstBatchTCS.Task : secondBatchTCS.Task);
216209

217210
// This produces the initial batch (id = 2)
218-
var result = await renderer.RenderComponentAsync<AutoParameterTestComponent>(
211+
await renderer.RenderComponentAsync<AutoParameterTestComponent>(
219212
ParameterView.FromDictionary(new Dictionary<string, object>
220213
{
221214
[nameof(AutoParameterTestComponent.Content)] = initialContent,
@@ -278,7 +271,7 @@ public async Task OnRenderCompletedAsync_DoesNotThrowWhenThereAreNoPendingBatche
278271
.Returns<string, object[], CancellationToken>((n, v, t) => (long)v[1] == 2 ? firstBatchTCS.Task : secondBatchTCS.Task);
279272

280273
// This produces the initial batch (id = 2)
281-
var result = await renderer.RenderComponentAsync<AutoParameterTestComponent>(
274+
await renderer.RenderComponentAsync<AutoParameterTestComponent>(
282275
ParameterView.FromDictionary(new Dictionary<string, object>
283276
{
284277
[nameof(AutoParameterTestComponent.Content)] = initialContent,
@@ -341,7 +334,7 @@ public async Task ConsumesAllPendingBatchesWhenReceivingAHigherSequenceBatchId()
341334
var trigger = new Trigger();
342335

343336
// This produces the initial batch (id = 2)
344-
var result = await renderer.RenderComponentAsync<AutoParameterTestComponent>(
337+
await renderer.RenderComponentAsync<AutoParameterTestComponent>(
345338
ParameterView.FromDictionary(new Dictionary<string, object>
346339
{
347340
[nameof(AutoParameterTestComponent.Content)] = initialContent,
@@ -398,7 +391,7 @@ public async Task ThrowsIfWeReceivedAnAcknowledgeForANeverProducedBatch()
398391
var trigger = new Trigger();
399392

400393
// This produces the initial batch (id = 2)
401-
var result = await renderer.RenderComponentAsync<AutoParameterTestComponent>(
394+
await renderer.RenderComponentAsync<AutoParameterTestComponent>(
402395
ParameterView.FromDictionary(new Dictionary<string, object>
403396
{
404397
[nameof(AutoParameterTestComponent.Content)] = initialContent,
@@ -432,27 +425,7 @@ public async Task ThrowsIfWeReceivedAnAcknowledgeForANeverProducedBatch()
432425
exception.Message);
433426
}
434427

435-
[Fact]
436-
public async Task PrerendersMultipleComponentsSuccessfully()
437-
{
438-
// Arrange
439-
var serviceProvider = new ServiceCollection().BuildServiceProvider();
440-
441-
var renderer = GetRemoteRenderer(
442-
serviceProvider,
443-
new CircuitClientProxy());
444-
445-
// Act
446-
var first = await renderer.RenderComponentAsync<TestComponent>(ParameterView.Empty);
447-
var second = await renderer.RenderComponentAsync<TestComponent>(ParameterView.Empty);
448-
449-
// Assert
450-
Assert.Equal(0, first.ComponentId);
451-
Assert.Equal(1, second.ComponentId);
452-
Assert.Equal(2, renderer._unacknowledgedRenderBatches.Count);
453-
}
454-
455-
private RemoteRenderer GetRemoteRenderer(IServiceProvider serviceProvider, CircuitClientProxy circuitClientProxy)
428+
private TestRemoteRenderer GetRemoteRenderer(IServiceProvider serviceProvider, CircuitClientProxy circuitClient = null)
456429
{
457430
var jsRuntime = new Mock<IJSRuntime>();
458431
jsRuntime.Setup(r => r.InvokeAsync<object>(
@@ -462,16 +435,30 @@ private RemoteRenderer GetRemoteRenderer(IServiceProvider serviceProvider, Circu
462435
It.IsAny<int>()))
463436
.ReturnsAsync(Task.FromResult<object>(null));
464437

465-
return new RemoteRenderer(
438+
return new TestRemoteRenderer(
466439
serviceProvider,
467440
NullLoggerFactory.Instance,
468441
new CircuitOptions(),
469442
jsRuntime.Object,
470-
circuitClientProxy,
471-
HtmlEncoder.Default,
443+
circuitClient ?? new CircuitClientProxy(),
472444
NullLogger.Instance);
473445
}
474446

447+
private class TestRemoteRenderer : RemoteRenderer
448+
{
449+
public TestRemoteRenderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory, CircuitOptions options, IJSRuntime jsRuntime, CircuitClientProxy client, ILogger logger)
450+
: base(serviceProvider, loggerFactory, options, jsRuntime, client, logger)
451+
{
452+
}
453+
454+
public async Task RenderComponentAsync<TComponent>(ParameterView initialParameters)
455+
{
456+
var component = InstantiateComponent(typeof(TComponent));
457+
var componentId = AssignRootComponentId(component);
458+
await RenderRootComponentAsync(componentId, initialParameters);
459+
}
460+
}
461+
475462
private class TestComponent : IComponent, IHandleAfterRender
476463
{
477464
private RenderHandle _renderHandle;

0 commit comments

Comments
 (0)