Skip to content

Commit e2db47c

Browse files
[Blazor] Invoke inbound activity handlers on circuit initialization (#57557)
1 parent 2152f3b commit e2db47c

File tree

6 files changed

+39
-38
lines changed

6 files changed

+39
-38
lines changed

src/Components/Server/src/Circuits/CircuitHost.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public Task InitializeAsync(ProtectedPrerenderComponentApplicationStore store, C
104104
{
105105
Log.InitializationStarted(_logger);
106106

107-
return Renderer.Dispatcher.InvokeAsync(async () =>
107+
return HandleInboundActivityAsync(() => Renderer.Dispatcher.InvokeAsync(async () =>
108108
{
109109
if (_initialized)
110110
{
@@ -165,7 +165,7 @@ public Task InitializeAsync(ProtectedPrerenderComponentApplicationStore store, C
165165
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
166166
await TryNotifyClientErrorAsync(Client, GetClientErrorMessage(ex), ex);
167167
}
168-
});
168+
}));
169169
}
170170

171171
// We handle errors in DisposeAsync because there's no real value in letting it propagate.

src/Components/test/E2ETest/ServerExecutionTests/CircuitContextTest.cs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,39 @@ public CircuitContextTest(
2222
{
2323
}
2424

25-
protected override void InitializeAsyncCore()
25+
[Fact]
26+
public void ComponentMethods_HaveCircuitContext()
2627
{
2728
Navigate(ServerPathBase);
2829
Browser.MountTestComponent<CircuitContextComponent>();
29-
Browser.Equal("Circuit Context", () => Browser.Exists(By.TagName("h1")).Text);
30+
TestCircuitContextCore(Browser);
3031
}
3132

3233
[Fact]
33-
public void ComponentMethods_HaveCircuitContext()
34+
public void ComponentMethods_HaveCircuitContext_OnInitialPageLoad()
3435
{
35-
Browser.Click(By.Id("trigger-click-event-button"));
36+
// https://github.com/dotnet/aspnetcore/issues/57481
37+
Navigate($"{ServerPathBase}?initial-component-type={typeof(CircuitContextComponent).AssemblyQualifiedName}");
38+
TestCircuitContextCore(Browser);
39+
}
40+
41+
// Internal for reuse in Blazor Web tests
42+
internal static void TestCircuitContextCore(IWebDriver browser)
43+
{
44+
browser.Equal("Circuit Context", () => browser.Exists(By.TagName("h1")).Text);
45+
46+
browser.Click(By.Id("trigger-click-event-button"));
3647

37-
Browser.True(() => HasCircuitContext("SetParametersAsync"));
38-
Browser.True(() => HasCircuitContext("OnInitializedAsync"));
39-
Browser.True(() => HasCircuitContext("OnParametersSetAsync"));
40-
Browser.True(() => HasCircuitContext("OnAfterRenderAsync"));
41-
Browser.True(() => HasCircuitContext("InvokeDotNet"));
42-
Browser.True(() => HasCircuitContext("OnClickEvent"));
48+
browser.True(() => HasCircuitContext("SetParametersAsync"));
49+
browser.True(() => HasCircuitContext("OnInitializedAsync"));
50+
browser.True(() => HasCircuitContext("OnParametersSetAsync"));
51+
browser.True(() => HasCircuitContext("OnAfterRenderAsync"));
52+
browser.True(() => HasCircuitContext("InvokeDotNet"));
53+
browser.True(() => HasCircuitContext("OnClickEvent"));
4354

4455
bool HasCircuitContext(string eventName)
4556
{
46-
var resultText = Browser.FindElement(By.Id($"circuit-context-result-{eventName}")).Text;
57+
var resultText = browser.FindElement(By.Id($"circuit-context-result-{eventName}")).Text;
4758
var result = bool.Parse(resultText);
4859
return result;
4960
}

src/Components/test/E2ETest/ServerRenderingTests/InteractivityTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Components.TestServer.RazorComponents;
55
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
66
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
7+
using Microsoft.AspNetCore.Components.E2ETests.ServerExecutionTests;
78
using Microsoft.AspNetCore.E2ETesting;
89
using OpenQA.Selenium;
910
using TestServer;
@@ -1142,8 +1143,7 @@ public void NavigationManagerCanRefreshSSRPageWhenServerInteractivityEnabled()
11421143
public void InteractiveServerRootComponent_CanAccessCircuitContext()
11431144
{
11441145
Navigate($"{ServerPathBase}/interactivity/circuit-context");
1145-
1146-
Browser.Equal("True", () => Browser.FindElement(By.Id("has-circuit-context")).Text);
1146+
CircuitContextTest.TestCircuitContextCore(Browser);
11471147
}
11481148

11491149
[Fact]

src/Components/test/testassets/BasicTestApp/Index.razor

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
@using Microsoft.AspNetCore.Components.Rendering
2+
@using System.Web
3+
@inject NavigationManager NavigationManager
24
<div id="test-selector">
35
Select test:
46
<select id="test-selector-select" @bind=SelectedComponentTypeName>
@@ -137,6 +139,15 @@
137139
Type SelectedComponentType
138140
=> SelectedComponentTypeName == "none" ? null : Type.GetType(SelectedComponentTypeName, throwOnError: true);
139141

142+
protected override void OnInitialized()
143+
{
144+
var uri = new Uri(NavigationManager.Uri);
145+
if (HttpUtility.ParseQueryString(uri.Query)["initial-component-type"] is { Length: > 0 } initialComponentTypeName)
146+
{
147+
SelectedComponentTypeName = initialComponentTypeName;
148+
}
149+
}
150+
140151
void RenderSelectedComponent(RenderTreeBuilder builder)
141152
{
142153
if (SelectedComponentType != null)

src/Components/test/testassets/Components.TestServer/RazorComponents/App.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
</script>
2626
<script src="_framework/blazor.web.js" autostart="false" suppress-error="BL9992"></script>
2727
<script src="_content/TestContentPackage/counterInterop.js"></script>
28+
<script src="js/circuitContextTest.js"></script>
2829
<script>
2930
// This is called by the Components.WasmMinimal project.
3031
function getQueryParam(key) {
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,3 @@
11
@page "/interactivity/circuit-context"
2-
@rendermode RenderMode.InteractiveServer
3-
@inject TestCircuitContextAccessor CircuitContextAccessor
42

5-
<h1>Circuit context</h1>
6-
7-
<p>
8-
Has circuit context: <span id="has-circuit-context">@_hasCircuitContext</span>
9-
</p>
10-
11-
@code {
12-
private bool _hasCircuitContext;
13-
14-
protected override async Task OnAfterRenderAsync(bool firstRender)
15-
{
16-
if (firstRender)
17-
{
18-
await Task.Yield();
19-
20-
_hasCircuitContext = CircuitContextAccessor.HasCircuitContext;
21-
22-
StateHasChanged();
23-
}
24-
}
25-
}
3+
<CircuitContextComponent @rendermode="RenderMode.InteractiveServer" />

0 commit comments

Comments
 (0)