Преглед на файлове

fix(core): properly handle command not found error (#6341)

Lucas Fernandes Nogueira преди 2 години
родител
ревизия
9cd8735574
променени са 3 файла, в които са добавени 23 реда и са изтрити 9 реда
  1. 0 1
      core/tauri-macros/src/command/handler.rs
  2. 2 2
      core/tauri/src/manager.rs
  3. 21 6
      core/tauri/src/window.rs

+ 0 - 1
core/tauri-macros/src/command/handler.rs

@@ -59,7 +59,6 @@ impl From<Handler> for proc_macro::TokenStream {
       match #cmd {
         #(stringify!(#commands) => #wrappers!(#paths, #invoke),)*
         _ => {
-          #invoke.resolver.reject(format!("command {} not found", #cmd));
           return false;
         },
       }

+ 2 - 2
core/tauri/src/manager.rs

@@ -1173,8 +1173,8 @@ mod test {
 }
 
 impl<R: Runtime> WindowManager<R> {
-  pub fn run_invoke_handler(&self, invoke: Invoke<R>) {
-    (self.inner.invoke_handler)(invoke);
+  pub fn run_invoke_handler(&self, invoke: Invoke<R>) -> bool {
+    (self.inner.invoke_handler)(invoke)
   }
 
   pub fn run_on_page_load(&self, window: Window<R>, payload: PageLoadPayload) {

+ 21 - 6
core/tauri/src/window.rs

@@ -1487,16 +1487,20 @@ impl<R: Runtime> Window<R> {
             .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<R: Runtime> Window<R> {
           #[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<R: Runtime> Window<R> {
                     &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"));
+          }
         }
       }
     }