[MacOS] Fixed NRE with modal navigation (#7900)
authorGerald Versluis <gerald.versluis@microsoft.com>
Fri, 18 Oct 2019 12:03:43 +0000 (14:03 +0200)
committerRui Marinho <me@ruimarinho.net>
Fri, 18 Oct 2019 12:03:43 +0000 (13:03 +0100)
* Added repro and fix

* Added UITest

Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7886.xaml [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7886.xaml.cs [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
Xamarin.Forms.Platform.iOS/VisualElementRenderer.cs

diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7886.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7886.xaml
new file mode 100644 (file)
index 0000000..71604d9
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<controls:TestContentPage xmlns:controls="clr-namespace:Xamarin.Forms.Controls" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+       x:Class="Xamarin.Forms.Controls.Issues.Issue7886" >
+       <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
+        <!-- Place new controls here -->
+        <Label Text="Open the modal by the button below, then pop the modal by the Done toolbaritem. If you are back on the first page without a crash, this test succeeded!" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
+        <Button AutomationId="{Binding ButtonAutomationId}" Text="Push Me" Clicked="Handle_Clicked" BackgroundColor="Aqua"/>
+    </StackLayout>
+</controls:TestContentPage>
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7886.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7886.xaml.cs
new file mode 100644 (file)
index 0000000..7437a32
--- /dev/null
@@ -0,0 +1,74 @@
+using System;
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+
+#if UITEST
+using NUnit.Framework;
+using Xamarin.UITest;
+using Xamarin.Forms.Core.UITests;
+#endif
+
+namespace Xamarin.Forms.Controls.Issues
+{
+       [Preserve(AllMembers = true)]
+       [Issue(IssueTracker.Github, 7886, "PushModalAsync modal page with Entry crashes on close for MacOS (NRE)", PlatformAffected.macOS)]
+       public partial class Issue7886 : TestContentPage
+       {
+
+               const string TriggerModalAutomationId = "TriggerModal";
+               const string PopModalAutomationId = "PopModal";
+
+               public string ButtonAutomationId { get => TriggerModalAutomationId; } 
+
+               protected override void Init()
+               {
+               }
+
+#if APP
+               public Issue7886()
+               {
+                       InitializeComponent();
+                       BindingContext = this;
+               }
+
+               void Handle_Clicked(object sender, EventArgs e)
+               {
+                       Navigation.PushModalAsync(new NavigationPage(new ModalPage()));
+               }
+
+               class ModalPage : ContentPage
+               {
+                       public ModalPage()
+                       {
+                               BackgroundColor = Color.Orange;
+
+                               var tbi = new ToolbarItem("Done", null, () => Navigation.PopModalAsync())
+                               {
+                                       AutomationId = PopModalAutomationId
+                               };
+
+                               ToolbarItems.Add(tbi);
+
+                               Content = new Entry
+                               {
+                                       HorizontalOptions = LayoutOptions.Center,
+                                       VerticalOptions = LayoutOptions.Center
+                               };
+                       }
+               }
+#endif
+#if UITEST && __MACOS__
+               [Test]
+               public void NoNREOnPushModalAsyncAndBack()
+               {
+                       RunningApp.WaitForElement(TriggerModalAutomationId);
+                       RunningApp.Tap(TriggerModalAutomationId);
+                       RunningApp.WaitForElement(PopModalAutomationId);
+                       RunningApp.Tap(PopModalAutomationId);
+               }
+
+               
+#endif
+       }
+
+}
\ No newline at end of file
index 2676835..b9ffb0f 100644 (file)
     <Compile Include="$(MSBuildThisFileDirectory)Issue6127.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue7283.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue5395.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Issue7886.xaml.cs">
+      <DependentUpon>Issue7886.xaml</DependentUpon>
+    </Compile>
     <Compile Include="$(MSBuildThisFileDirectory)Issue7898.cs" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue7525.xaml">
       <Generator>UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
+    <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue7886.xaml">
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Bugzilla27417Xaml.xaml">
   <ItemGroup>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue7593.xaml">
       <SubType>Designer</SubType>
-      <Generator>MSBuild:Compile</Generator>
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     </EmbeddedResource>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue7758.xaml">
       <SubType>Designer</SubType>
-      <Generator>MSBuild:Compile</Generator>
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue7789.xaml">
       <SubType>Designer</SubType>
-      <Generator>MSBuild:Compile</Generator>
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
index add6490..2cebe20 100644 (file)
@@ -283,7 +283,10 @@ namespace Xamarin.Forms.Platform.MacOS
 
                        if (Element != null && !string.IsNullOrEmpty(Element.AutomationId))
                                SetAutomationId(Element.AutomationId);
-                       SetAccessibilityLabel();
+
+                       if (element != null)
+                               SetAccessibilityLabel();
+
                        SetAccessibilityHint();
                        SetIsAccessibilityElement();
                        Performance.Stop(reference);