소스 검색

feat(tauri-runtime-wry): allow window creation and closing on the main thread (#2668)

Lucas Fernandes Nogueira 3 년 전
부모
커밋
d24fd8d102

+ 1 - 1
.changes/main-thread-api-calls.md

@@ -3,4 +3,4 @@
 "tauri-runtime-wry": patch
 ---
 
-Allow window, global shortcut and clipboard APIs to be called on the main thread (except window's `close` and `create_window`).
+Allow window, global shortcut and clipboard APIs to be called on the main thread.

+ 230 - 255
core/tauri-runtime-wry/src/lib.rs

@@ -92,6 +92,7 @@ use std::{
   convert::TryFrom,
   fmt,
   fs::read,
+  ops::Deref,
   path::PathBuf,
   sync::{
     mpsc::{channel, Sender},
@@ -117,52 +118,47 @@ pub type MenuEventHandler = Box<dyn Fn(&MenuEvent) + Send>;
 pub type MenuEventListeners = Arc<Mutex<HashMap<WindowId, WindowMenuEventListeners>>>;
 pub type WindowMenuEventListeners = Arc<Mutex<HashMap<Uuid, MenuEventHandler>>>;
 
-macro_rules! window_getter {
-  ($self: ident, $message: expr) => {{
-    let (tx, rx) = channel();
-    getter!($self, rx, Message::Window($self.window_id, $message(tx)))
+macro_rules! getter {
+  ($self: ident, $rx: expr, $message: expr) => {{
+    send_user_message(&$self.context, $message)?;
+    $rx.recv().unwrap()
   }};
 }
 
-macro_rules! send_user_message {
+macro_rules! window_getter {
   ($self: ident, $message: expr) => {{
-    if current_thread().id() == $self.context.main_thread_id {
-      handle_user_message(
-        &mut ControlFlow::Wait,
-        None,
-        $message,
-        UserMessageContext {
-          callback: None,
-          window_event_listeners: &$self.context.window_event_listeners,
-          global_shortcut_manager: $self.context.main_thread.global_shortcut_manager.clone(),
-          clipboard_manager: $self.context.main_thread.clipboard_manager.clone(),
-          menu_event_listeners: &$self.context.menu_event_listeners,
-          windows: $self.context.main_thread.windows.clone(),
-          #[cfg(feature = "system-tray")]
-          tray_context: &$self.context.main_thread.tray_context,
-        },
-        &$self.context.main_thread.web_context,
-      );
-      Ok(())
-    } else {
-      $self
-        .context
-        .proxy
-        .send_event($message)
-        .map_err(|_| Error::FailedToSendMessage)
-    }
+    let (tx, rx) = channel();
+    getter!($self, rx, Message::Window($self.window_id, $message(tx)))
   }};
 }
 
-macro_rules! getter {
-  ($self: ident, $rx: expr, $message: expr) => {{
-    send_user_message!($self, $message)?;
-    $rx.recv().unwrap()
-  }};
+fn send_user_message(context: &Context, message: Message) -> Result<()> {
+  if current_thread().id() == context.main_thread_id {
+    handle_user_message(
+      &context.main_thread.window_target,
+      message,
+      UserMessageContext {
+        window_event_listeners: &context.window_event_listeners,
+        global_shortcut_manager: context.main_thread.global_shortcut_manager.clone(),
+        clipboard_manager: context.main_thread.clipboard_manager.clone(),
+        menu_event_listeners: &context.menu_event_listeners,
+        windows: context.main_thread.windows.clone(),
+        #[cfg(feature = "system-tray")]
+        tray_context: &context.main_thread.tray_context,
+      },
+      &context.main_thread.web_context,
+    );
+    Ok(())
+  } else {
+    context
+      .proxy
+      .send_event(message)
+      .map_err(|_| Error::FailedToSendMessage)
+  }
 }
 
 #[derive(Clone)]
-struct EventLoopContext {
+struct Context {
   main_thread_id: ThreadId,
   proxy: EventLoopProxy<Message>,
   window_event_listeners: WindowEventListeners,
@@ -170,9 +166,23 @@ struct EventLoopContext {
   main_thread: DispatcherMainThreadContext,
 }
 
-impl fmt::Debug for EventLoopContext {
+#[derive(Debug, Clone)]
+struct DispatcherMainThreadContext {
+  window_target: EventLoopWindowTarget<Message>,
+  web_context: WebContextStore,
+  global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
+  clipboard_manager: Arc<Mutex<Clipboard>>,
+  windows: Arc<Mutex<HashMap<WindowId, WindowWrapper>>>,
+  #[cfg(feature = "system-tray")]
+  tray_context: TrayContext,
+}
+
+// the main thread context is only used on the main thread
+unsafe impl Send for DispatcherMainThreadContext {}
+
+impl fmt::Debug for Context {
   fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-    f.debug_struct("EventLoopContext")
+    f.debug_struct("Context")
       .field("main_thread_id", &self.main_thread_id)
       .field("proxy", &self.proxy)
       .field("main_thread", &self.main_thread)
@@ -372,7 +382,7 @@ unsafe impl Send for GlobalShortcutWrapper {}
 /// Wrapper around [`WryShortcutManager`].
 #[derive(Clone)]
 pub struct GlobalShortcutManagerHandle {
-  context: EventLoopContext,
+  context: Context,
   shortcuts: Arc<Mutex<HashMap<String, (AcceleratorId, GlobalShortcutWrapper)>>>,
   listeners: GlobalShortcutListeners,
 }
@@ -447,7 +457,7 @@ impl GlobalShortcutManager for GlobalShortcutManagerHandle {
 
 #[derive(Debug, Clone)]
 pub struct ClipboardManagerWrapper {
-  context: EventLoopContext,
+  context: Context,
 }
 
 impl ClipboardManager for ClipboardManagerWrapper {
@@ -1005,34 +1015,17 @@ pub enum Message {
   Clipboard(ClipboardMessage),
 }
 
-#[derive(Clone)]
-struct DispatcherContext {
-  main_thread_id: ThreadId,
-  proxy: EventLoopProxy<Message>,
-  window_event_listeners: WindowEventListeners,
-  menu_event_listeners: MenuEventListeners,
-  main_thread: DispatcherMainThreadContext,
-}
-
-#[derive(Debug, Clone)]
-struct DispatcherMainThreadContext {
-  web_context: WebContextStore,
-  global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
-  clipboard_manager: Arc<Mutex<Clipboard>>,
-  windows: Arc<Mutex<HashMap<WindowId, WindowWrapper>>>,
-  #[cfg(feature = "system-tray")]
-  tray_context: TrayContext,
-}
-
-// the main thread context is only used on the main thread
-unsafe impl Send for DispatcherMainThreadContext {}
-
-impl fmt::Debug for DispatcherContext {
-  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-    f.debug_struct("DispatcherContext")
-      .field("main_thread_id", &self.main_thread_id)
-      .field("proxy", &self.proxy)
-      .finish()
+impl Clone for Message {
+  fn clone(&self) -> Self {
+    match self {
+      Self::Window(i, m) => Self::Window(*i, m.clone()),
+      Self::Webview(i, m) => Self::Webview(*i, m.clone()),
+      #[cfg(feature = "system-tray")]
+      Self::Tray(m) => Self::Tray(m.clone()),
+      Self::GlobalShortcut(m) => Self::GlobalShortcut(m.clone()),
+      Self::Clipboard(m) => Self::Clipboard(m.clone()),
+      _ => unimplemented!(),
+    }
   }
 }
 
@@ -1040,7 +1033,7 @@ impl fmt::Debug for DispatcherContext {
 #[derive(Debug, Clone)]
 pub struct WryDispatcher {
   window_id: WindowId,
-  context: DispatcherContext,
+  context: Context,
 }
 
 impl Dispatch for WryDispatcher {
@@ -1048,7 +1041,7 @@ impl Dispatch for WryDispatcher {
   type WindowBuilder = WindowBuilderWrapper;
 
   fn run_on_main_thread<F: FnOnce() + Send + 'static>(&self, f: F) -> Result<()> {
-    send_user_message!(self, Message::Task(Box::new(f)))
+    send_user_message(&self.context, Message::Task(Box::new(f)))
   }
 
   fn on_window_event<F: Fn(&WindowEvent) + Send + 'static>(&self, f: F) -> Uuid {
@@ -1175,19 +1168,19 @@ impl Dispatch for WryDispatcher {
   }
 
   fn print(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Webview(self.window_id, WebviewMessage::Print)
+    send_user_message(
+      &self.context,
+      Message::Webview(self.window_id, WebviewMessage::Print),
     )
   }
 
   fn request_user_attention(&self, request_type: Option<UserAttentionType>) -> Result<()> {
-    send_user_message!(
-      self,
+    send_user_message(
+      &self.context,
       Message::Window(
         self.window_id,
         WindowMessage::RequestUserAttention(request_type.map(Into::into)),
-      )
+      ),
     )
   }
 
@@ -1197,24 +1190,19 @@ impl Dispatch for WryDispatcher {
     &mut self,
     pending: PendingWindow<Self::Runtime>,
   ) -> Result<DetachedWindow<Self::Runtime>> {
-    if current_thread().id() == self.context.main_thread_id {
-      panic!("This API cannot be called on the main thread. Try using `std::thread::spawn` or `tauri::async_runtime::spawn`.");
-    }
-
     let (tx, rx) = channel();
     let label = pending.label.clone();
     let context = self.context.clone();
 
-    self
-      .context
-      .proxy
-      .send_event(Message::CreateWebview(
+    send_user_message(
+      &self.context,
+      Message::CreateWebview(
         Box::new(move |event_loop, web_context| {
           create_webview(event_loop, web_context, context, pending)
         }),
         tx,
-      ))
-      .map_err(|_| Error::FailedToSendMessage)?;
+      ),
+    )?;
     let window_id = rx.recv().unwrap();
 
     let dispatcher = WryDispatcher {
@@ -1225,73 +1213,77 @@ impl Dispatch for WryDispatcher {
   }
 
   fn set_resizable(&self, resizable: bool) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetResizable(resizable),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetResizable(resizable)),
     )
   }
 
   fn set_title<S: Into<String>>(&self, title: S) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetTitle(title.into()),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetTitle(title.into())),
     )
   }
 
   fn maximize(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::Maximize)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::Maximize),
     )
   }
 
   fn unmaximize(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::Unmaximize)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::Unmaximize),
     )
   }
 
   fn minimize(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::Minimize)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::Minimize),
     )
   }
 
   fn unminimize(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::Unminimize)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::Unminimize),
     )
   }
 
   fn show_menu(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::ShowMenu)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::ShowMenu),
     )
   }
 
   fn hide_menu(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::HideMenu)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::HideMenu),
     )
   }
 
   fn show(&self) -> Result<()> {
-    send_user_message!(self, Message::Window(self.window_id, WindowMessage::Show))
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::Show),
+    )
   }
 
   fn hide(&self) -> Result<()> {
-    send_user_message!(self, Message::Window(self.window_id, WindowMessage::Hide))
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::Hide),
+    )
   }
 
   fn close(&self) -> Result<()> {
-    if current_thread().id() == self.context.main_thread_id {
-      panic!("This API cannot be called on the main thread. Try using `std::thread::spawn` or `tauri::async_runtime::spawn`.");
-    }
+    // NOTE: close cannot use the `send_user_message` function because it accesses the event loop callback
     self
       .context
       .proxy
@@ -1300,99 +1292,99 @@ impl Dispatch for WryDispatcher {
   }
 
   fn set_decorations(&self, decorations: bool) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetDecorations(decorations),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetDecorations(decorations)),
     )
   }
 
   fn set_always_on_top(&self, always_on_top: bool) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetAlwaysOnTop(always_on_top),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetAlwaysOnTop(always_on_top)),
     )
   }
 
   fn set_size(&self, size: Size) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetSize(size),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetSize(size)),
     )
   }
 
   fn set_min_size(&self, size: Option<Size>) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetMinSize(size),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetMinSize(size)),
     )
   }
 
   fn set_max_size(&self, size: Option<Size>) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetMaxSize(size),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetMaxSize(size)),
     )
   }
 
   fn set_position(&self, position: Position) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetPosition(position),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetPosition(position)),
     )
   }
 
   fn set_fullscreen(&self, fullscreen: bool) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetFullscreen(fullscreen),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetFullscreen(fullscreen)),
     )
   }
 
   fn set_focus(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetFocus)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetFocus),
     )
   }
 
   fn set_icon(&self, icon: Icon) -> Result<()> {
-    send_user_message!(
-      self,
+    send_user_message(
+      &self.context,
       Message::Window(
         self.window_id,
         WindowMessage::SetIcon(WryIcon::try_from(icon)?.0),
-      )
+      ),
     )
   }
 
   fn set_skip_taskbar(&self, skip: bool) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::SetSkipTaskbar(skip),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetSkipTaskbar(skip)),
     )
   }
 
   fn start_dragging(&self) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::DragWindow)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::DragWindow),
     )
   }
 
   fn eval_script<S: Into<String>>(&self, script: S) -> Result<()> {
-    send_user_message!(
-      self,
+    send_user_message(
+      &self.context,
       Message::Webview(
         self.window_id,
         WebviewMessage::EvaluateScript(script.into()),
-      )
+      ),
     )
   }
 
   fn update_menu_item(&self, id: u16, update: MenuUpdate) -> Result<()> {
-    send_user_message!(
-      self,
-      Message::Window(self.window_id, WindowMessage::UpdateMenuItem(id, update),)
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::UpdateMenuItem(id, update)),
     )
   }
 }
@@ -1460,7 +1452,7 @@ pub struct Wry {
 /// A handle to the Wry runtime.
 #[derive(Debug, Clone)]
 pub struct WryHandle {
-  dispatcher_context: DispatcherContext,
+  context: Context,
 }
 
 impl WryHandle {
@@ -1469,22 +1461,15 @@ impl WryHandle {
     &self,
     f: F,
   ) -> Result<Weak<Window>> {
-    if current_thread().id() == self.dispatcher_context.main_thread_id {
-      panic!("This API cannot be called on the main thread. Try using `std::thread::spawn` or `tauri::async_runtime::spawn`.");
-    }
     let (tx, rx) = channel();
-    self
-      .dispatcher_context
-      .proxy
-      .send_event(Message::CreateWindow(Box::new(f), tx))
-      .map_err(|_| Error::FailedToSendMessage)?;
+    send_user_message(&self.context, Message::CreateWindow(Box::new(f), tx))?;
     rx.recv().unwrap()
   }
 
   /// Send a message to the event loop.
   pub fn send_event(&self, message: Message) -> Result<()> {
     self
-      .dispatcher_context
+      .context
       .proxy
       .send_event(message)
       .map_err(|_| Error::FailedToSendMessage)?;
@@ -1503,22 +1488,21 @@ impl RuntimeHandle for WryHandle {
   ) -> Result<DetachedWindow<Self::Runtime>> {
     let (tx, rx) = channel();
     let label = pending.label.clone();
-    let dispatcher_context = self.dispatcher_context.clone();
-    self
-      .dispatcher_context
-      .proxy
-      .send_event(Message::CreateWebview(
+    let context = self.context.clone();
+    send_user_message(
+      &self.context,
+      Message::CreateWebview(
         Box::new(move |event_loop, web_context| {
-          create_webview(event_loop, web_context, dispatcher_context, pending)
+          create_webview(event_loop, web_context, context, pending)
         }),
         tx,
-      ))
-      .map_err(|_| Error::FailedToSendMessage)?;
+      ),
+    )?;
     let window_id = rx.recv().unwrap();
 
     let dispatcher = WryDispatcher {
       window_id,
-      context: self.dispatcher_context.clone(),
+      context: self.context.clone(),
     };
     Ok(DetachedWindow { label, dispatcher })
   }
@@ -1552,12 +1536,13 @@ impl Runtime for Wry {
     #[cfg(feature = "system-tray")]
     let tray_context = TrayContext::default();
 
-    let event_loop_context = EventLoopContext {
+    let event_loop_context = Context {
       main_thread_id,
       proxy,
       window_event_listeners: window_event_listeners.clone(),
       menu_event_listeners: menu_event_listeners.clone(),
       main_thread: DispatcherMainThreadContext {
+        window_target: event_loop.deref().clone(),
         web_context: web_context.clone(),
         global_shortcut_manager: global_shortcut_manager.clone(),
         clipboard_manager: clipboard_manager.clone(),
@@ -1594,12 +1579,13 @@ impl Runtime for Wry {
 
   fn handle(&self) -> Self::Handle {
     WryHandle {
-      dispatcher_context: DispatcherContext {
+      context: Context {
         main_thread_id: self.main_thread_id,
         proxy: self.event_loop.create_proxy(),
         window_event_listeners: self.window_event_listeners.clone(),
         menu_event_listeners: self.menu_event_listeners.clone(),
         main_thread: DispatcherMainThreadContext {
+          window_target: self.event_loop.deref().clone(),
           web_context: self.web_context.clone(),
           global_shortcut_manager: self.global_shortcut_manager.clone(),
           clipboard_manager: self.clipboard_manager.clone(),
@@ -1625,12 +1611,13 @@ impl Runtime for Wry {
     let webview = create_webview(
       &self.event_loop,
       &self.web_context,
-      DispatcherContext {
+      Context {
         main_thread_id: self.main_thread_id,
         proxy: proxy.clone(),
         window_event_listeners: self.window_event_listeners.clone(),
         menu_event_listeners: self.menu_event_listeners.clone(),
         main_thread: DispatcherMainThreadContext {
+          window_target: self.event_loop.deref().clone(),
           web_context: self.web_context.clone(),
           global_shortcut_manager: self.global_shortcut_manager.clone(),
           clipboard_manager: self.clipboard_manager.clone(),
@@ -1682,12 +1669,13 @@ impl Runtime for Wry {
 
     let dispatcher = WryDispatcher {
       window_id: webview.inner.window().id(),
-      context: DispatcherContext {
+      context: Context {
         main_thread_id: self.main_thread_id,
         proxy,
         window_event_listeners: self.window_event_listeners.clone(),
         menu_event_listeners: self.menu_event_listeners.clone(),
         main_thread: DispatcherMainThreadContext {
+          window_target: self.event_loop.deref().clone(),
           web_context: self.web_context.clone(),
           global_shortcut_manager: self.global_shortcut_manager.clone(),
           clipboard_manager: self.clipboard_manager.clone(),
@@ -1858,7 +1846,6 @@ struct EventLoopIterationContext<'a> {
 }
 
 struct UserMessageContext<'a> {
-  callback: Option<&'a mut (dyn FnMut(RunEvent) + 'static)>,
   window_event_listeners: &'a WindowEventListeners,
   global_shortcut_manager: Arc<Mutex<WryShortcutManager>>,
   clipboard_manager: Arc<Mutex<Clipboard>>,
@@ -1869,14 +1856,12 @@ struct UserMessageContext<'a> {
 }
 
 fn handle_user_message(
-  control_flow: &mut ControlFlow,
-  event_loop: Option<&EventLoopWindowTarget<Message>>,
+  event_loop: &EventLoopWindowTarget<Message>,
   message: Message,
   context: UserMessageContext<'_>,
   web_context: &WebContextStore,
 ) -> RunIteration {
   let UserMessageContext {
-    callback,
     window_event_listeners,
     menu_event_listeners,
     global_shortcut_manager,
@@ -1959,19 +1944,7 @@ fn handle_user_message(
           WindowMessage::HideMenu => window.hide_menu(),
           WindowMessage::Show => window.set_visible(true),
           WindowMessage::Hide => window.set_visible(false),
-          WindowMessage::Close => {
-            if let Some(callback) = callback {
-              on_window_close(
-                callback,
-                id,
-                windows.lock().expect("poisoned webview collection"),
-                control_flow,
-                #[cfg(target_os = "linux")]
-                window_event_listeners,
-                menu_event_listeners.clone(),
-              );
-            }
-          }
+          WindowMessage::Close => panic!("cannot handle `WindowMessage::Close` on the main thread"),
           WindowMessage::SetDecorations(decorations) => window.set_decorations(decorations),
           WindowMessage::SetAlwaysOnTop(always_on_top) => window.set_always_on_top(always_on_top),
           WindowMessage::SetSize(size) => {
@@ -2063,55 +2036,47 @@ fn handle_user_message(
         }
       }
     },
-    Message::CreateWebview(handler, sender) => {
-      if let Some(event_loop) = event_loop {
-        match handler(event_loop, web_context) {
-          Ok(webview) => {
-            let window_id = webview.inner.window().id();
-            windows
-              .lock()
-              .expect("poisoned webview collection")
-              .insert(window_id, webview);
-            sender.send(window_id).unwrap();
-          }
-          Err(e) => {
-            eprintln!("{}", e);
-          }
-        }
+    Message::CreateWebview(handler, sender) => match handler(event_loop, web_context) {
+      Ok(webview) => {
+        let window_id = webview.inner.window().id();
+        windows
+          .lock()
+          .expect("poisoned webview collection")
+          .insert(window_id, webview);
+        sender.send(window_id).unwrap();
       }
-    }
+      Err(e) => {
+        eprintln!("{}", e);
+      }
+    },
     Message::CreateWindow(handler, sender) => {
-      if let Some(event_loop) = event_loop {
-        let (label, builder) = handler();
-        if let Ok(window) = builder.build(event_loop) {
-          let window_id = window.id();
+      let (label, builder) = handler();
+      if let Ok(window) = builder.build(event_loop) {
+        let window_id = window.id();
 
-          context
-            .window_event_listeners
-            .lock()
-            .unwrap()
-            .insert(window.id(), WindowEventListenersMap::default());
+        window_event_listeners
+          .lock()
+          .unwrap()
+          .insert(window.id(), WindowEventListenersMap::default());
 
-          context
-            .menu_event_listeners
-            .lock()
-            .unwrap()
-            .insert(window.id(), WindowMenuEventListeners::default());
+        menu_event_listeners
+          .lock()
+          .unwrap()
+          .insert(window.id(), WindowMenuEventListeners::default());
 
-          let w = Arc::new(window);
+        let w = Arc::new(window);
 
-          windows.lock().expect("poisoned webview collection").insert(
-            window_id,
-            WindowWrapper {
-              label,
-              inner: WindowHandle::Window(w.clone()),
-              menu_items: Default::default(),
-            },
-          );
-          sender.send(Ok(Arc::downgrade(&w))).unwrap();
-        } else {
-          sender.send(Err(Error::CreateWindow)).unwrap();
-        }
+        windows.lock().expect("poisoned webview collection").insert(
+          window_id,
+          WindowWrapper {
+            label,
+            inner: WindowHandle::Window(w.clone()),
+            menu_items: Default::default(),
+          },
+        );
+        sender.send(Ok(Arc::downgrade(&w))).unwrap();
+      } else {
+        sender.send(Err(Error::CreateWindow)).unwrap();
       }
     }
 
@@ -2361,22 +2326,32 @@ fn handle_event_loop(
       }
     }
     Event::UserEvent(message) => {
-      return handle_user_message(
-        control_flow,
-        Some(event_loop),
-        message,
-        UserMessageContext {
-          callback: Some(callback),
+      if let Message::Window(id, WindowMessage::Close) = message {
+        on_window_close(
+          callback,
+          id,
+          windows.lock().expect("poisoned webview collection"),
+          control_flow,
+          #[cfg(target_os = "linux")]
           window_event_listeners,
-          global_shortcut_manager,
-          clipboard_manager,
-          menu_event_listeners,
-          windows,
-          #[cfg(feature = "system-tray")]
-          tray_context,
-        },
-        web_context,
-      )
+          menu_event_listeners.clone(),
+        );
+      } else {
+        return handle_user_message(
+          event_loop,
+          message,
+          UserMessageContext {
+            window_event_listeners,
+            global_shortcut_manager,
+            clipboard_manager,
+            menu_event_listeners,
+            windows,
+            #[cfg(feature = "system-tray")]
+            tray_context,
+          },
+          web_context,
+        );
+      }
     }
     _ => (),
   }
@@ -2515,7 +2490,7 @@ fn to_wry_menu(
 fn create_webview(
   event_loop: &EventLoopWindowTarget<Message>,
   web_context: &WebContextStore,
-  context: DispatcherContext,
+  context: Context,
   pending: PendingWindow<Wry>,
 ) -> Result<WindowWrapper> {
   #[allow(unused_mut)]
@@ -2617,7 +2592,7 @@ fn create_webview(
 
 /// Create a wry rpc handler from a tauri rpc handler.
 fn create_rpc_handler(
-  context: DispatcherContext,
+  context: Context,
   label: String,
   handler: WebviewRpcHandler<Wry>,
 ) -> Box<dyn Fn(&Window, WryRpcRequest) -> Option<RpcResponse> + 'static> {
@@ -2638,7 +2613,7 @@ fn create_rpc_handler(
 
 /// Create a wry file drop handler from a tauri file drop handler.
 fn create_file_drop_handler(
-  context: DispatcherContext,
+  context: Context,
   label: String,
   handler: FileDropHandler<Wry>,
 ) -> Box<dyn Fn(&Window, WryFileDropEvent) -> bool + 'static> {

+ 0 - 7
core/tauri/src/app.rs

@@ -324,13 +324,6 @@ macro_rules! shared_app_impl {
   ($app: ty) => {
     impl<R: Runtime> $app {
       /// Creates a new webview window.
-      ///
-      /// # Panics
-      ///
-      /// - Panics if the event loop is not running yet, usually when called on the [`setup`](crate::Builder#method.setup) closure.
-      /// - Panics when called on the main thread, usually on the [`run`](crate::App#method.run) closure.
-      ///
-      /// You can spawn a task to use the API using [`crate::async_runtime::spawn`] or [`std::thread::spawn`] to prevent the panic.
       pub fn create_window<F>(
         &self,
         label: impl Into<String>,

+ 0 - 7
core/tauri/src/window.rs

@@ -155,13 +155,6 @@ impl<R: Runtime> Window<R> {
   }
 
   /// Creates a new webview window.
-  ///
-  /// # Panics
-  ///
-  /// - Panics if the event loop is not running yet, usually when called on the [`setup`](crate::Builder#method.setup) closure.
-  /// - Panics when called on the main thread, usually on the [`run`](crate::App#method.run) closure.
-  ///
-  /// You can spawn a task to use the API using [`crate::async_runtime::spawn`] or [`std::thread::spawn`] to prevent the panic.
   pub fn create_window<F>(
     &mut self,
     label: String,

+ 40 - 47
examples/api/src-tauri/Cargo.lock

@@ -359,7 +359,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -569,7 +569,7 @@ dependencies = [
  "proc-macro2",
  "quote 1.0.9",
  "smallvec",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -579,7 +579,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
 dependencies = [
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -603,7 +603,7 @@ dependencies = [
  "proc-macro2",
  "quote 1.0.9",
  "strsim 0.9.3",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -614,7 +614,7 @@ checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
 dependencies = [
  "darling_core",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -645,7 +645,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -658,7 +658,7 @@ dependencies = [
  "proc-macro2",
  "quote 1.0.9",
  "rustc_version",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -753,7 +753,7 @@ checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -913,7 +913,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1135,7 +1135,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1246,7 +1246,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1284,7 +1284,7 @@ dependencies = [
  "markup5ever",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1464,9 +1464,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 [[package]]
 name = "libc"
-version = "0.2.102"
+version = "0.2.103"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103"
+checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6"
 
 [[package]]
 name = "lock_api"
@@ -1546,12 +1546,6 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
 
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-
 [[package]]
 name = "memchr"
 version = "2.4.1"
@@ -1657,7 +1651,7 @@ dependencies = [
  "proc-macro-crate 0.1.5",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1764,7 +1758,7 @@ dependencies = [
  "proc-macro-crate 1.1.0",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2012,7 +2006,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2026,7 +2020,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2061,9 +2055,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
 [[package]]
 name = "pkg-config"
-version = "0.3.19"
+version = "0.3.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb"
 
 [[package]]
 name = "png"
@@ -2142,7 +2136,7 @@ dependencies = [
  "proc-macro-error-attr",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "version_check",
 ]
 
@@ -2551,7 +2545,7 @@ checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2573,7 +2567,7 @@ checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2746,7 +2740,7 @@ dependencies = [
  "heck",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2758,7 +2752,7 @@ dependencies = [
  "heck",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2774,9 +2768,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "1.0.76"
+version = "1.0.77"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84"
+checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
@@ -2828,7 +2822,7 @@ dependencies = [
 [[package]]
 name = "tao"
 version = "0.5.2"
-source = "git+https://github.com/tauri-apps/tao?branch=next#e1e9b61993e18422efa7810a17ed1aaa2000621a"
+source = "git+https://github.com/tauri-apps/tao?branch=next#69ee3f1474007c6e6acc20bcfc71ed3f43ca5414"
 dependencies = [
  "bitflags 1.3.2",
  "cairo-rs",
@@ -2980,7 +2974,7 @@ version = "1.0.0-beta.5"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "tauri-codegen",
 ]
 
@@ -3098,7 +3092,7 @@ checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -3122,9 +3116,9 @@ dependencies = [
 
 [[package]]
 name = "tinyvec"
-version = "1.4.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5241dd6f21443a3606b432718b166d3cedc962fd4b8bea54a8bc7f514ebda986"
+checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -3322,7 +3316,7 @@ dependencies = [
  "log",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "wasm-bindgen-shared",
 ]
 
@@ -3356,7 +3350,7 @@ checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3442,7 +3436,7 @@ checksum = "2eba35fdbb8fbc8de7e7479532a356dbbf2754d8a6e9c9fbfa430896cbb1ca89"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -3531,7 +3525,7 @@ version = "0.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5566b8c51118769e4a9094a688bf1233a3f36aacbfc78f3b15817fe0b6e0442f"
 dependencies = [
- "syn 1.0.76",
+ "syn 1.0.77",
  "windows_gen",
  "windows_quote",
  "windows_reader",
@@ -3610,13 +3604,12 @@ dependencies = [
 
 [[package]]
 name = "x11-dl"
-version = "2.19.0"
+version = "2.19.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eab1e810da9042813865ebe3477261aa77d1f2241f6be747ef8c0e442bc1fa3"
+checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59"
 dependencies = [
  "lazy_static",
  "libc",
- "maybe-uninit",
  "pkg-config",
 ]
 
@@ -3670,7 +3663,7 @@ dependencies = [
  "proc-macro-crate 0.1.5",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -3738,5 +3731,5 @@ dependencies = [
  "proc-macro-crate 1.1.0",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]

+ 125 - 107
examples/updater/src-tauri/Cargo.lock

@@ -341,37 +341,6 @@ dependencies = [
  "objc",
 ]
 
-[[package]]
-name = "com"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a30a2b2a013da986dc5cc3eda3d19c0d59d53f835be1b2356eb8d00f000c793"
-dependencies = [
- "com_macros",
-]
-
-[[package]]
-name = "com_macros"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7606b05842fea68ddcc89e8053b8860ebcb2a0ba8d6abfe3a148e5d5a8d3f0c1"
-dependencies = [
- "com_macros_support",
- "proc-macro2",
- "syn 1.0.76",
-]
-
-[[package]]
-name = "com_macros_support"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97e9a6d20f4ac8830e309a455d7e9416e65c6af5a97c88c55fbb4c2012e107da"
-dependencies = [
- "proc-macro2",
- "quote 1.0.9",
- "syn 1.0.76",
-]
-
 [[package]]
 name = "concurrent-queue"
 version = "1.2.2"
@@ -381,6 +350,12 @@ dependencies = [
  "cache-padded",
 ]
 
+[[package]]
+name = "const-sha1"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d"
+
 [[package]]
 name = "constant_time_eq"
 version = "0.1.5"
@@ -542,7 +517,7 @@ dependencies = [
  "proc-macro2",
  "quote 1.0.9",
  "smallvec",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -552,7 +527,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
 dependencies = [
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -576,7 +551,7 @@ dependencies = [
  "proc-macro2",
  "quote 1.0.9",
  "strsim",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -587,7 +562,7 @@ checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
 dependencies = [
  "darling_core",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -618,7 +593,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -631,7 +606,7 @@ dependencies = [
  "proc-macro2",
  "quote 1.0.9",
  "rustc_version",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -726,7 +701,7 @@ checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -886,7 +861,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1108,7 +1083,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1219,7 +1194,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1251,7 +1226,7 @@ dependencies = [
  "markup5ever",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1421,9 +1396,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 [[package]]
 name = "libc"
-version = "0.2.102"
+version = "0.2.103"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103"
+checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6"
 
 [[package]]
 name = "lock_api"
@@ -1503,12 +1478,6 @@ version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
 
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-
 [[package]]
 name = "memchr"
 version = "2.4.1"
@@ -1614,7 +1583,7 @@ dependencies = [
  "proc-macro-crate 0.1.5",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1721,7 +1690,7 @@ dependencies = [
  "proc-macro-crate 1.1.0",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1963,7 +1932,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -1977,7 +1946,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2012,9 +1981,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
 [[package]]
 name = "pkg-config"
-version = "0.3.19"
+version = "0.3.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb"
 
 [[package]]
 name = "png"
@@ -2093,7 +2062,7 @@ dependencies = [
  "proc-macro-error-attr",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "version_check",
 ]
 
@@ -2502,7 +2471,7 @@ checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2524,7 +2493,7 @@ checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2691,7 +2660,7 @@ dependencies = [
  "heck",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2703,7 +2672,7 @@ dependencies = [
  "heck",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -2719,9 +2688,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "1.0.76"
+version = "1.0.77"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84"
+checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
@@ -2773,8 +2742,7 @@ dependencies = [
 [[package]]
 name = "tao"
 version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1aa57de7c282b68f8906278543a724ed8f5a2568f069dd0cc05fc10d1f07036b"
+source = "git+https://github.com/tauri-apps/tao?branch=next#69ee3f1474007c6e6acc20bcfc71ed3f43ca5414"
 dependencies = [
  "bitflags 1.3.2",
  "cairo-rs",
@@ -2805,7 +2773,8 @@ dependencies = [
  "scopeguard",
  "serde",
  "unicode-segmentation",
- "winapi",
+ "webview2-com-sys",
+ "windows",
  "x11-dl",
 ]
 
@@ -2902,7 +2871,7 @@ version = "1.0.0-beta.5"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "tauri-codegen",
 ]
 
@@ -2919,7 +2888,7 @@ dependencies = [
  "tauri-utils",
  "thiserror",
  "uuid",
- "winapi",
+ "webview2-com-sys",
 ]
 
 [[package]]
@@ -2933,7 +2902,7 @@ dependencies = [
  "tauri-runtime",
  "tauri-utils",
  "uuid",
- "winapi",
+ "webview2-com",
  "wry",
 ]
 
@@ -2954,19 +2923,6 @@ dependencies = [
  "zstd",
 ]
 
-[[package]]
-name = "tauri-webview2"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7685d17e9007618d13f011f916e28a8830c7108c46cf263bd3ab53a19e1a4fc3"
-dependencies = [
- "com",
- "once_cell",
- "webview2-sys",
- "widestring",
- "winapi",
-]
-
 [[package]]
 name = "tempfile"
 version = "3.2.0"
@@ -3015,7 +2971,7 @@ checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -3039,9 +2995,9 @@ dependencies = [
 
 [[package]]
 name = "tinyvec"
-version = "1.4.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5241dd6f21443a3606b432718b166d3cedc962fd4b8bea54a8bc7f514ebda986"
+checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -3237,7 +3193,7 @@ dependencies = [
  "log",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "wasm-bindgen-shared",
 ]
 
@@ -3271,7 +3227,7 @@ checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab"
 dependencies = [
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3339,13 +3295,38 @@ dependencies = [
 ]
 
 [[package]]
-name = "webview2-sys"
-version = "0.1.1"
+name = "webview2-com"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24b7889e893ac4c50d7346356be3ce13a85e56512c38b8fde0526559b8012a4c"
+checksum = "f2294dee38668da0d71019097dddc6cef525fde7aa4784243dd83f0752e08aa5"
 dependencies = [
- "com",
- "winapi",
+ "webview2-com-macros",
+ "webview2-com-sys",
+ "windows",
+]
+
+[[package]]
+name = "webview2-com-macros"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eba35fdbb8fbc8de7e7479532a356dbbf2754d8a6e9c9fbfa430896cbb1ca89"
+dependencies = [
+ "proc-macro2",
+ "quote 1.0.9",
+ "syn 1.0.77",
+]
+
+[[package]]
+name = "webview2-com-sys"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14690dcb8b57c5238c4502cfc321f858fa1306edd4109e8e1d7ddee0c29b06a5"
+dependencies = [
+ "regex",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "windows",
 ]
 
 [[package]]
@@ -3357,12 +3338,6 @@ dependencies = [
  "cc",
 ]
 
-[[package]]
-name = "widestring"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c"
-
 [[package]]
 name = "wildmatch"
 version = "1.1.0"
@@ -3400,6 +3375,51 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef84dd25f4c69a271b1bba394532bf400523b43169de21dfc715e8f8e491053d"
+dependencies = [
+ "const-sha1",
+ "windows_gen",
+ "windows_macros",
+]
+
+[[package]]
+name = "windows_gen"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac7bb21b8ff5e801232b72a6ff554b4cc0cef9ed9238188c3ca78fe3968a7e5d"
+dependencies = [
+ "windows_quote",
+ "windows_reader",
+]
+
+[[package]]
+name = "windows_macros"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5566b8c51118769e4a9094a688bf1233a3f36aacbfc78f3b15817fe0b6e0442f"
+dependencies = [
+ "syn 1.0.77",
+ "windows_gen",
+ "windows_quote",
+ "windows_reader",
+]
+
+[[package]]
+name = "windows_quote"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4af8236a9493c38855f95cdd11b38b342512a5df4ee7473cffa828b5ebb0e39c"
+
+[[package]]
+name = "windows_reader"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c8d5cf83fb08083438c5c46723e6206b2970da57ce314f80b57724439aaacab"
+
 [[package]]
 name = "winres"
 version = "0.1.11"
@@ -3434,7 +3454,7 @@ dependencies = [
 [[package]]
 name = "wry"
 version = "0.12.2"
-source = "git+https://github.com/tauri-apps/wry?rev=21692d986138570d2edc31f84bddb442a3c84a9c#21692d986138570d2edc31f84bddb442a3c84a9c"
+source = "git+https://github.com/tauri-apps/wry?rev=e056fb2a15e29de1b8ed85a548cfeb1f85031357#e056fb2a15e29de1b8ed85a548cfeb1f85031357"
 dependencies = [
  "cocoa",
  "core-graphics 0.22.2",
@@ -3451,24 +3471,22 @@ dependencies = [
  "serde",
  "serde_json",
  "tao",
- "tauri-webview2",
  "thiserror",
  "url",
  "webkit2gtk",
  "webkit2gtk-sys",
- "webview2-sys",
- "winapi",
+ "webview2-com",
+ "windows",
 ]
 
 [[package]]
 name = "x11-dl"
-version = "2.19.0"
+version = "2.19.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eab1e810da9042813865ebe3477261aa77d1f2241f6be747ef8c0e442bc1fa3"
+checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59"
 dependencies = [
  "lazy_static",
  "libc",
- "maybe-uninit",
  "pkg-config",
 ]
 
@@ -3522,7 +3540,7 @@ dependencies = [
  "proc-macro-crate 0.1.5",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]
 
 [[package]]
@@ -3590,5 +3608,5 @@ dependencies = [
  "proc-macro-crate 1.1.0",
  "proc-macro2",
  "quote 1.0.9",
- "syn 1.0.76",
+ "syn 1.0.77",
 ]

+ 4 - 4
tooling/bench/Cargo.lock

@@ -58,9 +58,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
 
 [[package]]
 name = "libc"
-version = "0.2.102"
+version = "0.2.103"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103"
+checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6"
 
 [[package]]
 name = "num-integer"
@@ -202,9 +202,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "1.0.76"
+version = "1.0.77"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84"
+checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0"
 dependencies = [
  "proc-macro2",
  "quote",