From 9bab8c971db460742fe3ca57af684bd6c1629d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Su=C3=A1rez?= Date: Tue, 9 Nov 2021 11:43:59 +0100 Subject: [PATCH] Fix WebView issue in EvaluateJavascriptAsync method using Shell (#14694) --- .../Issue13326.cs | 95 +++++++++++++++++++ ...rin.Forms.Controls.Issues.Shared.projitems | 1 + Xamarin.Forms.Core/WebView.cs | 5 +- 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue13326.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue13326.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue13326.cs new file mode 100644 index 00000000000..0442645bee8 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue13326.cs @@ -0,0 +1,95 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +using Xamarin.Forms.Core.UITests; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Github, 13326, "[Bug] [Android] WebView.EvaluateJavascriptAsync thrown NullReferenceException when is offscreen in Shell", PlatformAffected.Android)] +#if UITEST + [NUnit.Framework.Category(UITestCategories.Shell)] +#endif + public class Issue13326 : TestShell + { + const string Test1 = "Tab 1"; + const string Test2 = "Tab 2"; + + protected override void Init() + { + AddBottomTab(CreatePage1(Test1), Test1); + AddBottomTab(CreatePage2(Test2), Test2); + + static ContentPage CreatePage1(string title) + { + var layout = new StackLayout(); + + var instructions = new Label + { + Padding = 12, + BackgroundColor = Color.Black, + TextColor = Color.White, + Text = "Navigate to the second Tab" + }; + + layout.Children.Add(instructions); + + return new ContentPage + { + Title = title, + Content = layout + }; + } + + static ContentPage CreatePage2(string title) + { + return new Issue13326SecondPage(title); + } + } + } + + public class Issue13326SecondPage : ContentPage + { + WebView _webView; + + public Issue13326SecondPage(string title) + { + Title = title; + + var layout = new StackLayout(); + + var instructions = new Label + { + Padding = 12, + BackgroundColor = Color.Black, + TextColor = Color.White, + Text = "Navigate back to the first tab and wait some seconds, without crashing the test has passed." + }; + + _webView = new WebView + { + HeightRequest = 300, + WidthRequest = 300 + }; + + layout.Children.Add(instructions); + layout.Children.Add(_webView); + + Content = layout; + + Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(5)); + + await _webView.EvaluateJavaScriptAsync("var a = 10;"); + }); + } + } +} \ 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 4b93a91ad76..91bfba72bd6 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 @@ -1806,6 +1806,7 @@ + diff --git a/Xamarin.Forms.Core/WebView.cs b/Xamarin.Forms.Core/WebView.cs index c40c742b0af..f4f92e33269 100644 --- a/Xamarin.Forms.Core/WebView.cs +++ b/Xamarin.Forms.Core/WebView.cs @@ -92,9 +92,12 @@ public void Eval(string script) public async Task EvaluateJavaScriptAsync(string script) { + if (script == null) + return null; + EvaluateJavaScriptDelegate handler = EvaluateJavaScriptRequested; - if (script == null) + if (handler == null) return null; //make all the platforms mimic Android's implementation, which is by far the most complete.