44using CommunityToolkit . WinUI ;
55using Microsoft . UI . Xaml . Controls ;
66using Microsoft . Web . WebView2 . Core ;
7- using Newtonsoft . Json ;
87using System . Reflection ;
98using System . Text ;
9+ using System . Text . Encodings . Web ;
1010using Windows . Foundation ;
1111
1212namespace 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 {
0 commit comments