From c9c8ec1c7351465e8f40000a0f2de0bd0e3ef4ef Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Mon, 3 Apr 2023 13:08:49 +0200 Subject: [PATCH] chore: Adjustments for URIs --- .../Controls/WebView/Core/CoreWebView2.cs | 17 +++++++++++-- ...CoreWebView2NavigationStartingEventArgs.cs | 4 +-- .../Native/iOSmacOS/UnoWKWebView.iOSmacOS.cs | 25 ++++++++++--------- 3 files changed, 30 insertions(+), 16 deletions(-) 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 baeab178b9..e80e781cb6 100644 --- a/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2.cs +++ b/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2.cs @@ -119,10 +119,23 @@ public partial class CoreWebView2 } } - internal void RaiseNavigationStarting(string uri, out bool cancel) + internal void RaiseNavigationStarting(object navigationData, out bool cancel) { + string? uriString = null; + if (navigationData is Uri uri) + { + uriString = uri.ToString(); + } + else if (navigationData is string htmlContent) + { + // Convert to data URI string + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(htmlContent); + var base64String = System.Convert.ToBase64String(plainTextBytes); + uriString = string.Format(CultureInfo.InvariantCulture, DataUriFormatString, base64String); + } + var newNavigationId = Interlocked.Increment(ref _navigationId); - var args = new CoreWebView2NavigationStartingEventArgs((ulong)newNavigationId, uri); + var args = new CoreWebView2NavigationStartingEventArgs((ulong)newNavigationId, uriString); NavigationStarting?.Invoke(this, args); cancel = args.Cancel; diff --git a/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2NavigationStartingEventArgs.cs b/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2NavigationStartingEventArgs.cs index 8ce9d101d4..9c7fc1afa6 100644 --- a/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2NavigationStartingEventArgs.cs +++ b/src/Uno.UI/UI/Xaml/Controls/WebView/Core/CoreWebView2NavigationStartingEventArgs.cs @@ -9,7 +9,7 @@ namespace Microsoft.Web.WebView2.Core; /// public partial class CoreWebView2NavigationStartingEventArgs : EventArgs { - public CoreWebView2NavigationStartingEventArgs(ulong navigationId, string uri) => + public CoreWebView2NavigationStartingEventArgs(ulong navigationId, string? uri) => (NavigationId, Uri) = (navigationId, uri); /// @@ -20,7 +20,7 @@ public partial class CoreWebView2NavigationStartingEventArgs : EventArgs /// /// Gets the URI of the requested navigation. /// - public string Uri { get; } + public string? Uri { get; } /// /// Determines whether to cancel the navigation. diff --git a/src/Uno.UI/UI/Xaml/Controls/WebView/Native/iOSmacOS/UnoWKWebView.iOSmacOS.cs b/src/Uno.UI/UI/Xaml/Controls/WebView/Native/iOSmacOS/UnoWKWebView.iOSmacOS.cs index 6a9ba630d7..f0a94efadd 100644 --- a/src/Uno.UI/UI/Xaml/Controls/WebView/Native/iOSmacOS/UnoWKWebView.iOSmacOS.cs +++ b/src/Uno.UI/UI/Xaml/Controls/WebView/Native/iOSmacOS/UnoWKWebView.iOSmacOS.cs @@ -17,6 +17,7 @@ using Uno.UI.Extensions; using Windows.Foundation; using System.Collections.Generic; using System.Globalization; +using System.Text; using System.Net; #if __IOS__ @@ -30,7 +31,7 @@ namespace Windows.UI.Xaml.Controls; public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageHandler #if __MACOS__ - ,IHasSizeThatFits + , IHasSizeThatFits #endif { private CoreWebView2 _coreWebView; @@ -81,7 +82,7 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH var height = Math.Min(availableSize.Height, FittingSize.Height); var width = Math.Min(availableSize.Width, FittingSize.Width); return new CGSize(width, height); - } + } #endif @@ -210,7 +211,7 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH } else { - RaiseNavigationStarting(targetString, out var cancel); + RaiseNavigationStarting(target, out var cancel); if (!cancel) { @@ -307,7 +308,8 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH }; alert.AddButton(OkString); alert.AddButton(CancelString); - alert.BeginSheetForResponse(webview.Window, (result) => { + alert.BeginSheetForResponse(webview.Window, (result) => + { var okButtonClicked = result == 1000; completionHandler(okButtonClicked); }); @@ -352,7 +354,8 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH alert.AccessoryView = textField; alert.AddButton(OkString); alert.AddButton(CancelString); - alert.BeginSheetForResponse(webview.Window, (result) => { + alert.BeginSheetForResponse(webview.Window, (result) => + { var okButtonClicked = result == 1000; completionHandler(okButtonClicked ? textField.StringValue : null); }); @@ -376,9 +379,7 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH _isCancelling = false; - RaiseNavigationStarting(CoreWebView2.BlankUrl, out var cancel); //TODO:MZ: For HTML content var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(htmlContent); - //var base64String = System.Convert.ToBase64String(plainTextBytes); - //var htmlUri = new Uri(string.Format(CultureInfo.InvariantCulture, DataUriFormatString, base64String)); + RaiseNavigationStarting(targetUrl ?? _lastNavigationData, out var cancel); //TODO:MZ: For HTML content if (cancel) { @@ -392,9 +393,9 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH return cancel; } - private void RaiseNavigationStarting(string uriString, out bool cancel) + private void RaiseNavigationStarting(object navigationData, out bool cancel) { - if (uriString == null) + if (navigationData is null) { // This ase should not happen when navigating normally using http requests. // This is to stop a scenario where the webview is initialized without having a source @@ -402,7 +403,7 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH return; } - if (Uri.TryCreate(uriString, UriKind.Absolute, out var uri) && uri.Scheme.Equals(Uri.UriSchemeMailto, StringComparison.OrdinalIgnoreCase)) + if (navigationData is Uri uri && uri.Scheme.Equals(Uri.UriSchemeMailto, StringComparison.OrdinalIgnoreCase)) { #if __IOS__ ParseUriAndLauchMailto(uri); @@ -414,7 +415,7 @@ public partial class UnoWKWebView : WKWebView, INativeWebView, IWKScriptMessageH } _coreWebView.SetHistoryProperties(CanGoBack, CanGoForward); - _coreWebView.RaiseNavigationStarting(uriString, out cancel); + _coreWebView.RaiseNavigationStarting(navigationData, out cancel); } private void RaiseNavigationCompleted(Uri uri, bool isSuccess, int httpStatusCode, CoreWebView2WebErrorStatus errorStatus) -- GitLab