Browse Source

fix(core): deadlock on window event handler

Lucas Nogueira 3 years ago
parent
commit
4866404f04
1 changed files with 35 additions and 30 deletions
  1. 35 30
      core/tauri-runtime-wry/src/lib.rs

+ 35 - 30
core/tauri-runtime-wry/src/lib.rs

@@ -2024,40 +2024,45 @@ fn handle_user_message(
         }
       }
     }
-    Message::Webview(id, webview_message) => {
-      if let Some(WindowHandle::Webview(webview)) = windows
-        .lock()
-        .expect("poisoned webview collection")
-        .get(&id)
-        .map(|w| &w.inner)
-      {
-        match webview_message {
-          WebviewMessage::EvaluateScript(script) => {
-            if let Err(e) = webview.evaluate_script(&script) {
-              eprintln!("{}", e);
-            }
-          }
-          WebviewMessage::Print => {
-            let _ = webview.print();
+    Message::Webview(id, webview_message) => match webview_message {
+      WebviewMessage::EvaluateScript(script) => {
+        if let Some(WindowHandle::Webview(webview)) = windows
+          .lock()
+          .expect("poisoned webview collection")
+          .get(&id)
+          .map(|w| &w.inner)
+        {
+          if let Err(e) = webview.evaluate_script(&script) {
+            eprintln!("{}", e);
           }
-          WebviewMessage::WebviewEvent(event) => {
-            if let Some(event) = WindowEventWrapper::from(&event).0 {
-              for handler in window_event_listeners
-                .lock()
-                .unwrap()
-                .get(&id)
-                .unwrap()
-                .lock()
-                .unwrap()
-                .values()
-              {
-                handler(&event);
-              }
-            }
+        }
+      }
+      WebviewMessage::Print => {
+        if let Some(WindowHandle::Webview(webview)) = windows
+          .lock()
+          .expect("poisoned webview collection")
+          .get(&id)
+          .map(|w| &w.inner)
+        {
+          let _ = webview.print();
+        }
+      }
+      WebviewMessage::WebviewEvent(event) => {
+        if let Some(event) = WindowEventWrapper::from(&event).0 {
+          for handler in window_event_listeners
+            .lock()
+            .unwrap()
+            .get(&id)
+            .unwrap()
+            .lock()
+            .unwrap()
+            .values()
+          {
+            handler(&event);
           }
         }
       }
-    }
+    },
     Message::CreateWebview(handler, sender) => {
       if let Some(event_loop) = event_loop {
         match handler(event_loop, web_context) {