diff options
Diffstat (limited to 'Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs')
-rw-r--r-- | Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs new file mode 100644 index 00000000..95c0b30c --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla33612.cs @@ -0,0 +1,159 @@ +using System; +using System.Linq; +using Xamarin.Forms.CustomAttributes; + +#if UITEST +using NUnit.Framework; +using Xamarin.UITest; +#endif + +namespace Xamarin.Forms.Controls +{ + [Preserve (AllMembers = true)] + [Issue (IssueTracker.Bugzilla, 33612, + "(A) Removing a page from the navigation stack causes an 'Object reference' exception in Android only", + PlatformAffected.Android)] + public class Bugzilla33612 : TestNavigationPage + { + class Page1 : ContentPage + { + public Page1() + { + var button = new Button { Text = "Go To Page 2" }; + button.Clicked += (sender, args) => Navigation.PushAsync(new Page2()); + + Content = new StackLayout() + { + Children = { + new Label { Text = "This is Page 1 - the root page" }, + button + } + }; + } + } + + class FakePage : ContentPage + { + public FakePage() + { + Content = new StackLayout() + { + Children = { + new Label { Text = "This is a fake page. It will never show up." } + } + }; + } + } + + class Page2 : ContentPage + { + public Page2() + { + var button = new Button { Text = "Go to Page 3" }; + button.Clicked += async (sender, args) => + { + int numPagesToRemove = Navigation.NavigationStack.Count; + + Page3 page3 = new Page3(); + await Navigation.PushAsync(page3); + + var fake = new FakePage(); + Navigation.InsertPageBefore(fake, page3); + + // Remove all the previous pages on the stack (i.e., Page 1) + // This should work fine + for (int i = 0; i < numPagesToRemove; i++) + { + Page p = Navigation.NavigationStack.ElementAt(0); + Navigation.RemovePage(p); + } + }; + + Content = new StackLayout() + { + Children = { + new Label { Text = "This is Page 2" }, + button + } + }; + } + } + + class SuccessPage : ContentPage + { + public SuccessPage() + { + Content = new StackLayout() + { + Children = { + new Label { Text = "If you're seeing this, nothing crashed. Yay!" } + } + }; + } + } + + class Page3 : ContentPage + { + public Page3() + { + var button = new Button { AutomationId = "btn", Text = "Return To Page 2" }; + button.Clicked += (sender, args) => + { + int numPagesToRemove = Navigation.NavigationStack.Count; + + // Remove all the previous pages on the stack + // Originally this would fail (and crash the app), because FakePage + // was never actually run through SwitchContentAsync + // which means that it never had its renderer set. + // But now it should work just fine + for (int i = 0; i < numPagesToRemove - 1; i++) + { + Page p = Navigation.NavigationStack.ElementAt(0); + Navigation.RemovePage(p); + } + + var success = new SuccessPage(); + Navigation.PushAsync(success); + }; + + Content = new StackLayout() + { + Children = { + new Label { Text = "This is Page 3" }, + button + } + }; + } + } + + protected override void Init () + { + var page1 = new Page1 (); + + PushAsync (page1); + } + +#if UITEST + [Test] + [UiTest (typeof(NavigationPage))] + public void Issue33612RemovePagesWithoutRenderers () + { + RunningApp.WaitForElement (q => q.Marked ("Go To Page 2")); + RunningApp.Tap (q => q.Marked("Go To Page 2")); + + RunningApp.WaitForElement (q => q.Marked("This is Page 2")); + RunningApp.Screenshot ("At Page 2"); + RunningApp.Tap (q => q.Marked("Go to Page 3")); + + RunningApp.WaitForElement ("This is Page 3"); + RunningApp.WaitForElement (q => q.Marked ("Return To Page 2"), + timeout: TimeSpan.FromSeconds (15)); + RunningApp.Screenshot("At Page 3"); + RunningApp.Tap (q => q.Marked("Return To Page 2")); + + RunningApp.WaitForElement ("If you're seeing this, nothing crashed. Yay!"); + RunningApp.Screenshot ("Success Page"); + } +#endif + } +}
\ No newline at end of file |