From 3ca801076a1e3fbe3b8922b2429524df20def6a4 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 12 Mar 2024 15:17:24 -0700 Subject: [PATCH] Fix passing null/undefined params to method invoke (#54) Fixes #48 --- HybridWebView/HybridWebView.cs | 2 +- HybridWebView/KnownStaticFiles/HybridWebView.js | 5 ++++- MauiCSharpInteropWebView/MainPage.xaml.cs | 12 +++++++++++- .../Resources/Raw/hybrid_root/methodinvoke.html | 14 +++++++++++--- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/HybridWebView/HybridWebView.cs b/HybridWebView/HybridWebView.cs index 5f7d001..8e1d565 100644 --- a/HybridWebView/HybridWebView.cs +++ b/HybridWebView/HybridWebView.cs @@ -220,7 +220,7 @@ public virtual async Task OnProxyRequestMessage(HybridWebViewProxyEventArgs args var paramObjectValues = invokeData.ParamValues? - .Zip(invokeMethod.GetParameters(), (s, p) => JsonSerializer.Deserialize(s, p.ParameterType)) + .Zip(invokeMethod.GetParameters(), (s, p) => s == null ? null : JsonSerializer.Deserialize(s, p.ParameterType)) .ToArray(); return invokeMethod.Invoke(JSInvokeTarget, paramObjectValues); diff --git a/HybridWebView/KnownStaticFiles/HybridWebView.js b/HybridWebView/KnownStaticFiles/HybridWebView.js index 54e4bfc..806dce0 100644 --- a/HybridWebView/KnownStaticFiles/HybridWebView.js +++ b/HybridWebView/KnownStaticFiles/HybridWebView.js @@ -20,7 +20,10 @@ window.HybridWebView = { paramValues = [paramValues]; } for (var i = 0; i < paramValues.length; i++) { - paramValues[i] = JSON.stringify(paramValues[i]); + // Let 'null' and 'undefined' be passed as-is, but stringify all other values + if (paramValues[i] != null) { + paramValues[i] = JSON.stringify(paramValues[i]); + } } } diff --git a/MauiCSharpInteropWebView/MainPage.xaml.cs b/MauiCSharpInteropWebView/MainPage.xaml.cs index 719e434..9a528dd 100644 --- a/MauiCSharpInteropWebView/MainPage.xaml.cs +++ b/MauiCSharpInteropWebView/MainPage.xaml.cs @@ -175,7 +175,7 @@ private void WriteToLog(string message) private sealed class MyJSInvokeTarget { - private MainPage _mainPage; + private readonly MainPage _mainPage; public MyJSInvokeTarget(MainPage mainPage) { @@ -187,6 +187,16 @@ public void CallMeFromScript(string message, int value) _mainPage.WriteToLog($"I'm a .NET method called from JavaScript with message='{message}' and value={value}"); } + public void CallEmptyParams(string thisIsNull, int thisIsUndefined) + { + _mainPage.WriteToLog($"I'm a .NET method called from JavaScript with null='{thisIsNull}' and undefined={thisIsUndefined}"); + } + + public void CallNoParams() + { + _mainPage.WriteToLog($"I'm a .NET method called from JavaScript with no params"); + } + /// /// An example of a round trip method that takes an input multiple parameters and returns a simple value type (string). /// diff --git a/MauiCSharpInteropWebView/Resources/Raw/hybrid_root/methodinvoke.html b/MauiCSharpInteropWebView/Resources/Raw/hybrid_root/methodinvoke.html index daf249d..8c66779 100644 --- a/MauiCSharpInteropWebView/Resources/Raw/hybrid_root/methodinvoke.html +++ b/MauiCSharpInteropWebView/Resources/Raw/hybrid_root/methodinvoke.html @@ -11,15 +11,21 @@ return sum; } - /* Async invoke examples */ - - function CallDotNetMethod() { Log('Calling a method in .NET with some parameters'); HybridWebView.SendInvokeMessageToDotNet("CallMeFromScript", ["msg from js", 987]); } + function CallEmptyParams() { + HybridWebView.SendInvokeMessageToDotNet("CallEmptyParams", [null, undefined]); + } + + function CallNoParams() { + HybridWebView.SendInvokeMessageToDotNet("CallNoParams"); + } + + /* Async invoke examples */ async function invokeRoundTripDotNetMethod() { var r = await HybridWebView.SendInvokeMessageToDotNetAsync('RoundTripCallFromScript', ["param1", 123]); Log(r); @@ -64,6 +70,8 @@

HybridWebView demo: Method invoke

Sync invoke - Call .NET, no response
+ +