summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorE.Z. Hart <hartez@users.noreply.github.com>2017-05-16 11:27:41 -0600
committerJason Smith <jason.smith@xamarin.com>2017-05-16 10:27:41 -0700
commitb3f6d80a1b0acdbd335c810b835e4597d94269b5 (patch)
tree9fb099958f73abfba7a263f3f3838a4f1efa4880
parentf01cf880403f649cf6d6ccc71d930eae646bc698 (diff)
downloadxamarin-forms-b3f6d80a1b0acdbd335c810b835e4597d94269b5.tar.gz
xamarin-forms-b3f6d80a1b0acdbd335c810b835e4597d94269b5.tar.bz2
xamarin-forms-b3f6d80a1b0acdbd335c810b835e4597d94269b5.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
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla55365.cs90
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems1
-rw-r--r--Xamarin.Forms.Core.UnitTests/BehaviorTest.cs37
-rw-r--r--Xamarin.Forms.Core/VisualElement.cs13
-rw-r--r--docs/Xamarin.Forms.Core/Xamarin.Forms/VisualElement.xml16
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 00b50301..1e63bab4 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
@@ -282,6 +282,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 73a1a466..6f337aa2 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" />