Skip to content

Commit 551e062

Browse files
authored
refactor(core): remove responder from custom invoke systems (#11027)
* refactor(core): remove responder from custom invoke systems the responder can be set directly in the WebviewWindow::on_message call * fix tests
1 parent e7fd676 commit 551e062

File tree

6 files changed

+99
-118
lines changed

6 files changed

+99
-118
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri": patch:breaking
3+
---
4+
5+
Remove the `responder` part of a custom invoke system now that the responder can be set directly in the `tauri::WebviewWindow::on_message` function.

crates/tauri/src/app.rs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
use crate::{
66
image::Image,
77
ipc::{
8-
channel::ChannelDataIpcQueue, CallbackFn, CommandArg, CommandItem, Invoke, InvokeError,
9-
InvokeHandler, InvokeResponder, InvokeResponse,
8+
channel::ChannelDataIpcQueue, CommandArg, CommandItem, Invoke, InvokeError, InvokeHandler,
109
},
1110
manager::{webview::UriSchemeProtocol, AppManager, Asset},
1211
plugin::{Plugin, PluginStore},
@@ -1169,9 +1168,6 @@ pub struct Builder<R: Runtime> {
11691168
/// The JS message handler.
11701169
invoke_handler: Box<InvokeHandler<R>>,
11711170

1172-
/// The JS message responder.
1173-
invoke_responder: Option<Arc<InvokeResponder<R>>>,
1174-
11751171
/// The script that initializes the `window.__TAURI_INTERNALS__.postMessage` function.
11761172
pub(crate) invoke_initialization_script: String,
11771173

@@ -1248,7 +1244,6 @@ impl<R: Runtime> Builder<R> {
12481244
runtime_any_thread: false,
12491245
setup: Box::new(|_| Ok(())),
12501246
invoke_handler: Box::new(|_| false),
1251-
invoke_responder: None,
12521247
invoke_initialization_script: InvokeInitializationScript {
12531248
process_ipc_message_fn: crate::manager::webview::PROCESS_IPC_MESSAGE_FN,
12541249
os_name: std::env::consts::OS,
@@ -1312,8 +1307,6 @@ impl<R: Runtime> Builder<R> {
13121307

13131308
/// Defines a custom JS message system.
13141309
///
1315-
/// The `responder` is a function that will be called when a command has been executed and must send a response to the JS layer.
1316-
///
13171310
/// The `initialization_script` is a script that initializes `window.__TAURI_INTERNALS__.postMessage`.
13181311
/// That function must take the `(message: object, options: object)` arguments and send it to the backend.
13191312
///
@@ -1331,13 +1324,9 @@ impl<R: Runtime> Builder<R> {
13311324
///
13321325
/// Note that the implementation details is up to your implementation.
13331326
#[must_use]
1334-
pub fn invoke_system<F>(mut self, initialization_script: String, responder: F) -> Self
1335-
where
1336-
F: Fn(&Webview<R>, &str, &InvokeResponse, CallbackFn, CallbackFn) + Send + Sync + 'static,
1337-
{
1327+
pub fn invoke_system(mut self, initialization_script: String) -> Self {
13381328
self.invoke_initialization_script =
13391329
initialization_script.replace("__INVOKE_KEY__", &format!("\"{}\"", self.invoke_key));
1340-
self.invoke_responder.replace(Arc::new(responder));
13411330
self
13421331
}
13431332

@@ -1797,7 +1786,7 @@ tauri::Builder::default()
17971786
self.webview_event_listeners,
17981787
#[cfg(desktop)]
17991788
HashMap::new(),
1800-
(self.invoke_responder, self.invoke_initialization_script),
1789+
self.invoke_initialization_script,
18011790
self.invoke_key,
18021791
));
18031792

crates/tauri/src/ipc/protocol.rs

Lines changed: 87 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
325325
request,
326326
Box::new(move |webview, cmd, response, callback, error| {
327327
use crate::ipc::Channel;
328-
use crate::sealed::ManagerBase;
329328

330329
#[cfg(feature = "tracing")]
331330
let _respond_span = tracing::trace_span!(
@@ -334,104 +333,101 @@ fn handle_ipc_message<R: Runtime>(request: Request<String>, manager: &AppManager
334333
)
335334
.entered();
336335

337-
// the channel data command is the only command that uses a custom protocol on Linux
338-
if webview.manager().webview.invoke_responder.is_none() {
339-
fn responder_eval<R: Runtime>(
340-
webview: &crate::Webview<R>,
341-
js: crate::Result<String>,
342-
error: CallbackFn,
343-
) {
344-
let eval_js = match js {
345-
Ok(js) => js,
346-
Err(e) => crate::ipc::format_callback::format(error, &e.to_string())
347-
.expect("unable to serialize response error string to json"),
348-
};
349-
350-
let _ = webview.eval(&eval_js);
351-
}
336+
fn responder_eval<R: Runtime>(
337+
webview: &crate::Webview<R>,
338+
js: crate::Result<String>,
339+
error: CallbackFn,
340+
) {
341+
let eval_js = match js {
342+
Ok(js) => js,
343+
Err(e) => crate::ipc::format_callback::format(error, &e.to_string())
344+
.expect("unable to serialize response error string to json"),
345+
};
352346

353-
let can_use_channel_for_response = cmd
354-
!= crate::ipc::channel::FETCH_CHANNEL_DATA_COMMAND
355-
&& !options.custom_protocol_ipc_blocked;
347+
let _ = webview.eval(&eval_js);
348+
}
356349

357-
#[cfg(feature = "tracing")]
358-
let mime_type = match &response {
359-
InvokeResponse::Ok(InvokeResponseBody::Json(_)) => mime::APPLICATION_JSON,
360-
InvokeResponse::Ok(InvokeResponseBody::Raw(_)) => mime::APPLICATION_OCTET_STREAM,
361-
InvokeResponse::Err(_) => mime::APPLICATION_JSON,
362-
};
350+
let can_use_channel_for_response = cmd
351+
!= crate::ipc::channel::FETCH_CHANNEL_DATA_COMMAND
352+
&& !options.custom_protocol_ipc_blocked;
363353

364-
#[cfg(feature = "tracing")]
365-
let _response_span = match &response {
366-
InvokeResponse::Ok(InvokeResponseBody::Json(v)) => tracing::trace_span!(
367-
"ipc::request::response",
368-
response = v,
369-
mime_type = mime_type.essence_str()
370-
)
371-
.entered(),
372-
InvokeResponse::Ok(InvokeResponseBody::Raw(v)) => tracing::trace_span!(
373-
"ipc::request::response",
374-
response = format!("{v:?}"),
375-
mime_type = mime_type.essence_str()
376-
)
377-
.entered(),
378-
InvokeResponse::Err(e) => tracing::trace_span!(
379-
"ipc::request::response",
380-
response = format!("{e:?}"),
381-
mime_type = mime_type.essence_str()
382-
)
383-
.entered(),
384-
};
354+
#[cfg(feature = "tracing")]
355+
let mime_type = match &response {
356+
InvokeResponse::Ok(InvokeResponseBody::Json(_)) => mime::APPLICATION_JSON,
357+
InvokeResponse::Ok(InvokeResponseBody::Raw(_)) => mime::APPLICATION_OCTET_STREAM,
358+
InvokeResponse::Err(_) => mime::APPLICATION_JSON,
359+
};
385360

386-
match response {
387-
InvokeResponse::Ok(InvokeResponseBody::Json(v)) => {
388-
if !(cfg!(target_os = "macos") || cfg!(target_os = "ios"))
389-
&& (v.starts_with('{') || v.starts_with('['))
390-
&& can_use_channel_for_response
391-
{
392-
let _ = Channel::from_callback_fn(webview, callback)
393-
.send(InvokeResponseBody::Json(v));
394-
} else {
395-
responder_eval(
396-
&webview,
397-
crate::ipc::format_callback::format_result_raw(
398-
Result::<_, String>::Ok(v),
399-
callback,
400-
error,
401-
),
361+
#[cfg(feature = "tracing")]
362+
let _response_span = match &response {
363+
InvokeResponse::Ok(InvokeResponseBody::Json(v)) => tracing::trace_span!(
364+
"ipc::request::response",
365+
response = v,
366+
mime_type = mime_type.essence_str()
367+
)
368+
.entered(),
369+
InvokeResponse::Ok(InvokeResponseBody::Raw(v)) => tracing::trace_span!(
370+
"ipc::request::response",
371+
response = format!("{v:?}"),
372+
mime_type = mime_type.essence_str()
373+
)
374+
.entered(),
375+
InvokeResponse::Err(e) => tracing::trace_span!(
376+
"ipc::request::response",
377+
response = format!("{e:?}"),
378+
mime_type = mime_type.essence_str()
379+
)
380+
.entered(),
381+
};
382+
383+
match response {
384+
InvokeResponse::Ok(InvokeResponseBody::Json(v)) => {
385+
if !(cfg!(target_os = "macos") || cfg!(target_os = "ios"))
386+
&& (v.starts_with('{') || v.starts_with('['))
387+
&& can_use_channel_for_response
388+
{
389+
let _ =
390+
Channel::from_callback_fn(webview, callback).send(InvokeResponseBody::Json(v));
391+
} else {
392+
responder_eval(
393+
&webview,
394+
crate::ipc::format_callback::format_result_raw(
395+
Result::<_, String>::Ok(v),
396+
callback,
402397
error,
403-
)
404-
}
398+
),
399+
error,
400+
)
405401
}
406-
InvokeResponse::Ok(InvokeResponseBody::Raw(v)) => {
407-
if cfg!(target_os = "macos")
408-
|| cfg!(target_os = "ios")
409-
|| !can_use_channel_for_response
410-
{
411-
responder_eval(
412-
&webview,
413-
crate::ipc::format_callback::format_result(
414-
Result::<_, ()>::Ok(v),
415-
callback,
416-
error,
417-
),
402+
}
403+
InvokeResponse::Ok(InvokeResponseBody::Raw(v)) => {
404+
if cfg!(target_os = "macos")
405+
|| cfg!(target_os = "ios")
406+
|| !can_use_channel_for_response
407+
{
408+
responder_eval(
409+
&webview,
410+
crate::ipc::format_callback::format_result(
411+
Result::<_, ()>::Ok(v),
412+
callback,
418413
error,
419-
);
420-
} else {
421-
let _ = Channel::from_callback_fn(webview, callback)
422-
.send(InvokeResponseBody::Raw(v.clone()));
423-
}
424-
}
425-
InvokeResponse::Err(e) => responder_eval(
426-
&webview,
427-
crate::ipc::format_callback::format_result(
428-
Result::<(), _>::Err(&e.0),
429-
callback,
414+
),
430415
error,
431-
),
416+
);
417+
} else {
418+
let _ = Channel::from_callback_fn(webview, callback)
419+
.send(InvokeResponseBody::Raw(v.clone()));
420+
}
421+
}
422+
InvokeResponse::Err(e) => responder_eval(
423+
&webview,
424+
crate::ipc::format_callback::format_result(
425+
Result::<(), _>::Err(&e.0),
426+
callback,
432427
error,
433428
),
434-
}
429+
error,
430+
),
435431
}
436432
}),
437433
);
@@ -593,7 +589,7 @@ mod tests {
593589
Default::default(),
594590
Default::default(),
595591
Default::default(),
596-
(None, "".into()),
592+
"".into(),
597593
crate::generate_invoke_key().unwrap(),
598594
);
599595

@@ -706,7 +702,7 @@ mod tests {
706702
Default::default(),
707703
Default::default(),
708704
Default::default(),
709-
(None, "".into()),
705+
"".into(),
710706
crate::generate_invoke_key().unwrap(),
711707
);
712708

crates/tauri/src/manager/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use tauri_utils::{
2222
use crate::{
2323
app::{AppHandle, GlobalWebviewEventListener, GlobalWindowEventListener, OnPageLoad},
2424
event::{assert_event_name_is_valid, Event, EventId, EventTarget, Listeners},
25-
ipc::{Invoke, InvokeHandler, InvokeResponder, RuntimeAuthority},
25+
ipc::{Invoke, InvokeHandler, RuntimeAuthority},
2626
plugin::PluginStore,
2727
utils::{config::Config, PackageInfo},
2828
Assets, Context, Pattern, Runtime, StateManager, Window,
@@ -254,7 +254,7 @@ impl<R: Runtime> AppManager<R> {
254254
String,
255255
crate::app::GlobalMenuEventListener<Window<R>>,
256256
>,
257-
(invoke_responder, invoke_initialization_script): (Option<Arc<InvokeResponder<R>>>, String),
257+
invoke_initialization_script: String,
258258
invoke_key: String,
259259
) -> Self {
260260
// generate a random isolation key at runtime
@@ -276,7 +276,6 @@ impl<R: Runtime> AppManager<R> {
276276
on_page_load,
277277
uri_scheme_protocols: Mutex::new(uri_scheme_protocols),
278278
event_listeners: Arc::new(webiew_event_listeners),
279-
invoke_responder,
280279
invoke_initialization_script,
281280
invoke_key: invoke_key.clone(),
282281
},
@@ -731,7 +730,7 @@ mod test {
731730
Default::default(),
732731
Default::default(),
733732
Default::default(),
734-
(None, "".into()),
733+
"".into(),
735734
crate::generate_invoke_key().unwrap(),
736735
);
737736

crates/tauri/src/manager/webview.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use url::Url;
2121

2222
use crate::{
2323
app::{GlobalWebviewEventListener, OnPageLoad, UriSchemeResponder, WebviewEvent},
24-
ipc::{InvokeHandler, InvokeResponder},
24+
ipc::InvokeHandler,
2525
pattern::PatternJavascript,
2626
sealed::ManagerBase,
2727
webview::PageLoadPayload,
@@ -75,8 +75,6 @@ pub struct WebviewManager<R: Runtime> {
7575
/// Webview event listeners to all webviews.
7676
pub event_listeners: Arc<Vec<GlobalWebviewEventListener<R>>>,
7777

78-
/// Responder for invoke calls.
79-
pub invoke_responder: Option<Arc<InvokeResponder<R>>>,
8078
/// The script that initializes the invoke system.
8179
pub invoke_initialization_script: String,
8280

crates/tauri/src/webview/mod.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,17 +1136,11 @@ fn main() {
11361136
return;
11371137
}
11381138

1139-
let custom_responder = self.manager().webview.invoke_responder.clone();
1140-
11411139
let resolver = InvokeResolver::new(
11421140
self.clone(),
11431141
Arc::new(Mutex::new(Some(Box::new(
11441142
#[allow(unused_variables)]
11451143
move |webview: Webview<R>, cmd, response, callback, error| {
1146-
if let Some(responder) = &custom_responder {
1147-
(responder)(&webview, &cmd, &response, callback, error);
1148-
}
1149-
11501144
responder(webview, cmd, response, callback, error);
11511145
},
11521146
)))),

0 commit comments

Comments
 (0)