summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls.Issues
diff options
context:
space:
mode:
authorE.Z. Hart <hartez@users.noreply.github.com>2016-10-04 11:47:02 -0600
committerRui Marinho <me@ruimarinho.net>2016-10-04 18:47:02 +0100
commitd178a458ee1cdae63e1ffaf6f5445000f7b9cd0e (patch)
treeadee2c88cec80075e405220305de1a6618202c3a /Xamarin.Forms.Controls.Issues
parentc83c19f106162ca55ab57dfea3693246ec6155fa (diff)
downloadxamarin-forms-d178a458ee1cdae63e1ffaf6f5445000f7b9cd0e.tar.gz
xamarin-forms-d178a458ee1cdae63e1ffaf6f5445000f7b9cd0e.tar.bz2
xamarin-forms-d178a458ee1cdae63e1ffaf6f5445000f7b9cd0e.zip
Unhook drawer listeners so MDP renderer and pages can be collected (#412)
Null out page in custom MDP renderer in Control Gallery so it can be collected Checkpoint Checkpoint Checkpoint Checkpoint Checkpoint Checkpoint
Diffstat (limited to 'Xamarin.Forms.Controls.Issues')
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla44166.cs206
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems1
2 files changed, 207 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla44166.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla44166.cs
new file mode 100644
index 00000000..4006faa4
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla44166.cs
@@ -0,0 +1,206 @@
+using System;
+using System.Diagnostics;
+using System.Threading;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 44166, "MasterDetailPage instances do not get disposed upon GC")]
+ public class Bugzilla44166 : TestContentPage
+ {
+ protected override void Init()
+ {
+ var label = new Label() { Text = "Testing..." };
+
+ var goButton = new Button { Text = "Go" };
+ goButton.Clicked += (sender, args) => Application.Current.MainPage = new _44166MDP();
+
+ var gcButton = new Button { Text = "GC" };
+ gcButton.Clicked += (sender, args) =>
+ {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if (_44166MDP.Counter > 0)
+ {
+ Debug.WriteLine($">>>>>>>> Post-GC, {_44166MDP.Counter} {nameof(_44166MDP)} allocated");
+ }
+
+ if (_44166Master.Counter > 0)
+ {
+ Debug.WriteLine($">>>>>>>> Post-GC, {_44166Master.Counter} {nameof(_44166Master)} allocated");
+ }
+
+ if (_44166Detail.Counter > 0)
+ {
+ Debug.WriteLine($">>>>>>>> Post-GC, {_44166Detail.Counter} {nameof(_44166Detail)} allocated");
+ }
+
+ if (_44166NavContent.Counter > 0)
+ {
+ Debug.WriteLine($">>>>>>>> Post-GC, {_44166NavContent.Counter} {nameof(_44166NavContent)} allocated");
+ }
+
+ if (_44166NavContent.Counter + _44166Detail.Counter + _44166Master.Counter + _44166MDP.Counter == 0)
+ {
+ label.Text = "Success";
+ }
+ };
+
+ Content = new StackLayout
+ {
+ Children = { label, goButton, gcButton }
+ };
+ }
+
+ #if UITEST
+ [Test]
+ public void Bugzilla44166Test()
+ {
+ RunningApp.WaitForElement(q => q.Marked("Go"));
+ RunningApp.Tap(q => q.Marked("Go"));
+
+ RunningApp.WaitForElement(q => q.Marked("Back"));
+ RunningApp.Tap(q => q.Marked("Back"));
+
+ for(int n = 0; n < 10; n++)
+ {
+ RunningApp.WaitForElement(q => q.Marked("GC"));
+ RunningApp.Tap(q => q.Marked("GC"));
+
+ if (RunningApp.Query(q => q.Marked("Success")).Length > 0)
+ {
+ return;
+ }
+ }
+
+ var pageStats = string.Empty;
+
+ if (_44166MDP.Counter > 0)
+ {
+ pageStats += $"{_44166MDP.Counter} {nameof(_44166MDP)} allocated; ";
+ }
+
+ if (_44166Master.Counter > 0)
+ {
+ pageStats += $"{_44166Master.Counter} {nameof(_44166Master)} allocated; ";
+ }
+
+ if (_44166Detail.Counter > 0)
+ {
+ pageStats += $"{_44166Detail.Counter} {nameof(_44166Detail)} allocated; ";
+ }
+
+ if (_44166NavContent.Counter > 0)
+ {
+ pageStats += $"{_44166NavContent.Counter} {nameof(_44166NavContent)} allocated; ";
+ }
+
+ Assert.Fail($"At least one of the pages was not collected: {pageStats}");
+ }
+ #endif
+ }
+
+ [Preserve(AllMembers = true)]
+ public class _44166MDP : MasterDetailPage
+ {
+ public static int Counter;
+
+ public _44166MDP()
+ {
+ Interlocked.Increment(ref Counter);
+ Debug.WriteLine($"++++++++ {nameof(_44166MDP)} constructor, {Counter} allocated");
+
+ Master = new _44166Master();
+ Detail = new _44166Detail();
+ }
+
+ ~_44166MDP()
+ {
+ Interlocked.Decrement(ref Counter);
+ Debug.WriteLine($"-------- {nameof(_44166MDP)} destructor, {Counter} allocated");
+ }
+ }
+
+ [Preserve(AllMembers = true)]
+ public class _44166Master : ContentPage
+ {
+ public static int Counter;
+
+ public _44166Master()
+ {
+ Interlocked.Increment(ref Counter);
+ Debug.WriteLine($"++++++++ {nameof(_44166Master)} constructor, {Counter} allocated");
+
+ Title = "Master";
+ var goButton = new Button { Text = "Back" };
+ goButton.Clicked += (sender, args) => Application.Current.MainPage = new Bugzilla44166();
+
+ Content = new StackLayout
+ {
+ Children = { goButton }
+ };
+ }
+
+ ~_44166Master()
+ {
+ Interlocked.Decrement(ref Counter);
+ Debug.WriteLine($"-------- {nameof(_44166Master)} destructor, {Counter} allocated");
+ }
+ }
+
+ [Preserve(AllMembers = true)]
+ public class _44166Detail : NavigationPage
+ {
+ public static int Counter;
+
+ public _44166Detail()
+ {
+ Interlocked.Increment(ref Counter);
+ Debug.WriteLine($"++++++++ {nameof(_44166Detail)} constructor, {Counter} allocated");
+
+ Title = "Detail";
+ PushAsync(new _44166NavContent());
+ }
+
+ ~_44166Detail()
+ {
+ Interlocked.Decrement(ref Counter);
+ Debug.WriteLine($"-------- {nameof(_44166Detail)} destructor, {Counter} allocated");
+ }
+ }
+
+ [Preserve(AllMembers = true)]
+ public class _44166NavContent : ContentPage
+ {
+ public static int Counter;
+
+ public _44166NavContent ()
+ {
+ Interlocked.Increment(ref Counter);
+ Debug.WriteLine($"++++++++ {nameof(_44166NavContent)} constructor, {Counter} allocated");
+
+ var goButton = new Button { Text = "Back" };
+ goButton.Clicked += (sender, args) => Application.Current.MainPage = new Bugzilla44166();
+
+ Content = new StackLayout
+ {
+ Children = { goButton }
+ };
+ }
+
+ ~_44166NavContent ()
+ {
+ Interlocked.Decrement(ref Counter);
+ Debug.WriteLine($"-------- {nameof(_44166NavContent)} destructor, {Counter} allocated");
+ }
+ }
+} \ 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 eb9424b6..51171be2 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
@@ -125,6 +125,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla42364.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla42519.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla43516.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)Bugzilla44166.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CarouselAsync.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla34561.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla34727.cs" />