From 9cd8735574ea7c5671982121d86eab8dd895b6a4 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Wed, 22 Feb 2023 08:54:52 -0800 Subject: [PATCH] fix(core): properly handle command not found error (#6341) --- core/tauri-macros/src/command/handler.rs | 1 - core/tauri/src/manager.rs | 4 ++-- core/tauri/src/window.rs | 27 ++++++++++++++++++------ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/tauri-macros/src/command/handler.rs b/core/tauri-macros/src/command/handler.rs index a05bb3590..822674153 100644 --- a/core/tauri-macros/src/command/handler.rs +++ b/core/tauri-macros/src/command/handler.rs @@ -59,7 +59,6 @@ impl From for proc_macro::TokenStream { match #cmd { #(stringify!(#commands) => #wrappers!(#paths, #invoke),)* _ => { - #invoke.resolver.reject(format!("command {} not found", #cmd)); return false; }, } diff --git a/core/tauri/src/manager.rs b/core/tauri/src/manager.rs index add0c8010..bbf8a23c4 100644 --- a/core/tauri/src/manager.rs +++ b/core/tauri/src/manager.rs @@ -1173,8 +1173,8 @@ mod test { } impl WindowManager { - pub fn run_invoke_handler(&self, invoke: Invoke) { - (self.inner.invoke_handler)(invoke); + pub fn run_invoke_handler(&self, invoke: Invoke) -> bool { + (self.inner.invoke_handler)(invoke) } pub fn run_on_page_load(&self, window: Window, payload: PageLoadPayload) { diff --git a/core/tauri/src/window.rs b/core/tauri/src/window.rs index 058076b7a..eb14c50bb 100644 --- a/core/tauri/src/window.rs +++ b/core/tauri/src/window.rs @@ -1487,16 +1487,20 @@ impl Window { .map(|c| c.to_string()) .unwrap_or_else(String::new); + let command = invoke.message.command.clone(); + let resolver = invoke.resolver.clone(); #[cfg(mobile)] - let (message, resolver) = (invoke.message.clone(), invoke.resolver.clone()); + let message = invoke.message.clone(); - #[allow(unused_variables)] - let handled = manager.extend_api(plugin, invoke); + #[allow(unused_mut)] + let mut handled = manager.extend_api(plugin, invoke); #[cfg(target_os = "ios")] { if !handled { + handled = true; let plugin = plugin.to_string(); + let (callback, error) = (resolver.callback, resolver.error); self.with_webview(move |webview| { unsafe { crate::ios::post_ipc_message( @@ -1515,6 +1519,8 @@ impl Window { #[cfg(target_os = "android")] { if !handled { + handled = true; + let resolver_ = resolver.clone(); let runtime_handle = self.app_handle.runtime_handle.clone(); let plugin = plugin.to_string(); self.with_webview(move |webview| { @@ -1566,19 +1572,28 @@ impl Window { &plugin, &runtime_handle, message, - (resolver.callback, resolver.error), + (resolver_.callback, resolver_.error), env, activity, webview, ) { - resolver.reject(format!("failed to reach Android layer: {e}")); + resolver_.reject(format!("failed to reach Android layer: {e}")); } }); })?; } } + + if !handled { + resolver.reject(format!("Command {command} not found")); + } } else { - manager.run_invoke_handler(invoke); + let command = invoke.message.command.clone(); + let resolver = invoke.resolver.clone(); + let handled = manager.run_invoke_handler(invoke); + if !handled { + resolver.reject(format!("Command {command} not found")); + } } } }