summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32206.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32206.cs')
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32206.cs142
1 files changed, 142 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32206.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32206.cs
new file mode 100644
index 00000000..428538f6
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla32206.cs
@@ -0,0 +1,142 @@
+using System;
+using System.Collections.Generic;
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+using System.Threading;
+
+#if UITEST
+using Xamarin.UITest;
+using NUnit.Framework;
+#endif
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 32206, "ContextActions cause memory leak: Page is never destroyed", PlatformAffected.iOS)]
+ public class Bugzilla32206 : TestNavigationPage
+ {
+ protected override void Init()
+ {
+ PushAsync(new LandingPage32206());
+ }
+
+#if UITEST && __IOS__
+ [Test]
+ public void Bugzilla32206Test()
+ {
+ for (var n = 0; n < 10; n++)
+ {
+ RunningApp.WaitForElement(q => q.Marked("Push"));
+ RunningApp.Tap(q => q.Marked("Push"));
+
+ RunningApp.WaitForElement(q => q.Marked("ListView"));
+ RunningApp.Back();
+ }
+
+ // At this point, the counter can be any value, but it's most likely not zero.
+ // Invoking GC once is enough to clean up all garbage data and set counter to zero
+ RunningApp.WaitForElement(q => q.Marked("GC"));
+ RunningApp.Tap(q => q.Marked("GC"));
+
+ RunningApp.WaitForElement(q => q.Marked("Counter: 0"));
+ }
+#endif
+ }
+
+ [Preserve(AllMembers = true)]
+ public class LandingPage32206 : ContentPage
+ {
+ public static int Counter;
+ public Label Label;
+
+ public LandingPage32206()
+ {
+ Label = new Label
+ {
+ Text = "Counter: " + Counter,
+ HorizontalTextAlignment = TextAlignment.Center,
+ VerticalTextAlignment = TextAlignment.Center
+ };
+
+ Content = new StackLayout
+ {
+ Orientation = StackOrientation.Vertical,
+ HorizontalOptions = LayoutOptions.Center,
+ VerticalOptions = LayoutOptions.Center,
+ Spacing = 15,
+ Children =
+ {
+ new Label
+ {
+ Text = "Click Push to show a ListView. When you hit the Back button, Counter will show the number of pages that have not been finalized yet."
+ + " If you click GC, the counter should be 0."
+ },
+ Label,
+ new Button
+ {
+ Text = "GC",
+ AutomationId = "GC",
+ Command = new Command(o =>
+ {
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+ GC.Collect();
+ Label.Text = "Counter: " + Counter;
+ })
+ },
+ new Button
+ {
+ Text = "Push",
+ AutomationId = "Push",
+ Command = new Command(async o =>
+ {
+ await Navigation.PushAsync(new ContentPage32206());
+ })
+ }
+ }
+ };
+ }
+
+ protected override void OnAppearing()
+ {
+ base.OnAppearing();
+
+ if (Label != null)
+ Label.Text = "Counter: " + Counter;
+ }
+ }
+
+ [Preserve(AllMembers = true)]
+ public class ContentPage32206 : ContentPage
+ {
+ public ContentPage32206()
+ {
+ Interlocked.Increment(ref LandingPage32206.Counter);
+ System.Diagnostics.Debug.WriteLine("Page: " + LandingPage32206.Counter);
+
+ Content = new ListView
+ {
+ ItemsSource = new List<string> { "Apple", "Banana", "Cherry" },
+ ItemTemplate = new DataTemplate(typeof(ViewCell32206)),
+ AutomationId = "ListView"
+ };
+ }
+
+ ~ContentPage32206()
+ {
+ Interlocked.Decrement(ref LandingPage32206.Counter);
+ System.Diagnostics.Debug.WriteLine("Page: " + LandingPage32206.Counter);
+ }
+ }
+
+ [Preserve(AllMembers = true)]
+ public class ViewCell32206 : ViewCell
+ {
+ public ViewCell32206()
+ {
+ View = new Label();
+ View.SetBinding(Label.TextProperty, ".");
+ ContextActions.Add(new MenuItem { Text = "Delete" });
+ }
+ }
+} \ No newline at end of file