Begin differentiating between rendering as a new batch on in an existing batch (even though batches don't exist yet)

This commit is contained in:
Steve Sanderson 2018-01-29 16:47:52 +00:00
parent 7799c36d50
commit 27d0ce4da9
5 changed files with 41 additions and 34 deletions

View File

@ -35,8 +35,8 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
internal void DispatchBrowserEvent(int componentId, int renderTreeIndex, UIEventArgs eventArgs) internal void DispatchBrowserEvent(int componentId, int renderTreeIndex, UIEventArgs eventArgs)
=> DispatchEvent(componentId, renderTreeIndex, eventArgs); => DispatchEvent(componentId, renderTreeIndex, eventArgs);
internal void RenderComponentInternal(int componentId) internal void RenderNewBatchInternal(int componentId)
=> RenderComponent(componentId); => RenderNewBatch(componentId);
/// <summary> /// <summary>
/// Associates the <see cref="IComponent"/> with the <see cref="BrowserRenderer"/>, /// Associates the <see cref="IComponent"/> with the <see cref="BrowserRenderer"/>,
@ -54,7 +54,7 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
componentId); componentId);
_rootComponents.Add(component); _rootComponents.Add(component);
RenderComponent(componentId); RenderNewBatch(componentId);
} }
/// <summary> /// <summary>

View File

@ -35,7 +35,7 @@ namespace Microsoft.AspNetCore.Blazor.Browser.Rendering
string componentId) string componentId)
{ {
var browserRenderer = BrowserRendererRegistry.Find(int.Parse(browserRendererId)); var browserRenderer = BrowserRendererRegistry.Find(int.Parse(browserRendererId));
browserRenderer.RenderComponentInternal( browserRenderer.RenderNewBatchInternal(
int.Parse(componentId)); int.Parse(componentId));
} }

View File

@ -260,7 +260,7 @@ namespace Microsoft.AspNetCore.Blazor.RenderTree
{ {
// TODO: Instead, call some OnPropertiesUpdated method on IComponent, // TODO: Instead, call some OnPropertiesUpdated method on IComponent,
// whose default implementation causes itself to be rerendered // whose default implementation causes itself to be rerendered
_renderer.RenderComponent(componentId); _renderer.RenderInExistingBatch(componentId);
} }
} }

View File

@ -55,8 +55,15 @@ namespace Microsoft.AspNetCore.Blazor.Rendering
/// Updates the rendered state of the specified <see cref="IComponent"/>. /// Updates the rendered state of the specified <see cref="IComponent"/>.
/// </summary> /// </summary>
/// <param name="componentId">The identifier of the <see cref="IComponent"/> to render.</param> /// <param name="componentId">The identifier of the <see cref="IComponent"/> to render.</param>
protected internal void RenderComponent(int componentId) protected internal void RenderNewBatch(int componentId)
=> GetRequiredComponentState(componentId).Render(); {
RenderInExistingBatch(componentId);
}
internal void RenderInExistingBatch(int componentId)
{
GetRequiredComponentState(componentId).Render();
}
/// <summary> /// <summary>
/// Notifies the specified component that an event has occurred. /// Notifies the specified component that an event has occurred.

View File

@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act // Act
var componentId = renderer.AssignComponentId(component); var componentId = renderer.AssignComponentId(component);
renderer.RenderComponent(componentId); renderer.RenderNewBatch(componentId);
// Assert // Assert
Assert.Collection(renderer.RenderTreesByComponentId[componentId], Assert.Collection(renderer.RenderTreesByComponentId[componentId],
@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act/Assert // Act/Assert
var componentId = renderer.AssignComponentId(component); var componentId = renderer.AssignComponentId(component);
renderer.RenderComponent(componentId); renderer.RenderNewBatch(componentId);
var componentNode = renderer.RenderTreesByComponentId[componentId] var componentNode = renderer.RenderTreesByComponentId[componentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component); .Single(node => node.NodeType == RenderTreeNodeType.Component);
var nestedComponentId = componentNode.ComponentId; var nestedComponentId = componentNode.ComponentId;
@ -63,7 +63,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
Assert.False(renderer.RenderTreesByComponentId.ContainsKey(nestedComponentId)); Assert.False(renderer.RenderTreesByComponentId.ContainsKey(nestedComponentId));
// It can be rendered // It can be rendered
renderer.RenderComponent(nestedComponentId); renderer.RenderNewBatch(nestedComponentId);
Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId], Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId],
node => AssertNode.Text(node, "Nested component output")); node => AssertNode.Text(node, "Nested component output"));
} }
@ -77,13 +77,13 @@ namespace Microsoft.AspNetCore.Blazor.Test
var componentId = renderer.AssignComponentId(component); var componentId = renderer.AssignComponentId(component);
// Act/Assert: first render // Act/Assert: first render
renderer.RenderComponent(componentId); renderer.RenderNewBatch(componentId);
Assert.Collection(renderer.RenderTreesByComponentId[componentId], Assert.Collection(renderer.RenderTreesByComponentId[componentId],
node => AssertNode.Text(node, "Initial message")); node => AssertNode.Text(node, "Initial message"));
// Act/Assert: second render // Act/Assert: second render
component.Message = "Modified message"; component.Message = "Modified message";
renderer.RenderComponent(componentId); renderer.RenderNewBatch(componentId);
Assert.Collection(renderer.RenderTreesByComponentId[componentId], Assert.Collection(renderer.RenderTreesByComponentId[componentId],
node => AssertNode.Text(node, "Modified message")); node => AssertNode.Text(node, "Modified message"));
} }
@ -99,7 +99,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
builder.CloseElement(); builder.CloseElement();
}); });
var parentComponentId = renderer.AssignComponentId(parentComponent); var parentComponentId = renderer.AssignComponentId(parentComponent);
renderer.RenderComponent(parentComponentId); renderer.RenderNewBatch(parentComponentId);
var nestedComponentNode = renderer.RenderTreesByComponentId[parentComponentId] var nestedComponentNode = renderer.RenderTreesByComponentId[parentComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component); .Single(node => node.NodeType == RenderTreeNodeType.Component);
var nestedComponent = (MessageComponent)nestedComponentNode.Component; var nestedComponent = (MessageComponent)nestedComponentNode.Component;
@ -107,13 +107,13 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act/Assert: inital render // Act/Assert: inital render
nestedComponent.Message = "Render 1"; nestedComponent.Message = "Render 1";
renderer.RenderComponent(nestedComponentId); renderer.RenderNewBatch(nestedComponentId);
Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId], Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId],
node => AssertNode.Text(node, "Render 1")); node => AssertNode.Text(node, "Render 1"));
// Act/Assert: re-render // Act/Assert: re-render
nestedComponent.Message = "Render 2"; nestedComponent.Message = "Render 2";
renderer.RenderComponent(nestedComponentId); renderer.RenderNewBatch(nestedComponentId);
Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId], Assert.Collection(renderer.RenderTreesByComponentId[nestedComponentId],
node => AssertNode.Text(node, "Render 2")); node => AssertNode.Text(node, "Render 2"));
} }
@ -130,7 +130,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
Handler = args => { receivedArgs = args; } Handler = args => { receivedArgs = args; }
}; };
var componentId = renderer.AssignComponentId(component); var componentId = renderer.AssignComponentId(component);
renderer.RenderComponent(componentId); renderer.RenderNewBatch(componentId);
var (eventHandlerNodeIndex, _) = FirstWithIndex( var (eventHandlerNodeIndex, _) = FirstWithIndex(
renderer.RenderTreesByComponentId[componentId], renderer.RenderTreesByComponentId[componentId],
@ -158,7 +158,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
builder.CloseElement(); builder.CloseElement();
}); });
var parentComponentId = renderer.AssignComponentId(parentComponent); var parentComponentId = renderer.AssignComponentId(parentComponent);
renderer.RenderComponent(parentComponentId); renderer.RenderNewBatch(parentComponentId);
// Arrange: Render nested component // Arrange: Render nested component
var nestedComponentNode = renderer.RenderTreesByComponentId[parentComponentId] var nestedComponentNode = renderer.RenderTreesByComponentId[parentComponentId]
@ -166,7 +166,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
var nestedComponent = (EventComponent)nestedComponentNode.Component; var nestedComponent = (EventComponent)nestedComponentNode.Component;
nestedComponent.Handler = args => { receivedArgs = args; }; nestedComponent.Handler = args => { receivedArgs = args; };
var nestedComponentId = nestedComponentNode.ComponentId; var nestedComponentId = nestedComponentNode.ComponentId;
renderer.RenderComponent(nestedComponentId); renderer.RenderNewBatch(nestedComponentId);
// Find nested component's event handler ndoe // Find nested component's event handler ndoe
var (eventHandlerNodeIndex, _) = FirstWithIndex( var (eventHandlerNodeIndex, _) = FirstWithIndex(
@ -191,7 +191,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act/Assert // Act/Assert
Assert.Throws<ArgumentException>(() => Assert.Throws<ArgumentException>(() =>
{ {
renderer.RenderComponent(123); renderer.RenderNewBatch(123);
}); });
} }
@ -220,12 +220,12 @@ namespace Microsoft.AspNetCore.Blazor.Test
var renderer2ComponentId = renderer2.AssignComponentId(component); var renderer2ComponentId = renderer2.AssignComponentId(component);
// Act/Assert: Render component in renderer1 // Act/Assert: Render component in renderer1
renderer1.RenderComponent(renderer1ComponentId); renderer1.RenderNewBatch(renderer1ComponentId);
Assert.True(renderer1.RenderTreesByComponentId.ContainsKey(renderer1ComponentId)); Assert.True(renderer1.RenderTreesByComponentId.ContainsKey(renderer1ComponentId));
Assert.False(renderer2.RenderTreesByComponentId.ContainsKey(renderer2ComponentId)); Assert.False(renderer2.RenderTreesByComponentId.ContainsKey(renderer2ComponentId));
// Act/Assert: Render same component in renderer2 // Act/Assert: Render same component in renderer2
renderer2.RenderComponent(renderer2ComponentId); renderer2.RenderNewBatch(renderer2ComponentId);
Assert.True(renderer2.RenderTreesByComponentId.ContainsKey(renderer2ComponentId)); Assert.True(renderer2.RenderTreesByComponentId.ContainsKey(renderer2ComponentId));
} }
@ -271,7 +271,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Assert // Assert
Assert.ThrowsAny<Exception>(() => Assert.ThrowsAny<Exception>(() =>
{ {
renderer.RenderComponent(componentId); renderer.RenderNewBatch(componentId);
}); });
} }
@ -295,7 +295,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
GC.Collect(); GC.Collect();
GC.WaitForPendingFinalizers(); GC.WaitForPendingFinalizers();
renderer.RenderComponent(componentId); renderer.RenderNewBatch(componentId);
// Assert // Assert
Assert.True(didRender); Assert.True(didRender);
@ -315,7 +315,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
}); });
var rootComponentId = renderer.AssignComponentId(component); var rootComponentId = renderer.AssignComponentId(component);
renderer.RenderComponent(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var nestedComponentInstance = (MessageComponent)renderer.RenderTreesByComponentId[rootComponentId] var nestedComponentInstance = (MessageComponent)renderer.RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
@ -323,7 +323,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act: Second render // Act: Second render
message = "Modified message"; message = "Modified message";
renderer.RenderComponent(rootComponentId); renderer.RenderNewBatch(rootComponentId);
// Assert // Assert
Assert.Collection(renderer.RenderTreesByComponentId[rootComponentId], Assert.Collection(renderer.RenderTreesByComponentId[rootComponentId],
@ -348,7 +348,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
}); });
var rootComponentId = renderer.AssignComponentId(component); var rootComponentId = renderer.AssignComponentId(component);
renderer.RenderComponent(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var originalComponentInstance = (FakeComponent)renderer.RenderTreesByComponentId[rootComponentId] var originalComponentInstance = (FakeComponent)renderer.RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
@ -361,7 +361,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
// Act: Second render // Act: Second render
firstRender = false; firstRender = false;
renderer.RenderComponent(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var updatedComponentInstance = (FakeComponent)renderer.RenderTreesByComponentId[rootComponentId] var updatedComponentInstance = (FakeComponent)renderer.RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
@ -388,7 +388,7 @@ namespace Microsoft.AspNetCore.Blazor.Test
}); });
var rootComponentId = renderer.AssignComponentId(component); var rootComponentId = renderer.AssignComponentId(component);
renderer.RenderComponent(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var childComponentId = renderer.RenderTreesByComponentId[rootComponentId] var childComponentId = renderer.RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component) .Single(node => node.NodeType == RenderTreeNodeType.Component)
@ -396,11 +396,11 @@ namespace Microsoft.AspNetCore.Blazor.Test
// This isn't strictly necessary for the test, but it's more common for components // This isn't strictly necessary for the test, but it's more common for components
// to be updated after their first render than before it // to be updated after their first render than before it
renderer.RenderComponent(childComponentId); renderer.RenderNewBatch(childComponentId);
// Act: Second render // Act: Second render
firstRender = false; firstRender = false;
renderer.RenderComponent(rootComponentId); renderer.RenderNewBatch(rootComponentId);
var updatedComponentNode = renderer.RenderTreesByComponentId[rootComponentId] var updatedComponentNode = renderer.RenderTreesByComponentId[rootComponentId]
.Single(node => node.NodeType == RenderTreeNodeType.Component); .Single(node => node.NodeType == RenderTreeNodeType.Component);
@ -415,8 +415,8 @@ namespace Microsoft.AspNetCore.Blazor.Test
public new int AssignComponentId(IComponent component) public new int AssignComponentId(IComponent component)
=> base.AssignComponentId(component); => base.AssignComponentId(component);
public new void RenderComponent(int componentId) public new void RenderNewBatch(int componentId)
=> base.RenderComponent(componentId); => base.RenderNewBatch(componentId);
protected internal override void UpdateDisplay(int componentId, RenderTreeDiff renderTreeDiff) protected internal override void UpdateDisplay(int componentId, RenderTreeDiff renderTreeDiff)
{ {
@ -431,8 +431,8 @@ namespace Microsoft.AspNetCore.Blazor.Test
public new int AssignComponentId(IComponent component) public new int AssignComponentId(IComponent component)
=> base.AssignComponentId(component); => base.AssignComponentId(component);
public new void RenderComponent(int componentId) public new void RenderNewBatch(int componentId)
=> base.RenderComponent(componentId); => base.RenderNewBatch(componentId);
public new void DispatchEvent(int componentId, int renderTreeIndex, UIEventArgs args) public new void DispatchEvent(int componentId, int renderTreeIndex, UIEventArgs args)
=> base.DispatchEvent(componentId, renderTreeIndex, args); => base.DispatchEvent(componentId, renderTreeIndex, args);