diff --git a/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2.cs b/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2.cs index 16b2f373de88654aa46cd1baefd8212a1e0c900f..3d30309406be3c8efa70a6ab1710d9a4995b3606 100644 --- a/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2.cs +++ b/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2.cs @@ -45,7 +45,10 @@ public partial class CoreWebView2 } _processedSource = actualUri; - Source = actualUri.ToString(); + if (_owner.SwitchSourceBeforeNavigating) + { + Source = actualUri.ToString(); + } UpdateFromInternalSource(); } @@ -53,7 +56,10 @@ public partial class CoreWebView2 public void NavigateToString(string htmlContent) { _processedSource = htmlContent; - Source = BlankUrl; + if (_owner.SwitchSourceBeforeNavigating) + { + Source = BlankUrl; + } UpdateFromInternalSource(); } @@ -66,7 +72,10 @@ public partial class CoreWebView2 } _processedSource = requestMessage; - Source = requestMessage.RequestUri.ToString(); + if (_owner.SwitchSourceBeforeNavigating) + { + Source = requestMessage.RequestUri.ToString(); + } UpdateFromInternalSource(); } diff --git a/src/Uno.UI/UI/Xaml/Controls/WebView/IWebView.cs b/src/Uno.UI/UI/Xaml/Controls/WebView/IWebView.cs index a1efce614944957ad2644382e26e05fbefa52529..af7f90ac52f8d57cdd66bef40d26c8ffa11d6e8d 100644 --- a/src/Uno.UI/UI/Xaml/Controls/WebView/IWebView.cs +++ b/src/Uno.UI/UI/Xaml/Controls/WebView/IWebView.cs @@ -2,5 +2,7 @@ internal interface IWebView { + bool SwitchSourceBeforeNavigating { get; } + bool IsLoaded { get; } } diff --git a/src/Uno.UI/UI/Xaml/Controls/WebView/WebView1/WebView.cs b/src/Uno.UI/UI/Xaml/Controls/WebView/WebView1/WebView.cs index 96691c3048977345c2043e84e8950f0f79959644..1cc22f8f432b1700eec6faeb221f0bb283c2cb95 100644 --- a/src/Uno.UI/UI/Xaml/Controls/WebView/WebView1/WebView.cs +++ b/src/Uno.UI/UI/Xaml/Controls/WebView/WebView1/WebView.cs @@ -40,6 +40,8 @@ public partial class WebView : Control, IWebView bool IWebView.IsLoaded => IsLoaded; + bool IWebView.SwitchSourceBeforeNavigating => true; + protected override void OnApplyTemplate() => CoreWebView2.OnOwnerApplyTemplate(); public void Navigate(global::System.Uri source) => CoreWebView2.Navigate(source.ToString()); @@ -54,18 +56,29 @@ public partial class WebView : Control, IWebView public void Stop() => CoreWebView2.Stop(); - public IAsyncOperation InvokeScriptAsync(string scriptName, IEnumerable arguments) + public IAsyncOperation InvokeScriptAsync(string scriptName, IEnumerable arguments) => + AsyncOperation.FromTask(ct => InvokeScriptAsync(ct, scriptName, arguments.ToArray())); + + public async Task InvokeScriptAsync(CancellationToken ct, string script, string[] arguments) { var argumentString = ConcatenateJavascriptArguments(arguments); - var javaScript = string.Format(CultureInfo.InvariantCulture, "{0}(\"{1}\")", scriptName, argumentString); - return CoreWebView2.ExecuteScriptAsync(javaScript); + var javaScript = string.Format(CultureInfo.InvariantCulture, "{0}(\"{1}\")", script, argumentString); + return AdjustInvokeScriptResult(await CoreWebView2.ExecuteScriptAsync(javaScript)); } - public async Task InvokeScriptAsync(CancellationToken ct, string script, string[] arguments) + private string? AdjustInvokeScriptResult(string result) { - var argumentString = ConcatenateJavascriptArguments(arguments); - var javaScript = string.Format(CultureInfo.InvariantCulture, "{0}(\"{1}\")", script, argumentString); - return await CoreWebView2.ExecuteScriptAsync(javaScript); + if (result is null) + { + return null; + } + + if (result.StartsWith("\"", StringComparison.Ordinal) && result.EndsWith("\"", StringComparison.Ordinal)) + { + return result.Substring(1, result.Length - 2); + } + + return ""; } public void NavigateWithHttpRequestMessage(global::System.Net.Http.HttpRequestMessage requestMessage) => diff --git a/src/Uno.UI/UI/Xaml/Controls/WebView/WebView2/WebView2.cs b/src/Uno.UI/UI/Xaml/Controls/WebView/WebView2/WebView2.cs index e628a62af15dc12b899b877c23154237d8ac7671..5951f548ce4b80a4d2e4118ac125938f1a861a91 100644 --- a/src/Uno.UI/UI/Xaml/Controls/WebView/WebView2/WebView2.cs +++ b/src/Uno.UI/UI/Xaml/Controls/WebView/WebView2/WebView2.cs @@ -42,6 +42,8 @@ public partial class WebView2 : Control, IWebView bool IWebView.IsLoaded => IsLoaded; + bool IWebView.SwitchSourceBeforeNavigating => false; // WebView2 switches source only when navigation completes. + protected override void OnApplyTemplate() => CoreWebView2.OnOwnerApplyTemplate(); private void WebView2_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) =>