4
4
using CommunityToolkit . WinUI ;
5
5
using Microsoft . UI . Xaml . Controls ;
6
6
using Microsoft . Web . WebView2 . Core ;
7
- using Newtonsoft . Json ;
8
7
using System . Reflection ;
9
8
using System . Text ;
9
+ using System . Text . Encodings . Web ;
10
10
using Windows . Foundation ;
11
11
12
12
namespace Files . App . Extensions
@@ -36,14 +36,14 @@ private struct WebMessage
36
36
37
37
private struct MethodWebMessage
38
38
{
39
- public string Id { get ; set ; }
39
+ public long Id { get ; set ; }
40
40
public string Method { get ; set ; }
41
41
public string Args { get ; set ; }
42
42
}
43
43
44
44
private struct PropertyWebMessage
45
45
{
46
- public string Id { get ; set ; }
46
+ public long Id { get ; set ; }
47
47
public string Property { get ; set ; }
48
48
public PropertyAction Action { get ; set ; }
49
49
public string Value { get ; set ; }
@@ -101,14 +101,16 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
101
101
102
102
var handler = ( WebViewMessageReceivedHandler ) ( async ( _ , e ) =>
103
103
{
104
- var message = JsonConvert . DeserializeObject < WebMessage > ( e . TryGetWebMessageAsString ( ) ) ;
104
+ var message = JsonSerializer . Deserialize < WebMessage > ( e . TryGetWebMessageAsString ( ) , new JsonSerializerOptions ( ) { PropertyNameCaseInsensitive = true } ) ;
105
105
if ( message . Guid == methodsGuid )
106
106
{
107
- var methodMessage = JsonConvert . DeserializeObject < MethodWebMessage > ( e . TryGetWebMessageAsString ( ) ) ;
107
+
108
+ var methodMessage = JsonSerializer . Deserialize < MethodWebMessage > ( e . TryGetWebMessageAsString ( ) , new JsonSerializerOptions ( ) { PropertyNameCaseInsensitive = true } ) ;
108
109
var method = methods [ methodMessage . Method ] ;
109
110
try
110
111
{
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 ( ) ) ;
112
114
if ( result is object )
113
115
{
114
116
var resultType = result . GetType ( ) ;
@@ -152,19 +154,19 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
152
154
result = await task ;
153
155
}
154
156
}
155
- var json = JsonConvert . SerializeObject ( result ) ;
157
+ var json = JsonSerializer . Serialize ( result , new JsonSerializerOptions ( ) { Encoder = JavaScriptEncoder . UnsafeRelaxedJsonEscaping } ) ; ;
156
158
await webview . ExecuteScriptAsync ( $@ "{ name } ._callbacks.get({ methodMessage . Id } ).accept(JSON.parse({ json } )); { name } ._callbacks.delete({ methodMessage . Id } );") ;
157
159
}
158
160
catch ( Exception ex )
159
161
{
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 } ) ;
161
163
await webview . ExecuteScriptAsync ( $@ "{ name } ._callbacks.get({ methodMessage . Id } ).reject(JSON.parse({ json } )); { name } ._callbacks.delete({ methodMessage . Id } );") ;
162
164
//throw;
163
165
}
164
166
}
165
167
else if ( message . Guid == propertiesGuid )
166
168
{
167
- var propertyMessage = JsonConvert . DeserializeObject < PropertyWebMessage > ( e . TryGetWebMessageAsString ( ) ) ;
169
+ var propertyMessage = JsonSerializer . Deserialize < PropertyWebMessage > ( e . TryGetWebMessageAsString ( ) , new JsonSerializerOptions ( ) { PropertyNameCaseInsensitive = true } ) ;
168
170
var property = properties [ propertyMessage . Property ] ;
169
171
try
170
172
{
@@ -175,17 +177,17 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
175
177
}
176
178
else
177
179
{
178
- var value = JsonConvert . DeserializeObject ( propertyMessage . Value , property . PropertyType ) ;
180
+ var value = JsonSerializer . Deserialize ( propertyMessage . Value , property . PropertyType ) ;
179
181
property . SetValue ( @object , value ) ;
180
182
result = new object ( ) ;
181
183
}
182
184
183
- var json = JsonConvert . SerializeObject ( result ) ;
185
+ var json = JsonSerializer . Serialize ( result , new JsonSerializerOptions ( ) { Encoder = JavaScriptEncoder . UnsafeRelaxedJsonEscaping } ) ;
184
186
await webview . ExecuteScriptAsync ( $@ "{ name } ._callbacks.get({ propertyMessage . Id } ).accept(JSON.parse({ json } )); { name } ._callbacks.delete({ propertyMessage . Id } );") ;
185
187
}
186
188
catch ( Exception ex )
187
189
{
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 });
189
191
//await webview.ExecuteScriptAsync($@"{name}._callbacks.get({propertyMessage.Id}).reject(JSON.parse({json})); {name}._callbacks.delete({propertyMessage.Id});");
190
192
//throw;
191
193
}
@@ -198,7 +200,7 @@ public static async Task AddWebAllowedObject<T>(this WebView2 webview, string na
198
200
199
201
public static async Task < string > InvokeScriptAsync ( this WebView2 webview , string function , params object [ ] args )
200
202
{
201
- var array = JsonConvert . SerializeObject ( args ) ;
203
+ var array = JsonSerializer . Serialize ( args , new JsonSerializerOptions ( ) { Encoder = JavaScriptEncoder . UnsafeRelaxedJsonEscaping } ) ;
202
204
string result = null ;
203
205
// Tested and checked: this dispatch is required, even though the web view is in a different process
204
206
await webview . DispatcherQueue . EnqueueAsync ( async ( ) =>
@@ -207,7 +209,7 @@ await webview.DispatcherQueue.EnqueueAsync(async () =>
207
209
try
208
210
{
209
211
result = await webview . ExecuteScriptAsync ( script ) . AsTask ( ) ;
210
- result = JsonConvert . DeserializeObject < string > ( result ) ;
212
+ result = JsonSerializer . Deserialize < string > ( result ) ;
211
213
}
212
214
catch ( Exception ex )
213
215
{
0 commit comments