Fix diffing when "bind" is combined with conditional attribute. Fixes #624

This commit is contained in:
Steve Sanderson 2018-04-20 17:35:55 +01:00
parent d0e09a066c
commit 9f589b71df
2 changed files with 58 additions and 2 deletions

View File

@ -179,8 +179,8 @@ namespace Microsoft.AspNetCore.Blazor.RenderTree
// These two attributes have the same sequence and name. Keep merging.
AppendDiffEntriesForAttributeFrame(ref diffContext, oldStartIndex, newStartIndex);
oldStartIndex = NextSiblingIndex(oldTree[oldStartIndex], oldStartIndex);
newStartIndex = NextSiblingIndex(newTree[newStartIndex], newStartIndex);
oldStartIndex++;
newStartIndex++;
hasMoreOld = oldEndIndexExcl > oldStartIndex;
hasMoreNew = newEndIndexExcl > newStartIndex;
}

View File

@ -919,6 +919,36 @@ namespace Microsoft.AspNetCore.Blazor.Test
});
}
[Fact]
public void CanCombineBindAndConditionalAttribute()
{
// This test represents https://github.com/aspnet/Blazor/issues/624
// Arrange: Rendered with textbox enabled
var renderer = new TestRenderer();
var component = new BindPlusConditionalAttributeComponent();
var componentId = renderer.AssignComponentId(component);
component.TriggerRender();
var checkboxChangeEventHandlerId = renderer.Batches.Single()
.ReferenceFrames
.First(frame => frame.FrameType == RenderTreeFrameType.Attribute && frame.AttributeEventHandlerId != 0)
.AttributeEventHandlerId;
// Act: Toggle the checkbox
var eventArgs = new UIChangeEventArgs { Value = true };
renderer.DispatchEvent(componentId, checkboxChangeEventHandlerId, eventArgs);
var latestBatch = renderer.Batches.Last();
var latestDiff = latestBatch.DiffsInOrder.Single();
var referenceFrames = latestBatch.ReferenceFrames;
// Assert: Textbox's "disabled" attribute was removed
Assert.Equal(2, renderer.Batches.Count);
Assert.Equal(componentId, latestDiff.ComponentId);
Assert.Contains(latestDiff.Edits, edit =>
edit.SiblingIndex == 1
&& edit.RemovedAttributeName == "disabled");
}
private class NoOpRenderer : Renderer
{
public NoOpRenderer() : base(new TestServiceProvider())
@ -1113,5 +1143,31 @@ namespace Microsoft.AspNetCore.Blazor.Test
}
}
}
private class BindPlusConditionalAttributeComponent : AutoRenderComponent, IHandleEvent
{
public bool CheckboxEnabled;
public string SomeStringProperty;
public void HandleEvent(UIEventHandler handler, UIEventArgs args)
{
handler(args);
TriggerRender();
}
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.OpenElement(0, "input");
builder.AddAttribute(1, "type", "checkbox");
builder.AddAttribute(2, "value", BindMethods.GetValue(CheckboxEnabled));
builder.AddAttribute(3, "onchange", BindMethods.SetValueHandler(__value => CheckboxEnabled = __value, CheckboxEnabled));
builder.CloseElement();
builder.OpenElement(4, "input");
builder.AddAttribute(5, "value", BindMethods.GetValue(SomeStringProperty));
builder.AddAttribute(6, "onchange", BindMethods.SetValueHandler(__value => SomeStringProperty = __value, SomeStringProperty));
builder.AddAttribute(7, "disabled", !CheckboxEnabled);
builder.CloseElement();
}
}
}
}