Skip to content

Commit bb3d854

Browse files
committed
Switched WebView2Extensions to System.Text.Json
1 parent 12316cb commit bb3d854

File tree

2 files changed

+16
-15
lines changed

2 files changed

+16
-15
lines changed

src/Files.App/Extensions/WebView2Extensions.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
using CommunityToolkit.WinUI;
55
using Microsoft.UI.Xaml.Controls;
66
using Microsoft.Web.WebView2.Core;
7-
using Newtonsoft.Json;
87
using System.Reflection;
98
using System.Text;
9+
using System.Text.Encodings.Web;
1010
using Windows.Foundation;
1111

1212
namespace Files.App.Extensions
@@ -36,14 +36,14 @@ private struct WebMessage
3636

3737
private struct MethodWebMessage
3838
{
39-
public string Id { get; set; }
39+
public long Id { get; set; }
4040
public string Method { get; set; }
4141
public string Args { get; set; }
4242
}
4343

4444
private struct PropertyWebMessage
4545
{
46-
public string Id { get; set; }
46+
public long Id { get; set; }
4747
public string Property { get; set; }
4848
public PropertyAction Action { get; set; }
4949
public string Value { get; set; }
@@ -101,14 +101,16 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
101101

102102
var handler = (WebViewMessageReceivedHandler)(async (_, e) =>
103103
{
104-
var message = JsonConvert.DeserializeObject<WebMessage>(e.TryGetWebMessageAsString());
104+
var message = JsonSerializer.Deserialize<WebMessage>(e.TryGetWebMessageAsString(), new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
105105
if (message.Guid == methodsGuid)
106106
{
107-
var methodMessage = JsonConvert.DeserializeObject<MethodWebMessage>(e.TryGetWebMessageAsString());
107+
108+
var methodMessage = JsonSerializer.Deserialize<MethodWebMessage>(e.TryGetWebMessageAsString(), new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
108109
var method = methods[methodMessage.Method];
109110
try
110111
{
111-
var result = method.Invoke(@object, JsonConvert.DeserializeObject<object[]>(methodMessage.Args));
112+
var args = JsonSerializer.Deserialize<JsonElement[]>(methodMessage.Args).Zip(method.GetParameters(), (val, args) => new { val, args.ParameterType }).Select(item => item.val.Deserialize(item.ParameterType));
113+
var result = method.Invoke(@object, args.ToArray());
112114
if (result is object)
113115
{
114116
var resultType = result.GetType();
@@ -152,19 +154,19 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
152154
result = await task;
153155
}
154156
}
155-
var json = JsonConvert.SerializeObject(result);
157+
var json = JsonSerializer.Serialize(result, new JsonSerializerOptions() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); ;
156158
await webview.ExecuteScriptAsync($@"{name}._callbacks.get({methodMessage.Id}).accept(JSON.parse({json})); {name}._callbacks.delete({methodMessage.Id});");
157159
}
158160
catch (Exception ex)
159161
{
160-
var json = JsonConvert.SerializeObject(ex, new JsonSerializerSettings() { Error = (_, e) => e.ErrorContext.Handled = true });
162+
var json = JsonSerializer.Serialize(ex, new JsonSerializerOptions() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });
161163
await webview.ExecuteScriptAsync($@"{name}._callbacks.get({methodMessage.Id}).reject(JSON.parse({json})); {name}._callbacks.delete({methodMessage.Id});");
162164
//throw;
163165
}
164166
}
165167
else if (message.Guid == propertiesGuid)
166168
{
167-
var propertyMessage = JsonConvert.DeserializeObject<PropertyWebMessage>(e.TryGetWebMessageAsString());
169+
var propertyMessage = JsonSerializer.Deserialize<PropertyWebMessage>(e.TryGetWebMessageAsString(), new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
168170
var property = properties[propertyMessage.Property];
169171
try
170172
{
@@ -175,17 +177,17 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
175177
}
176178
else
177179
{
178-
var value = JsonConvert.DeserializeObject(propertyMessage.Value, property.PropertyType);
180+
var value = JsonSerializer.Deserialize(propertyMessage.Value, property.PropertyType);
179181
property.SetValue(@object, value);
180182
result = new object();
181183
}
182184

183-
var json = JsonConvert.SerializeObject(result);
185+
var json = JsonSerializer.Serialize(result, new JsonSerializerOptions() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });
184186
await webview.ExecuteScriptAsync($@"{name}._callbacks.get({propertyMessage.Id}).accept(JSON.parse({json})); {name}._callbacks.delete({propertyMessage.Id});");
185187
}
186188
catch (Exception ex)
187189
{
188-
//var json = JsonConvert.SerializeObject(ex, new JsonSerializerSettings() { Error = (_, e) => e.ErrorContext.Handled = true });
190+
//var json = JsonSerializer.Serialize(ex, new JsonSerializerOptions() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });
189191
//await webview.ExecuteScriptAsync($@"{name}._callbacks.get({propertyMessage.Id}).reject(JSON.parse({json})); {name}._callbacks.delete({propertyMessage.Id});");
190192
//throw;
191193
}
@@ -198,7 +200,7 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
198200

199201
public static async Task<string> InvokeScriptAsync(this WebView2 webview, string function, params object[] args)
200202
{
201-
var array = JsonConvert.SerializeObject(args);
203+
var array = JsonSerializer.Serialize(args, new JsonSerializerOptions() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });
202204
string result = null;
203205
// Tested and checked: this dispatch is required, even though the web view is in a different process
204206
await webview.DispatcherQueue.EnqueueAsync(async () =>
@@ -207,7 +209,7 @@ await webview.DispatcherQueue.EnqueueAsync(async () =>
207209
try
208210
{
209211
result = await webview.ExecuteScriptAsync(script).AsTask();
210-
result = JsonConvert.DeserializeObject<string>(result);
212+
result = JsonSerializer.Deserialize<string>(result);
211213
}
212214
catch (Exception ex)
213215
{

src/Files.App/Files.App.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@
7979
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
8080
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
8181
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.3233" />
82-
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
8382
<PackageReference Include="Sentry" Version="4.7.0" />
8483
<PackageReference Include="SevenZipSharp" Version="1.0.2" />
8584
<PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.1.8" />

0 commit comments

Comments
 (0)