diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2017-05-16 11:27:41 -0600 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2017-05-16 11:50:17 -0700 |
commit | e1734092bec06d5e013144f13c947c040586cec8 (patch) | |
tree | cb523df2f2c0e490847222f1e5a0afa84acb67cb | |
parent | bb632ea0666d22f23c6f48264800ddf32aeaf25f (diff) | |
download | xamarin-forms-e1734092bec06d5e013144f13c947c040586cec8.tar.gz xamarin-forms-e1734092bec06d5e013144f13c947c040586cec8.tar.bz2 xamarin-forms-e1734092bec06d5e013144f13c947c040586cec8.zip |
Remove VisualElement finalizer (#918)
* [Controls] Add repo for bugzilla 55365
* Remove finalizer from VisualElement
* Remove unused using directive
* Removing test for 44074
* Update docs
5 files changed, 91 insertions, 66 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla55365.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla55365.cs new file mode 100644 index 00000000..1ab99a2e --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla55365.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; +#if UITEST +using NUnit.Framework; + +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 55365, "~VisualElement crashes with System.Runtime.InteropServices.COMException", PlatformAffected.UWP)] + public class Bugzilla55365 : TestContentPage + { + readonly StackLayout _itemsPanel = new StackLayout(); + readonly DataTemplate _itemTemplate = new DataTemplate(CreateBoxView); + readonly StackLayout _layout = new StackLayout(); + +#if UITEST + [Test] + public void ForcingGCDoesNotCrash() + { + RunningApp.WaitForElement("Clear"); + RunningApp.Tap("Clear"); + RunningApp.Tap("Garbage"); + RunningApp.WaitForElement("Success"); + } +#endif + + protected override void Init() + { + var viewModel = new ObservableCollection<_55365Item> + { + new _55365Item { Subject = 65 } + }; + + viewModel.CollectionChanged += OnCollectionChanged; + + _itemsPanel.BindingContext = viewModel; + + foreach (_55365Item item in viewModel) + { + _itemTemplate.SetValue(BindingContextProperty, item); + var view = (View)_itemTemplate.CreateContent(); + _itemsPanel.Children.Add(view); + } + + var clearButton = new Button { Text = "Clear", Command = new Command(o => viewModel.Clear()) }; + _layout.Children.Add(clearButton); + + var collectButton = new Button { Text = "Garbage", Command = new Command(o => + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + _layout.Children.Add(new Label {Text = "Success"}); + }) }; + _layout.Children.Add(collectButton); + _layout.Children.Add(_itemsPanel); + + Content = _layout; + } + + static object CreateBoxView() + { + var boxView1 = new BoxView { HeightRequest = 100, Color = new Color(0.55, 0.23, 0.147) }; + var setter1 = new Setter { Property = BoxView.ColorProperty, Value = "#FF2879DD" }; + var trigger1 = new DataTrigger(typeof(BoxView)) { Binding = new Binding("Subject"), Value = 65 }; + trigger1.Setters.Add(setter1); + boxView1.Triggers.Add(trigger1); + return boxView1; + } + + void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Reset) + { + // reset the list + _itemsPanel.Children.Clear(); + } + } + + [Preserve(AllMembers = true)] + public class _55365Item + { + public int Subject { get; set; } + } + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index f602ef65..0d808d27 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -279,6 +279,7 @@ <Compile Include="$(MSBuildThisFileDirectory)Bugzilla53909.cs" /> <Compile Include="$(MSBuildThisFileDirectory)ListViewNRE.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla55745.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Bugzilla55365.cs" /> <Compile Include="$(MSBuildThisFileDirectory)_Template.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Issue1028.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Issue1075.cs" /> diff --git a/Xamarin.Forms.Core.UnitTests/BehaviorTest.cs b/Xamarin.Forms.Core.UnitTests/BehaviorTest.cs index 90217389..464f9731 100644 --- a/Xamarin.Forms.Core.UnitTests/BehaviorTest.cs +++ b/Xamarin.Forms.Core.UnitTests/BehaviorTest.cs @@ -109,42 +109,5 @@ namespace Xamarin.Forms.Core.UnitTests collection.Remove (behavior); Assert.Null (behavior.AssociatedObject); } - - [Test] - //https://bugzilla.xamarin.com/show_bug.cgi?id=44074 - public void TestBehaviorsAreDetachedBeforeGarbageCollection() - { - WeakReference weakBindable = null; - - var attachCount = MockBehavior<VisualElement>.AttachCount; - - int i = 0; - Action create = null; - create = () => - { - if (i++ < 1024) - { - create(); - return; - } - - var bindable = new MockBindable - { - Behaviors = { - new MockBehavior<VisualElement> () - } - }; - weakBindable = new WeakReference(bindable); - }; - - create(); - - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); - - Assert.False(weakBindable.IsAlive); - Assert.AreEqual(attachCount, MockBehavior<VisualElement>.AttachCount); - } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Core/VisualElement.cs b/Xamarin.Forms.Core/VisualElement.cs index 8aba78ac..520b06b1 100644 --- a/Xamarin.Forms.Core/VisualElement.cs +++ b/Xamarin.Forms.Core/VisualElement.cs @@ -796,18 +796,5 @@ namespace Xamarin.Forms public bool Result { get; set; } } - - ~VisualElement() - { - if (!GetIsDefault(BehaviorsProperty)) { - var behaviors = GetValue(BehaviorsProperty) as AttachedCollection<Behavior>; - behaviors.DetachFrom(this); - } - - if (!GetIsDefault(TriggersProperty)) { - var triggers = GetValue(TriggersProperty) as AttachedCollection<TriggerBase>; - triggers.DetachFrom(this); - } - } } }
\ No newline at end of file diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/VisualElement.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/VisualElement.xml index b5d1f8b9..0a116832 100644 --- a/docs/Xamarin.Forms.Core/Xamarin.Forms/VisualElement.xml +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/VisualElement.xml @@ -352,22 +352,6 @@ <remarks>To be added.</remarks> </Docs> </Member> - <Member MemberName="Finalize"> - <MemberSignature Language="C#" Value="~VisualElement ();" /> - <MemberSignature Language="ILAsm" Value=".method familyhidebysig virtual instance void Finalize() cil managed" /> - <MemberType>Method</MemberType> - <AssemblyInfo> - <AssemblyVersion>2.0.0.0</AssemblyVersion> - </AssemblyInfo> - <ReturnValue> - <ReturnType>System.Void</ReturnType> - </ReturnValue> - <Parameters /> - <Docs> - <summary>Finalizer for visual elements.</summary> - <remarks>To be added.</remarks> - </Docs> - </Member> <Member MemberName="Focus"> <MemberSignature Language="C#" Value="public bool Focus ();" /> <MemberSignature Language="ILAsm" Value=".method public hidebysig instance bool Focus() cil managed" /> |