@@ -174,6 +174,7 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
174174
175175 use serde:: { Deserialize , Deserializer } ;
176176
177+ #[ derive( Default ) ]
177178 pub ( crate ) struct HeaderMap ( http:: HeaderMap ) ;
178179
179180 impl < ' de > Deserialize < ' de > for HeaderMap {
@@ -199,9 +200,13 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
199200 }
200201 }
201202
202- #[ derive( Deserialize ) ]
203+ #[ derive( Deserialize , Default ) ]
204+ #[ serde( rename_all = "camelCase" ) ]
203205 struct RequestOptions {
206+ #[ serde( default ) ]
204207 headers : HeaderMap ,
208+ #[ serde( default ) ]
209+ custom_protocol_ipc_blocked : bool ,
205210 }
206211
207212 #[ derive( Deserialize ) ]
@@ -260,13 +265,15 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
260265
261266 match message {
262267 Ok ( message) => {
268+ let options = message. options . unwrap_or_default ( ) ;
269+
263270 let request = InvokeRequest {
264271 cmd : message. cmd ,
265272 callback : message. callback ,
266273 error : message. error ,
267274 url : Url :: parse ( & request. uri ( ) . to_string ( ) ) . expect ( "invalid IPC request URL" ) ,
268275 body : message. payload . into ( ) ,
269- headers : message . options . map ( |o| o . headers . 0 ) . unwrap_or_default ( ) ,
276+ headers : options. headers . 0 ,
270277 invoke_key : message. invoke_key ,
271278 } ;
272279
@@ -293,9 +300,7 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
293300 . entered ( ) ;
294301
295302 // the channel data command is the only command that uses a custom protocol on Linux
296- if webview. manager ( ) . webview . invoke_responder . is_none ( )
297- && cmd != crate :: ipc:: channel:: FETCH_CHANNEL_DATA_COMMAND
298- {
303+ if webview. manager ( ) . webview . invoke_responder . is_none ( ) {
299304 fn responder_eval < R : Runtime > (
300305 webview : & crate :: Webview < R > ,
301306 js : crate :: Result < String > ,
@@ -310,6 +315,10 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
310315 let _ = webview. eval ( & eval_js) ;
311316 }
312317
318+ let can_use_channel_for_response = cmd
319+ != crate :: ipc:: channel:: FETCH_CHANNEL_DATA_COMMAND
320+ && !options. custom_protocol_ipc_blocked ;
321+
313322 #[ cfg( feature = "tracing" ) ]
314323 let _response_span = tracing:: trace_span!(
315324 "ipc::request::response" ,
@@ -327,6 +336,7 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
327336 InvokeResponse :: Ok ( InvokeBody :: Json ( v) ) => {
328337 if !( cfg ! ( target_os = "macos" ) || cfg ! ( target_os = "ios" ) )
329338 && matches ! ( v, JsonValue :: Object ( _) | JsonValue :: Array ( _) )
339+ && can_use_channel_for_response
330340 {
331341 let _ = Channel :: from_callback_fn ( webview, callback) . send ( v) ;
332342 } else {
@@ -338,7 +348,10 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
338348 }
339349 }
340350 InvokeResponse :: Ok ( InvokeBody :: Raw ( v) ) => {
341- if cfg ! ( target_os = "macos" ) || cfg ! ( target_os = "ios" ) {
351+ if cfg ! ( target_os = "macos" )
352+ || cfg ! ( target_os = "ios" )
353+ || !can_use_channel_for_response
354+ {
342355 responder_eval (
343356 & webview,
344357 format_callback_result ( Result :: < _ , ( ) > :: Ok ( v) , callback, error) ,
0 commit comments