diff --git a/src/Controls/src/Core/HybridWebView/HybridWebView.cs b/src/Controls/src/Core/HybridWebView/HybridWebView.cs
index 884bcb35171f..f93258cf6e81 100644
--- a/src/Controls/src/Core/HybridWebView/HybridWebView.cs
+++ b/src/Controls/src/Core/HybridWebView/HybridWebView.cs
@@ -80,6 +80,35 @@ public void SendRawMessage(string rawMessage)
});
}
+ ///
+ /// TODO: make this public for .NET 10 (or a .NET 9 SR)
+ internal async Task InvokeJavaScriptAsync(
+ string methodName,
+ object?[]? paramValues = null,
+ JsonTypeInfo?[]? paramJsonTypeInfos = null)
+ {
+ if (string.IsNullOrEmpty(methodName))
+ {
+ throw new ArgumentException($"The method name cannot be null or empty.", nameof(methodName));
+ }
+ if (paramValues != null && paramJsonTypeInfos == null)
+ {
+ throw new ArgumentException($"The parameter values were provided, but the parameter JSON type infos were not.", nameof(paramJsonTypeInfos));
+ }
+ if (paramValues == null && paramJsonTypeInfos != null)
+ {
+ throw new ArgumentException($"The parameter JSON type infos were provided, but the parameter values were not.", nameof(paramValues));
+ }
+ if (paramValues != null && paramValues.Length != paramJsonTypeInfos!.Length)
+ {
+ throw new ArgumentException($"The number of parameter values does not match the number of parameter JSON type infos.", nameof(paramValues));
+ }
+
+ await Handler?.InvokeAsync(
+ nameof(IHybridWebView.InvokeJavaScriptAsync),
+ new HybridWebViewInvokeJavaScriptRequest(methodName, null, paramValues, paramJsonTypeInfos))!;
+ }
+
///
public async Task InvokeJavaScriptAsync(
string methodName,
diff --git a/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs b/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs
index c78e24bb5a44..a1c9fb5ec476 100644
--- a/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs
+++ b/src/Controls/tests/DeviceTests/Elements/HybridWebView/HybridWebViewTests.cs
@@ -276,6 +276,69 @@ public Task InvokeAsyncJavaScriptMethodWithParametersAndComplexResult() =>
Assert.Equal(s2, result[s1]);
});
+ [Fact]
+ public Task InvokeJavaScriptMethodWithParametersAndVoidReturn() =>
+ RunTest(async (hybridWebView) =>
+ {
+ var x = 123.456m;
+ var y = 654.321m;
+
+ await hybridWebView.InvokeJavaScriptAsync(
+ "EvaluateMeWithParamsAndVoidReturn",
+ [x, y],
+ [HybridWebViewTestContext.Default.Decimal, HybridWebViewTestContext.Default.Decimal]);
+
+ var result = await hybridWebView.InvokeJavaScriptAsync(
+ "EvaluateMeWithParamsAndVoidReturnGetResult",
+ HybridWebViewTestContext.Default.Decimal);
+
+ Assert.Equal(777.777m, result);
+ });
+
+ [Fact]
+ public Task InvokeJavaScriptMethodWithParametersAndVoidReturnUsingObjectReturnMethod() =>
+ RunTest(async (hybridWebView) =>
+ {
+ var x = 123.456m;
+ var y = 654.321m;
+
+ var firstResult = await hybridWebView.InvokeJavaScriptAsync(
+ "EvaluateMeWithParamsAndVoidReturn",
+ HybridWebViewTestContext.Default.ComputationResult,
+ [x, y],
+ [HybridWebViewTestContext.Default.Decimal, HybridWebViewTestContext.Default.Decimal]);
+
+ Assert.Null(firstResult);
+
+ var result = await hybridWebView.InvokeJavaScriptAsync(
+ "EvaluateMeWithParamsAndVoidReturnGetResult",
+ HybridWebViewTestContext.Default.Decimal);
+
+ Assert.Equal(777.777m, result);
+ });
+
+ [Fact]
+ public Task InvokeJavaScriptMethodWithParametersAndVoidReturnUsingNullReturnMethod() =>
+ RunTest(async (hybridWebView) =>
+ {
+ var x = 123.456m;
+ var y = 654.321m;
+
+ var firstResult = await hybridWebView.InvokeJavaScriptAsync