From 250d20625adc04ce3833cb4f97ba72572245281f Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 27 Aug 2024 16:22:28 -0700 Subject: [PATCH 1/3] Move HybridWebView platform code to handlers And run everything through the mappers. Fixes #24269 --- .../src/Core/HybridWebView/HybridWebView.cs | 160 ++---------- .../net-android/PublicAPI.Unshipped.txt | 3 +- .../PublicAPI/net-ios/PublicAPI.Unshipped.txt | 3 +- .../net-maccatalyst/PublicAPI.Unshipped.txt | 3 +- .../net-tizen/PublicAPI.Unshipped.txt | 3 +- .../net-windows/PublicAPI.Unshipped.txt | 3 +- .../PublicAPI/net/PublicAPI.Unshipped.txt | 3 +- .../netstandard/PublicAPI.Unshipped.txt | 3 +- src/Controls/src/Core/WebView/WebView.cs | 2 +- src/Core/src/Core.csproj | 1 + src/Core/src/Core/IHybridWebView.cs | 21 +- .../HybridWebViewHandler.Android.cs | 9 +- .../HybridWebViewHandler.Windows.cs | 14 +- .../HybridWebView/HybridWebViewHandler.cs | 239 ++++++++++++++++-- .../HybridWebView/HybridWebViewHandler.iOS.cs | 15 +- .../IHybridWebViewTaskManager.cs | 11 + .../HybridWebViewInvokeJavaScriptRequest.cs | 14 + .../net-android/PublicAPI.Unshipped.txt | 10 +- .../PublicAPI/net-ios/PublicAPI.Unshipped.txt | 10 +- .../net-maccatalyst/PublicAPI.Unshipped.txt | 10 +- .../net-tizen/PublicAPI.Unshipped.txt | 10 +- .../net-windows/PublicAPI.Unshipped.txt | 10 +- .../src/PublicAPI/net/PublicAPI.Unshipped.txt | 10 +- .../netstandard/PublicAPI.Unshipped.txt | 10 +- .../netstandard2.0/PublicAPI.Unshipped.txt | 10 +- 25 files changed, 373 insertions(+), 214 deletions(-) create mode 100644 src/Core/src/Handlers/HybridWebView/IHybridWebViewTaskManager.cs create mode 100644 src/Core/src/Primitives/HybridWebViewInvokeJavaScriptRequest.cs diff --git a/src/Controls/src/Core/HybridWebView/HybridWebView.cs b/src/Controls/src/Core/HybridWebView/HybridWebView.cs index af44fca85872..8b667474251f 100644 --- a/src/Controls/src/Core/HybridWebView/HybridWebView.cs +++ b/src/Controls/src/Core/HybridWebView/HybridWebView.cs @@ -1,13 +1,7 @@ using System; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.Maui.Devices; -using System.Collections.Generic; - -#if WINDOWS || ANDROID || IOS || MACCATALYST using System.Text.Json; using System.Text.Json.Serialization.Metadata; -#endif +using System.Threading.Tasks; namespace Microsoft.Maui.Controls { @@ -39,37 +33,9 @@ public string? HybridRoot set { SetValue(HybridRootProperty, value); } } - void IHybridWebView.MessageReceived(string rawMessage) + void IHybridWebView.RawMessageReceived(string rawMessage) { - if (string.IsNullOrEmpty(rawMessage)) - { - throw new ArgumentException($"The raw message cannot be null or empty.", nameof(rawMessage)); - } - var indexOfPipe = rawMessage.IndexOf("|", StringComparison.Ordinal); - if (indexOfPipe == -1) - { - throw new ArgumentException($"The raw message must contain a pipe character ('|').", nameof(rawMessage)); - } - - var messageType = rawMessage.Substring(0, indexOfPipe); - var messageContent = rawMessage.Substring(indexOfPipe + 1); - - switch (messageType) - { - case "InvokeMethodCompleted": - { - var sections = messageContent.Split('|'); - var taskId = sections[0]; - var result = sections[1]; - AsyncTaskCompleted(taskId, result); - } - break; - case "RawMessage": - RawMessageReceived?.Invoke(this, new HybridWebViewRawMessageReceivedEventArgs(messageContent)); - break; - default: - throw new ArgumentException($"The message type '{messageType}' is not recognized.", nameof(rawMessage)); - } + RawMessageReceived?.Invoke(this, new HybridWebViewRawMessageReceivedEventArgs(rawMessage)); } /// @@ -91,36 +57,12 @@ public void SendRawMessage(string rawMessage) }); } - private int _invokeTaskId; - private Dictionary> asyncTaskCallbacks = new Dictionary>(); - - /// - /// Handler for when the an Async JavaScript task has completed and needs to notify .NET. - /// - private void AsyncTaskCompleted(string taskId, string result) - { - //Look for the callback in the list of pending callbacks. - if (!string.IsNullOrEmpty(taskId) && asyncTaskCallbacks.ContainsKey(taskId)) - { - //Get the callback and remove it from the list. - var callback = asyncTaskCallbacks[taskId]; - callback.SetResult(result); - - //Remove the callback. - asyncTaskCallbacks.Remove(taskId); - } - } - - /// - /// Invokes a JavaScript method named and optionally passes in the parameter values - /// specified by . - /// - /// The name of the JavaScript method to invoke. - /// Optional array of objects to be passed to the JavaScript method. - /// Optional array of metadata about serializing the types of the parameters specified by . - /// A string containing the return value of the called method. -#if WINDOWS || ANDROID || IOS || MACCATALYST - public async Task InvokeJavaScriptAsync(string methodName, object?[]? paramValues, JsonTypeInfo?[]? paramJsonTypeInfos = null) + /// + public async Task InvokeJavaScriptAsync( + string methodName, + JsonTypeInfo returnTypeJsonTypeInfo, + object?[]? paramValues = null, + JsonTypeInfo?[]? paramJsonTypeInfos = null) { if (string.IsNullOrEmpty(methodName)) { @@ -139,57 +81,16 @@ private void AsyncTaskCompleted(string taskId, string result) throw new ArgumentException($"The number of parameter values does not match the number of parameter JSON type infos.", nameof(paramValues)); } - // Create a callback for async JavaScript methods to invoke when they are done - var callback = new TaskCompletionSource(); - var currentInvokeTaskId = $"{_invokeTaskId++}"; - asyncTaskCallbacks.Add(currentInvokeTaskId, callback); - - var paramsValuesStringArray = - paramValues == null - ? string.Empty - : string.Join( - ", ", - paramValues.Select((v, i) => (v == null ? "null" : JsonSerializer.Serialize(v, paramJsonTypeInfos![i]!)))); + var invokeResult = await Handler?.InvokeAsync( + nameof(IHybridWebView.InvokeJavaScriptAsync), + new HybridWebViewInvokeJavaScriptRequest(methodName, returnTypeJsonTypeInfo, paramValues, paramJsonTypeInfos))!; - await EvaluateJavaScriptAsync($"window.HybridWebView.InvokeMethod({currentInvokeTaskId}, {methodName}, [{paramsValuesStringArray}])"); - - return await callback.Task; - } -#else - public Task InvokeJavaScriptAsync(string methodName, object?[]? paramValues = null, object?[]? paramJsonTypeInfos = null) - { - _invokeTaskId++; // This is to avoid the compiler warning about the field not being used - throw new NotImplementedException(); - } -#endif - - /// - /// Invokes a JavaScript method named and optionally passes in the parameter values specified - /// by by JSON-encoding each one. - /// - /// The type of the return value to deserialize from JSON. - /// The name of the JavaScript method to invoke. - /// Metadata about deserializing the type of the return value specified by . - /// Optional array of objects to be passed to the JavaScript method by JSON-encoding each one. - /// Optional array of metadata about serializing the types of the parameters specified by . - /// An object of type containing the return value of the called method. -#if WINDOWS || ANDROID || IOS || MACCATALYST - public async Task InvokeJavaScriptAsync(string methodName, JsonTypeInfo returnTypeJsonTypeInfo, object?[]? paramValues = null, JsonTypeInfo?[]? paramJsonTypeInfos = null) - { - var stringResult = await InvokeJavaScriptAsync(methodName, paramValues, paramJsonTypeInfos); - - if (stringResult is null) + if (invokeResult is null) { return default; } - return JsonSerializer.Deserialize(stringResult, returnTypeJsonTypeInfo); - } -#else - public Task InvokeJavaScriptAsync(string methodName, object returnTypeJsonTypeInfo, object?[]? paramValues, object?[]? paramJsonTypeInfos) - { - throw new NotImplementedException(); + return (TReturnType)invokeResult; } -#endif /// public async Task EvaluateJavaScriptAsync(string script) @@ -199,40 +100,9 @@ private void AsyncTaskCompleted(string taskId, string result) return null; } - // Make all the platforms mimic Android's implementation, which is by far the most complete. - if (DeviceInfo.Platform != DevicePlatform.Android) - { - script = WebView.EscapeJsString(script); - - if (DeviceInfo.Platform != DevicePlatform.WinUI) - { - // Use JSON.stringify() method to converts a JavaScript value to a JSON string - script = "try{JSON.stringify(eval('" + script + "'))}catch(e){'null'};"; - } - else - { - script = "try{eval('" + script + "')}catch(e){'null'};"; - } - } - - string? result; - - // Use the handler command to evaluate the JS - result = await Handler!.InvokeAsync(nameof(IHybridWebView.EvaluateJavaScriptAsync), + var result = await Handler!.InvokeAsync(nameof(IHybridWebView.EvaluateJavaScriptAsync), new EvaluateJavaScriptAsyncRequest(script)); - //if the js function errored or returned null/undefined treat it as null - if (result == "null") - { - result = null; - } - //JSON.stringify wraps the result in literal quotes, we just want the actual returned result - //note that if the js function returns the string "null" we will get here and not above - else if (result != null) - { - result = result.Trim('"'); - } - return result; } } diff --git a/src/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txt index 8d0f89ae7f0e..a8ee9da554ec 100644 --- a/src/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txt @@ -73,8 +73,7 @@ Microsoft.Maui.Controls.HybridWebView.EvaluateJavaScriptAsync(string! script) -> Microsoft.Maui.Controls.HybridWebView.HybridRoot.get -> string? Microsoft.Maui.Controls.HybridWebView.HybridRoot.set -> void Microsoft.Maui.Controls.HybridWebView.HybridWebView() -> void -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! Microsoft.Maui.Controls.HybridWebView.RawMessageReceived -> System.EventHandler? Microsoft.Maui.Controls.HybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.Controls.HybridWebViewRawMessageReceivedEventArgs diff --git a/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt index 686a6fce5bfb..4608b2ad1ff2 100644 --- a/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt @@ -236,8 +236,7 @@ Microsoft.Maui.Controls.HybridWebView.EvaluateJavaScriptAsync(string! script) -> Microsoft.Maui.Controls.HybridWebView.HybridRoot.get -> string? Microsoft.Maui.Controls.HybridWebView.HybridRoot.set -> void Microsoft.Maui.Controls.HybridWebView.HybridWebView() -> void -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! Microsoft.Maui.Controls.HybridWebView.RawMessageReceived -> System.EventHandler? Microsoft.Maui.Controls.HybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.Controls.HybridWebViewRawMessageReceivedEventArgs diff --git a/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt index 686a6fce5bfb..4608b2ad1ff2 100644 --- a/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt @@ -236,8 +236,7 @@ Microsoft.Maui.Controls.HybridWebView.EvaluateJavaScriptAsync(string! script) -> Microsoft.Maui.Controls.HybridWebView.HybridRoot.get -> string? Microsoft.Maui.Controls.HybridWebView.HybridRoot.set -> void Microsoft.Maui.Controls.HybridWebView.HybridWebView() -> void -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! Microsoft.Maui.Controls.HybridWebView.RawMessageReceived -> System.EventHandler? Microsoft.Maui.Controls.HybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.Controls.HybridWebViewRawMessageReceivedEventArgs diff --git a/src/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txt index 92b3f1bc209b..0a53e93e7fbc 100644 --- a/src/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txt @@ -72,8 +72,7 @@ Microsoft.Maui.Controls.HybridWebView.EvaluateJavaScriptAsync(string! script) -> Microsoft.Maui.Controls.HybridWebView.HybridRoot.get -> string? Microsoft.Maui.Controls.HybridWebView.HybridRoot.set -> void Microsoft.Maui.Controls.HybridWebView.HybridWebView() -> void -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object?[]? paramValues = null, object?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object! returnTypeJsonTypeInfo, object?[]? paramValues, object?[]? paramJsonTypeInfos) -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! Microsoft.Maui.Controls.HybridWebView.RawMessageReceived -> System.EventHandler? Microsoft.Maui.Controls.HybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.Controls.HybridWebViewRawMessageReceivedEventArgs diff --git a/src/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txt index 7d2d44e795fe..d9e2224b59d9 100644 --- a/src/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txt @@ -73,8 +73,7 @@ Microsoft.Maui.Controls.HybridWebView.EvaluateJavaScriptAsync(string! script) -> Microsoft.Maui.Controls.HybridWebView.HybridRoot.get -> string? Microsoft.Maui.Controls.HybridWebView.HybridRoot.set -> void Microsoft.Maui.Controls.HybridWebView.HybridWebView() -> void -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! Microsoft.Maui.Controls.HybridWebView.RawMessageReceived -> System.EventHandler? Microsoft.Maui.Controls.HybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.Controls.HybridWebViewRawMessageReceivedEventArgs diff --git a/src/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txt index 92b3f1bc209b..0a53e93e7fbc 100644 --- a/src/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txt @@ -72,8 +72,7 @@ Microsoft.Maui.Controls.HybridWebView.EvaluateJavaScriptAsync(string! script) -> Microsoft.Maui.Controls.HybridWebView.HybridRoot.get -> string? Microsoft.Maui.Controls.HybridWebView.HybridRoot.set -> void Microsoft.Maui.Controls.HybridWebView.HybridWebView() -> void -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object?[]? paramValues = null, object?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object! returnTypeJsonTypeInfo, object?[]? paramValues, object?[]? paramJsonTypeInfos) -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! Microsoft.Maui.Controls.HybridWebView.RawMessageReceived -> System.EventHandler? Microsoft.Maui.Controls.HybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.Controls.HybridWebViewRawMessageReceivedEventArgs diff --git a/src/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txt index 92b3f1bc209b..0a53e93e7fbc 100644 --- a/src/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txt @@ -72,8 +72,7 @@ Microsoft.Maui.Controls.HybridWebView.EvaluateJavaScriptAsync(string! script) -> Microsoft.Maui.Controls.HybridWebView.HybridRoot.get -> string? Microsoft.Maui.Controls.HybridWebView.HybridRoot.set -> void Microsoft.Maui.Controls.HybridWebView.HybridWebView() -> void -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object?[]? paramValues = null, object?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! -Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, object! returnTypeJsonTypeInfo, object?[]? paramValues, object?[]? paramJsonTypeInfos) -> System.Threading.Tasks.Task! +Microsoft.Maui.Controls.HybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! Microsoft.Maui.Controls.HybridWebView.RawMessageReceived -> System.EventHandler? Microsoft.Maui.Controls.HybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.Controls.HybridWebViewRawMessageReceivedEventArgs diff --git a/src/Controls/src/Core/WebView/WebView.cs b/src/Controls/src/Core/WebView/WebView.cs index 77950e87a05e..085b92bfe192 100644 --- a/src/Controls/src/Core/WebView/WebView.cs +++ b/src/Controls/src/Core/WebView/WebView.cs @@ -287,7 +287,7 @@ public IPlatformElementConfiguration On() where T : IConfigPlatfo return _platformConfigurationRegistry.Value.On(); } - internal static string EscapeJsString(string js) + private static string EscapeJsString(string js) { if (js == null) return null; diff --git a/src/Core/src/Core.csproj b/src/Core/src/Core.csproj index 2e2dd7f2dbf2..2030d29c2a60 100644 --- a/src/Core/src/Core.csproj +++ b/src/Core/src/Core.csproj @@ -37,6 +37,7 @@ + diff --git a/src/Core/src/Core/IHybridWebView.cs b/src/Core/src/Core/IHybridWebView.cs index e30c92f3af89..07bc7a1886db 100644 --- a/src/Core/src/Core/IHybridWebView.cs +++ b/src/Core/src/Core/IHybridWebView.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Text.Json.Serialization.Metadata; +using System.Threading.Tasks; namespace Microsoft.Maui { @@ -17,7 +18,7 @@ public interface IHybridWebView : IView /// string? HybridRoot { get; } - void MessageReceived(string rawMessage); + void RawMessageReceived(string rawMessage); void SendRawMessage(string rawMessage); @@ -27,5 +28,21 @@ public interface IHybridWebView : IView /// The JavaScript code to run. /// The return value (if any) of running the script. Task EvaluateJavaScriptAsync(string script); + + /// + /// Invokes a JavaScript method named and optionally passes in the parameter values specified + /// by by JSON-encoding each one. + /// + /// The type of the return value. + /// The name of the JavaScript method to invoke. + /// Metadata about deserializing the type of the return value specified by . + /// Optional array of objects to be passed to the JavaScript method by JSON-encoding each one. + /// Optional array of metadata about serializing the types of the parameters specified by . + /// An object of type containing the return value of the called method. + Task InvokeJavaScriptAsync( + string methodName, + JsonTypeInfo returnTypeJsonTypeInfo, + object?[]? paramValues = null, + JsonTypeInfo?[]? paramJsonTypeInfos = null); } } diff --git a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs index 552949da2044..4164f0e17b61 100644 --- a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs +++ b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs @@ -49,7 +49,7 @@ public HybridWebViewJavaScriptInterface(HybridWebViewHandler hybridWebViewHandle [JavascriptInterface] public void SendMessage(string message) { - Handler?.VirtualView?.MessageReceived(message); + Handler?.MessageReceived(message); } } @@ -86,12 +86,9 @@ protected override void DisconnectHandler(AWebView platformView) base.DisconnectHandler(platformView); } - public static void MapEvaluateJavaScriptAsync(IHybridWebViewHandler handler, IHybridWebView hybridWebView, object? arg) + internal static void EvaluateJavaScript(IHybridWebViewHandler handler, IHybridWebView hybridWebView, EvaluateJavaScriptAsyncRequest request) { - if (arg is EvaluateJavaScriptAsyncRequest request) - { - handler.PlatformView.EvaluateJavaScript(request); - } + handler.PlatformView.EvaluateJavaScript(request); } public static void MapSendRawMessage(IHybridWebViewHandler handler, IHybridWebView hybridWebView, object? arg) diff --git a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Windows.cs b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Windows.cs index 9ecd61c8c830..3b9e4c12ea24 100644 --- a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Windows.cs +++ b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Windows.cs @@ -5,7 +5,6 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.Web.WebView2.Core; -using Windows.Foundation; using Windows.Storage.Streams; namespace Microsoft.Maui.Handlers @@ -73,20 +72,13 @@ protected override void DisconnectHandler(WebView2 platformView) base.DisconnectHandler(platformView); } - public static void MapEvaluateJavaScriptAsync(IHybridWebViewHandler handler, IHybridWebView hybridWebView, object? arg) + internal static void EvaluateJavaScript(IHybridWebViewHandler handler, IHybridWebView hybridWebView, EvaluateJavaScriptAsyncRequest request) { - if (arg is not EvaluateJavaScriptAsyncRequest request || - handler.PlatformView is not MauiHybridWebView hybridPlatformWebView) + if (handler.PlatformView is not MauiHybridWebView hybridPlatformWebView) { return; } - if (handler.PlatformView is null) - { - request.SetCanceled(); - return; - } - hybridPlatformWebView.RunAfterInitialize(() => hybridPlatformWebView.EvaluateJavaScript(request)); } @@ -102,7 +94,7 @@ public static void MapSendRawMessage(IHybridWebViewHandler handler, IHybridWebVi private void OnWebMessageReceived(WebView2 sender, CoreWebView2WebMessageReceivedEventArgs args) { - VirtualView?.MessageReceived(args.TryGetWebMessageAsString()); + MessageReceived(args.TryGetWebMessageAsString()); } private async void OnWebResourceRequested(CoreWebView2 sender, CoreWebView2WebResourceRequestedEventArgs eventArgs) diff --git a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.cs b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.cs index 970ad636a005..f6f3fd9768bf 100644 --- a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.cs +++ b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.cs @@ -18,10 +18,17 @@ using System.Threading.Tasks; using Microsoft.Maui.Storage; using System; +using System.Collections.Concurrent; +using System.Threading; +using Microsoft.Maui.Devices; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; namespace Microsoft.Maui.Handlers { - public partial class HybridWebViewHandler : IHybridWebViewHandler + public partial class HybridWebViewHandler : IHybridWebViewHandler, IHybridWebViewTaskManager { // Using an IP address means that the web view doesn't wait for any DNS resolution, // making it substantially faster. Note that this isn't real HTTP traffic, since @@ -42,29 +49,221 @@ public partial class HybridWebViewHandler : IHybridWebViewHandler internal static readonly string AppOrigin = $"{AppHostScheme}://{AppHostAddress}/"; internal static readonly Uri AppOriginUri = new(AppOrigin); - + public static IPropertyMapper Mapper = new PropertyMapper(ViewHandler.ViewMapper) - { + { }; - public static CommandMapper CommandMapper = new(ViewCommandMapper) - { + public static CommandMapper CommandMapper = new(ViewCommandMapper) + { [nameof(IHybridWebView.EvaluateJavaScriptAsync)] = MapEvaluateJavaScriptAsync, + [nameof(IHybridWebView.InvokeJavaScriptAsync)] = MapInvokeJavaScriptAsync, [nameof(IHybridWebView.SendRawMessage)] = MapSendRawMessage, - }; + }; + + public HybridWebViewHandler() : base(Mapper, CommandMapper) + { + } + + public HybridWebViewHandler(IPropertyMapper? mapper = null, CommandMapper? commandMapper = null) + : base(mapper ?? Mapper, commandMapper ?? CommandMapper) + { + } - public HybridWebViewHandler() : base(Mapper, CommandMapper) - { - } + IHybridWebView IHybridWebViewHandler.VirtualView => VirtualView; - public HybridWebViewHandler(IPropertyMapper? mapper = null, CommandMapper? commandMapper = null) - : base(mapper ?? Mapper, commandMapper ?? CommandMapper) - { - } + PlatformView IHybridWebViewHandler.PlatformView => PlatformView; - IHybridWebView IHybridWebViewHandler.VirtualView => VirtualView; - PlatformView IHybridWebViewHandler.PlatformView => PlatformView; + + /// + /// Handler for when the an Async JavaScript task has completed and needs to notify .NET. + /// + private void AsyncTaskCompleted(string taskId, string result) + { + // Look for the callback in the list of pending callbacks + if (!string.IsNullOrEmpty(taskId) && _asyncTaskCallbacks.TryGetValue(taskId, out var callback)) + { + // Get the callback and remove it from the list + callback.SetResult(result); + + // Remove the callback + _asyncTaskCallbacks.TryRemove(taskId, out var _); + } + } + + void MessageReceived(string rawMessage) + { + if (string.IsNullOrEmpty(rawMessage)) + { + throw new ArgumentException($"The raw message cannot be null or empty.", nameof(rawMessage)); + } +#if !NETSTANDARD2_0 + var indexOfPipe = rawMessage.IndexOf('|', StringComparison.Ordinal); +#else + var indexOfPipe = rawMessage.IndexOf("|", StringComparison.Ordinal); +#endif + if (indexOfPipe == -1) + { + throw new ArgumentException($"The raw message must contain a pipe character ('|').", nameof(rawMessage)); + } + + var messageType = rawMessage.Substring(0, indexOfPipe); + var messageContent = rawMessage.Substring(indexOfPipe + 1); + + switch (messageType) + { + case "InvokeMethodCompleted": + { + var sections = messageContent.Split('|'); + var taskId = sections[0]; + var result = sections[1]; + AsyncTaskCompleted(taskId, result); + } + break; + case "RawMessage": + VirtualView?.RawMessageReceived(messageContent); + break; + default: + throw new ArgumentException($"The message type '{messageType}' is not recognized.", nameof(rawMessage)); + } + } + +#if PLATFORM && !TIZEN + public static async void MapEvaluateJavaScriptAsync(IHybridWebViewHandler handler, IHybridWebView hybridWebView, object? arg) + { + if (arg is not EvaluateJavaScriptAsyncRequest request || + handler.PlatformView is not MauiHybridWebView hybridPlatformWebView) + { + return; + } + + if (handler.PlatformView is null) + { + request.SetCanceled(); + return; + } + + var script = request.Script; + // Make all the platforms mimic Android's implementation, which is by far the most complete. + if (!OperatingSystem.IsAndroid()) + { + script = EscapeJsString(script); + + if (!OperatingSystem.IsWindows()) + { + // Use JSON.stringify() method to converts a JavaScript value to a JSON string + script = "try{JSON.stringify(eval('" + script + "'))}catch(e){'null'};"; + } + else + { + script = "try{eval('" + script + "')}catch(e){'null'};"; + } + } + + // Use the handler command to evaluate the JS + var innerRequest = new EvaluateJavaScriptAsyncRequest(script); + EvaluateJavaScript(handler, hybridWebView, innerRequest); + + var result = await innerRequest.Task; + + //if the js function errored or returned null/undefined treat it as null + if (result == "null") + { + result = null; + } + //JSON.stringify wraps the result in literal quotes, we just want the actual returned result + //note that if the js function returns the string "null" we will get here and not above + else if (result != null) + { + result = result.Trim('"'); + } + + request.SetResult(result!); + + } +#endif + + public static async void MapInvokeJavaScriptAsync(IHybridWebViewHandler handler, IHybridWebView hybridWebView, object? arg) + { +#if PLATFORM && !TIZEN + if (arg is not HybridWebViewInvokeJavaScriptRequest invokeJavaScriptRequest || + handler.PlatformView is not MauiHybridWebView hybridPlatformWebView || + handler is not IHybridWebViewTaskManager taskManager) + { + return; + } + + // Create a callback for async JavaScript methods to invoke when they are done + var callback = new TaskCompletionSource(); + var currentInvokeTaskId = $"{taskManager.GetNextInvokeTaskId()}"; + taskManager.AsyncTaskCallbacks.TryAdd(currentInvokeTaskId, callback); + + var paramsValuesStringArray = + invokeJavaScriptRequest.ParamValues == null + ? string.Empty + : string.Join( + ", ", + invokeJavaScriptRequest.ParamValues.Select((v, i) => (v == null ? "null" : JsonSerializer.Serialize(v, invokeJavaScriptRequest.ParamJsonTypeInfos![i]!)))); + + await handler.InvokeAsync(nameof(IHybridWebView.EvaluateJavaScriptAsync), + new EvaluateJavaScriptAsyncRequest($"window.HybridWebView.InvokeMethod({currentInvokeTaskId}, {invokeJavaScriptRequest.MethodName}, [{paramsValuesStringArray}])")); + + var stringResult = await callback.Task; + + if (stringResult is null) + { + invokeJavaScriptRequest.SetResult(null); + } + else + { + var typedResult = JsonSerializer.Deserialize(stringResult, invokeJavaScriptRequest.ReturnTypeJsonTypeInfo); + invokeJavaScriptRequest.SetResult(typedResult); + } +#else + await Task.CompletedTask; +#endif + } + +#if PLATFORM && !TIZEN + // Copied from WebView.cs + internal static string? EscapeJsString(string js) + { + if (js == null) + return null; + + if (!js.Contains('\'', StringComparison.Ordinal)) + return js; + + //get every quote in the string along with all the backslashes preceding it + var singleQuotes = Regex.Matches(js, @"(\\*?)'"); + + var uniqueMatches = new List(); + + for (var i = 0; i < singleQuotes.Count; i++) + { + var matchedString = singleQuotes[i].Value; + if (!uniqueMatches.Contains(matchedString)) + { + uniqueMatches.Add(matchedString); + } + } + + uniqueMatches.Sort((x, y) => y.Length.CompareTo(x.Length)); + + //escape all quotes from the script as well as add additional escaping to all quotes that were already escaped + for (var i = 0; i < uniqueMatches.Count; i++) + { + var match = uniqueMatches[i]; + var numberOfBackslashes = match.Length - 1; + var slashesToAdd = (numberOfBackslashes * 2) + 1; + var replacementStr = "'".PadLeft(slashesToAdd + 1, '\\'); + js = Regex.Replace(js, @"(?<=[^\\])" + Regex.Escape(match), replacementStr); + } + + return js; + } +#endif internal static async Task GetAssetContentAsync(string assetPath) { @@ -92,5 +291,15 @@ public HybridWebViewHandler(IPropertyMapper? mapper = null, CommandMapper? comma #if !NETSTANDARD internal static readonly FileExtensionContentTypeProvider ContentTypeProvider = new(); #endif + + // IHybridWebViewTaskManager implementation + ConcurrentDictionary> _asyncTaskCallbacks = new ConcurrentDictionary>(); + int _asyncInvokeTaskId; + + int IHybridWebViewTaskManager.GetNextInvokeTaskId() + { + return Interlocked.Increment(ref _asyncInvokeTaskId); + } + ConcurrentDictionary> IHybridWebViewTaskManager.AsyncTaskCallbacks => _asyncTaskCallbacks; } } diff --git a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.iOS.cs b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.iOS.cs index aaec92d2cf63..1cfce539773f 100644 --- a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.iOS.cs +++ b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.iOS.cs @@ -59,18 +59,9 @@ protected override WKWebView CreatePlatformView() return webview; } - public static void MapEvaluateJavaScriptAsync(IHybridWebViewHandler handler, IHybridWebView hybridWebView, object? arg) + internal static void EvaluateJavaScript(IHybridWebViewHandler handler, IHybridWebView hybridWebView, EvaluateJavaScriptAsyncRequest request) { - if (arg is EvaluateJavaScriptAsyncRequest request) - { - if (handler.PlatformView is null) - { - request.SetCanceled(); - return; - } - - handler.PlatformView.EvaluateJavaScript(request); - } + handler.PlatformView.EvaluateJavaScript(request); } public static void MapSendRawMessage(IHybridWebViewHandler handler, IHybridWebView hybridWebView, object? arg) @@ -85,7 +76,7 @@ public static void MapSendRawMessage(IHybridWebViewHandler handler, IHybridWebVi private void MessageReceived(Uri uri, string message) { - VirtualView?.MessageReceived(message); + MessageReceived(message); } protected override void ConnectHandler(WKWebView platformView) diff --git a/src/Core/src/Handlers/HybridWebView/IHybridWebViewTaskManager.cs b/src/Core/src/Handlers/HybridWebView/IHybridWebViewTaskManager.cs new file mode 100644 index 000000000000..2064d681d5e2 --- /dev/null +++ b/src/Core/src/Handlers/HybridWebView/IHybridWebViewTaskManager.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using System.Collections.Concurrent; + +namespace Microsoft.Maui.Handlers +{ + internal interface IHybridWebViewTaskManager + { + int GetNextInvokeTaskId(); + ConcurrentDictionary> AsyncTaskCallbacks { get; } + } +} diff --git a/src/Core/src/Primitives/HybridWebViewInvokeJavaScriptRequest.cs b/src/Core/src/Primitives/HybridWebViewInvokeJavaScriptRequest.cs new file mode 100644 index 000000000000..37d4fb1880e2 --- /dev/null +++ b/src/Core/src/Primitives/HybridWebViewInvokeJavaScriptRequest.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Serialization.Metadata; +using System.Threading.Tasks; + +namespace Microsoft.Maui +{ + public class HybridWebViewInvokeJavaScriptRequest(string methodName, JsonTypeInfo returnTypeJsonTypeInfo, object?[]? paramValues, JsonTypeInfo?[]? paramJsonTypeInfos) + : TaskCompletionSource + { + public string MethodName { get; } = methodName; + public JsonTypeInfo ReturnTypeJsonTypeInfo { get; } = returnTypeJsonTypeInfo; + public object?[]? ParamValues { get; } = paramValues; + public JsonTypeInfo?[]? ParamJsonTypeInfos { get; } = paramJsonTypeInfos; + } +} diff --git a/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt index a9751343c01d..afa1a133b629 100644 --- a/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-android/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> Android.Webkit.WebView! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -56,6 +63,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! diff --git a/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt index 441b74c407d0..2f2f78edbcde 100644 --- a/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-ios/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> WebKit.WKWebView! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -49,6 +56,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! diff --git a/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt index 441b74c407d0..2f2f78edbcde 100644 --- a/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> WebKit.WKWebView! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -49,6 +56,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! diff --git a/src/Core/src/PublicAPI/net-tizen/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-tizen/PublicAPI.Unshipped.txt index 2b60790d00fc..c322d5cb0203 100644 --- a/src/Core/src/PublicAPI/net-tizen/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-tizen/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> Tizen.NUI.BaseComponents.View! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -42,6 +49,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! diff --git a/src/Core/src/PublicAPI/net-windows/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net-windows/PublicAPI.Unshipped.txt index f88a9199f2fe..3be8422b5927 100644 --- a/src/Core/src/PublicAPI/net-windows/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net-windows/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> Microsoft.UI.Xaml.Controls.WebView2! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -50,6 +57,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! diff --git a/src/Core/src/PublicAPI/net/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/net/PublicAPI.Unshipped.txt index eede0783e0ce..38fdae9ec33c 100644 --- a/src/Core/src/PublicAPI/net/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/net/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> object! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -42,6 +49,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! diff --git a/src/Core/src/PublicAPI/netstandard/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/netstandard/PublicAPI.Unshipped.txt index eede0783e0ce..38fdae9ec33c 100644 --- a/src/Core/src/PublicAPI/netstandard/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/netstandard/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> object! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -42,6 +49,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! diff --git a/src/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index eede0783e0ce..38fdae9ec33c 100644 --- a/src/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -11,6 +11,12 @@ Microsoft.Maui.Handlers.IHybridPlatformWebView.SendRawMessage(string! rawMessage Microsoft.Maui.Handlers.IHybridWebViewHandler Microsoft.Maui.Handlers.IHybridWebViewHandler.PlatformView.get -> object! Microsoft.Maui.Handlers.IHybridWebViewHandler.VirtualView.get -> Microsoft.Maui.IHybridWebView! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.HybridWebViewInvokeJavaScriptRequest(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos) -> void +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.MethodName.get -> string! +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamJsonTypeInfos.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ParamValues.get -> object?[]? +Microsoft.Maui.HybridWebViewInvokeJavaScriptRequest.ReturnTypeJsonTypeInfo.get -> System.Text.Json.Serialization.Metadata.JsonTypeInfo! Microsoft.Maui.HybridWebViewRawMessage Microsoft.Maui.HybridWebViewRawMessage.HybridWebViewRawMessage() -> void Microsoft.Maui.HybridWebViewRawMessage.Message.get -> string? @@ -20,7 +26,8 @@ Microsoft.Maui.IHybridWebView Microsoft.Maui.IHybridWebView.DefaultFile.get -> string? Microsoft.Maui.IHybridWebView.EvaluateJavaScriptAsync(string! script) -> System.Threading.Tasks.Task! Microsoft.Maui.IHybridWebView.HybridRoot.get -> string? -Microsoft.Maui.IHybridWebView.MessageReceived(string! rawMessage) -> void +Microsoft.Maui.IHybridWebView.InvokeJavaScriptAsync(string! methodName, System.Text.Json.Serialization.Metadata.JsonTypeInfo! returnTypeJsonTypeInfo, object?[]? paramValues = null, System.Text.Json.Serialization.Metadata.JsonTypeInfo?[]? paramJsonTypeInfos = null) -> System.Threading.Tasks.Task! +Microsoft.Maui.IHybridWebView.RawMessageReceived(string! rawMessage) -> void Microsoft.Maui.IHybridWebView.SendRawMessage(string! rawMessage) -> void Microsoft.Maui.ITitleBar Microsoft.Maui.ITitleBar.PassthroughElements.get -> System.Collections.Generic.IList! @@ -42,6 +49,7 @@ static Microsoft.Maui.ElementHandlerExtensions.IsConnected(this Microsoft.Maui.I static Microsoft.Maui.Handlers.ApplicationHandler.MapActivateWindow(Microsoft.Maui.Handlers.ApplicationHandler! handler, Microsoft.Maui.IApplication! application, object? args) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.CommandMapper -> Microsoft.Maui.CommandMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapEvaluateJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void +static Microsoft.Maui.Handlers.HybridWebViewHandler.MapInvokeJavaScriptAsync(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Handlers.HybridWebViewHandler.Mapper -> Microsoft.Maui.IPropertyMapper! static Microsoft.Maui.Handlers.HybridWebViewHandler.MapSendRawMessage(Microsoft.Maui.Handlers.IHybridWebViewHandler! handler, Microsoft.Maui.IHybridWebView! hybridWebView, object? arg) -> void static Microsoft.Maui.Keyboard.Date.get -> Microsoft.Maui.Keyboard! From 6e4ab729f7057ad275162e989aad5cf7bda7cc30 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Thu, 26 Sep 2024 13:53:32 -0700 Subject: [PATCH 2/3] Run Android tests --- .../DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs b/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs index 07f2092e9fbf..3e4124ece727 100644 --- a/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs +++ b/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs @@ -1,5 +1,4 @@ -#if !ANDROID -using System; +using System; using System.Collections.Generic; using System.Text.Json.Serialization; using System.Threading.Tasks; @@ -356,4 +355,3 @@ private async Task WaitForHybridWebViewLoaded(HybridWebView hybridWebView) } } } -#endif \ No newline at end of file From 08205305949ba77a69f752f03017f64cbf69451c Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Mon, 30 Sep 2024 13:25:47 -0500 Subject: [PATCH 3/3] `@android.webkit.JavascriptInterface` is missing! By changing `HybridJavaScriptInterface` to a class, the JCW now says: @android.webkit.JavascriptInterface public void sendMessage (java.lang.String p0) --- .../maui/HybridJavaScriptInterface.java | 5 +++-- .../HybridWebViewHandler.Android.cs | 4 ++-- src/Core/src/maui.aar | Bin 90844 -> 90976 bytes 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/HybridJavaScriptInterface.java b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/HybridJavaScriptInterface.java index 74638e8f20e9..1cca8de26564 100644 --- a/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/HybridJavaScriptInterface.java +++ b/src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/HybridJavaScriptInterface.java @@ -2,6 +2,7 @@ import androidx.annotation.NonNull; -public interface HybridJavaScriptInterface { - void sendMessage(@NonNull String message); +public abstract class HybridJavaScriptInterface { + @android.webkit.JavascriptInterface + public abstract void sendMessage(@NonNull String message); } diff --git a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs index 4164f0e17b61..495fdbfd5128 100644 --- a/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs +++ b/src/Core/src/Handlers/HybridWebView/HybridWebViewHandler.Android.cs @@ -35,7 +35,7 @@ protected override AWebView CreatePlatformView() return platformView; } - private sealed class HybridWebViewJavaScriptInterface : Java.Lang.Object, IHybridJavaScriptInterface + private sealed class HybridWebViewJavaScriptInterface : HybridJavaScriptInterface { private readonly WeakReference _hybridWebViewHandler; @@ -47,7 +47,7 @@ public HybridWebViewJavaScriptInterface(HybridWebViewHandler hybridWebViewHandle private HybridWebViewHandler? Handler => _hybridWebViewHandler is not null && _hybridWebViewHandler.TryGetTarget(out var h) ? h : null; [JavascriptInterface] - public void SendMessage(string message) + public override void SendMessage(string message) { Handler?.MessageReceived(message); } diff --git a/src/Core/src/maui.aar b/src/Core/src/maui.aar index 496804b74185fe46f5b94d6af3f9a96b035db27f..91df1914b88bb9ffe89947c8e8065bac41da0212 100644 GIT binary patch delta 47791 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 XV3$Z@0YL%Wmx^KmOa_Qy0RR91zr#G* delta 47653 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