From 284eca9ef2396b76ce3df6f32fb3b2d2c40044ad Mon Sep 17 00:00:00 2001 From: Amr Bashir Date: Tue, 2 Apr 2024 19:41:47 +0200 Subject: [PATCH] refactor(core): scope JS resources to the webview (#9272) * refactor(core): scope JS resources to the webview * clippy * change files * swap args order * more clippy * just add them on each type * clippy * macro docs * Update mod.rs * use random rid * revert resource table arg change --------- Co-authored-by: Lucas Nogueira --- .changes/resources_table_access.md | 5 + core/tauri-macros/src/lib.rs | 12 +- core/tauri-macros/src/menu.rs | 48 +++-- core/tauri/src/app.rs | 18 +- core/tauri/src/image/mod.rs | 7 +- core/tauri/src/image/plugin.rs | 26 +-- core/tauri/src/lib.rs | 6 +- core/tauri/src/manager/mod.rs | 1 - core/tauri/src/menu/plugin.rs | 139 +++++++------- core/tauri/src/resources/mod.rs | 37 ++-- core/tauri/src/resources/plugin.rs | 6 +- core/tauri/src/tray/plugin.rs | 56 +++--- core/tauri/src/webview/mod.rs | 16 +- core/tauri/src/webview/webview_window.rs | 17 +- core/tauri/src/window/mod.rs | 21 +- core/tauri/src/window/plugin.rs | 5 +- examples/api/src-tauri/Cargo.lock | 232 +++++++++++------------ 17 files changed, 357 insertions(+), 295 deletions(-) create mode 100644 .changes/resources_table_access.md diff --git a/.changes/resources_table_access.md b/.changes/resources_table_access.md new file mode 100644 index 000000000..649badeeb --- /dev/null +++ b/.changes/resources_table_access.md @@ -0,0 +1,5 @@ +--- +'tauri': 'patch:breaking' +--- + +`Manager::resources_table` is now scoped so each `App/AppHandle/Window/Webview/WebviewWindow` has its own resource collection. diff --git a/core/tauri-macros/src/lib.rs b/core/tauri-macros/src/lib.rs index a18dad7ac..a5d55748d 100644 --- a/core/tauri-macros/src/lib.rs +++ b/core/tauri-macros/src/lib.rs @@ -94,19 +94,19 @@ pub fn default_runtime(attributes: TokenStream, input: TokenStream) -> TokenStre /// Accepts a closure-like syntax to call arbitrary code on a menu item /// after matching against `kind` and retrieving it from `resources_table` using `rid`. /// -/// You can optionally pass a third parameter to select which item kinds +/// You can optionally pass a 5th parameter to select which item kinds /// to match against, by providing a `|` separated list of item kinds /// ```ignore -/// do_menu_item!(|i| i.set_text(text), Check | Submenu); +/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), Check | Submenu); /// ``` /// You could also provide a negated list /// ```ignore -/// do_menu_item!(|i| i.set_text(text), !Check); -/// do_menu_item!(|i| i.set_text(text), !Check | !Submenu); +/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), !Check); +/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), !Check | !Submenu); /// ``` /// but you can't have mixed negations and positive kinds. /// ```ignore -/// do_menu_item!(|i| i.set_text(text), !Check | Submeun); +/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), !Check | Submeun); /// ``` /// /// #### Example @@ -115,7 +115,7 @@ pub fn default_runtime(attributes: TokenStream, input: TokenStream) -> TokenStre /// let rid = 23; /// let kind = ItemKind::Check; /// let resources_table = app.resources_table(); -/// do_menu_item!(|i| i.set_text(text)) +/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text)) /// ``` /// which will expand into: /// ```ignore diff --git a/core/tauri-macros/src/menu.rs b/core/tauri-macros/src/menu.rs index daa903b6a..1e230d152 100644 --- a/core/tauri-macros/src/menu.rs +++ b/core/tauri-macros/src/menu.rs @@ -20,13 +20,32 @@ pub struct DoMenuItemInput { } #[derive(Clone)] -struct NegatedIdent(bool, Ident); +struct NegatedIdent { + negated: bool, + ident: Ident, +} + +impl NegatedIdent { + fn new(ident: &str) -> Self { + Self { + negated: false, + ident: Ident::new(ident, Span::call_site()), + } + } + + fn is_negated(&self) -> bool { + self.negated + } +} impl Parse for NegatedIdent { fn parse(input: ParseStream) -> syn::Result { - let t = input.parse::(); - let i: Ident = input.parse()?; - Ok(NegatedIdent(t.is_ok(), i)) + let negated_token = input.parse::(); + let ident: Ident = input.parse()?; + Ok(NegatedIdent { + negated: negated_token.is_ok(), + ident, + }) } } @@ -67,32 +86,31 @@ pub fn do_menu_item(input: DoMenuItemInput) -> TokenStream { } = input; let defaults = vec![ - NegatedIdent(false, Ident::new("Submenu", Span::call_site())), - NegatedIdent(false, Ident::new("MenuItem", Span::call_site())), - NegatedIdent(false, Ident::new("Predefined", Span::call_site())), - NegatedIdent(false, Ident::new("Check", Span::call_site())), - NegatedIdent(false, Ident::new("Icon", Span::call_site())), + NegatedIdent::new("Submenu"), + NegatedIdent::new("MenuItem"), + NegatedIdent::new("Predefined"), + NegatedIdent::new("Check"), + NegatedIdent::new("Icon"), ]; if kinds.is_empty() { kinds.extend(defaults.clone()); } - let has_negated = kinds.iter().any(|n| n.0); - + let has_negated = kinds.iter().any(|n| n.is_negated()); if has_negated { kinds.extend(defaults); - kinds.sort_by(|a, b| a.1.cmp(&b.1)); - kinds.dedup_by(|a, b| a.1 == b.1); + kinds.sort_by(|a, b| a.ident.cmp(&b.ident)); + kinds.dedup_by(|a, b| a.ident == b.ident); } let (kinds, types): (Vec, Vec) = kinds .into_iter() .filter_map(|nident| { - if nident.0 { + if nident.is_negated() { None } else { - match nident.1 { + match nident.ident { i if i == "MenuItem" => Some((i, Ident::new("MenuItem", Span::call_site()))), i if i == "Submenu" => Some((i, Ident::new("Submenu", Span::call_site()))), i if i == "Predefined" => Some((i, Ident::new("PredefinedMenuItem", Span::call_site()))), diff --git a/core/tauri/src/app.rs b/core/tauri/src/app.rs index 4fa98bb4e..8765c3a0e 100644 --- a/core/tauri/src/app.rs +++ b/core/tauri/src/app.rs @@ -13,6 +13,7 @@ use crate::{ AppManager, Asset, }, plugin::{Plugin, PluginStore}, + resources::ResourceTable, runtime::{ window::{WebviewEvent as RuntimeWebviewEvent, WindowEvent as RuntimeWindowEvent}, ExitRequestedEventAction, RunEvent as RuntimeRunEvent, @@ -45,7 +46,7 @@ use std::{ borrow::Cow, collections::HashMap, fmt, - sync::{mpsc::Sender, Arc}, + sync::{mpsc::Sender, Arc, MutexGuard}, }; use crate::{event::EventId, runtime::RuntimeHandle, Event, EventTarget}; @@ -416,7 +417,12 @@ impl AppHandle { } } -impl Manager for AppHandle {} +impl Manager for AppHandle { + fn resources_table(&self) -> MutexGuard<'_, ResourceTable> { + self.manager.resources_table() + } +} + impl ManagerBase for AppHandle { fn manager(&self) -> &AppManager { &self.manager @@ -457,7 +463,12 @@ impl fmt::Debug for App { } } -impl Manager for App {} +impl Manager for App { + fn resources_table(&self) -> MutexGuard<'_, ResourceTable> { + self.manager.resources_table() + } +} + impl ManagerBase for App { fn manager(&self) -> &AppManager { &self.manager @@ -743,7 +754,6 @@ macro_rules! shared_app_impl { pub fn cleanup_before_exit(&self) { #[cfg(all(desktop, feature = "tray-icon"))] self.manager.tray.icons.lock().unwrap().clear(); - self.resources_table().clear(); } } diff --git a/core/tauri/src/image/mod.rs b/core/tauri/src/image/mod.rs index 5f2aba199..e7a3c9c85 100644 --- a/core/tauri/src/image/mod.rs +++ b/core/tauri/src/image/mod.rs @@ -165,12 +165,9 @@ pub enum JsImage { impl JsImage { /// Converts this intermediate image format into an actual [`Image`]. - pub fn into_img>(self, app: &M) -> crate::Result>> { + pub fn into_img>(self, manager: &M) -> crate::Result>> { match self { - Self::Resource(rid) => { - let resources_table = app.resources_table(); - resources_table.get::>(rid) - } + Self::Resource(rid) => manager.resources_table().get::>(rid), #[cfg(any(feature = "image-ico", feature = "image-png"))] Self::Path(path) => Image::from_path(path).map(Arc::new).map_err(Into::into), diff --git a/core/tauri/src/image/plugin.rs b/core/tauri/src/image/plugin.rs index ab0fab7d7..d4a9ead37 100644 --- a/core/tauri/src/image/plugin.rs +++ b/core/tauri/src/image/plugin.rs @@ -5,26 +5,27 @@ use serde::Serialize; use crate::plugin::{Builder, TauriPlugin}; -use crate::{command, image::Image, AppHandle, Manager, ResourceId, Runtime}; +use crate::Manager; +use crate::{command, image::Image, ResourceId, Runtime, Webview}; #[command(root = "crate")] fn new( - app: AppHandle, + webview: Webview, rgba: Vec, width: u32, height: u32, ) -> crate::Result { let image = Image::new_owned(rgba, width, height); - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); let rid = resources_table.add(image); Ok(rid) } #[cfg(any(feature = "image-ico", feature = "image-png"))] #[command(root = "crate")] -fn from_bytes(app: AppHandle, bytes: Vec) -> crate::Result { +fn from_bytes(webview: Webview, bytes: Vec) -> crate::Result { let image = Image::from_bytes(&bytes)?.to_owned(); - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); let rid = resources_table.add(image); Ok(rid) } @@ -37,9 +38,12 @@ fn from_bytes() -> std::result::Result<(), &'static str> { #[cfg(any(feature = "image-ico", feature = "image-png"))] #[command(root = "crate")] -fn from_path(app: AppHandle, path: std::path::PathBuf) -> crate::Result { +fn from_path( + webview: Webview, + path: std::path::PathBuf, +) -> crate::Result { let image = Image::from_path(path)?.to_owned(); - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); let rid = resources_table.add(image); Ok(rid) } @@ -51,8 +55,8 @@ fn from_path() -> std::result::Result<(), &'static str> { } #[command(root = "crate")] -fn rgba(app: AppHandle, rid: ResourceId) -> crate::Result> { - let resources_table = app.resources_table(); +fn rgba(webview: Webview, rid: ResourceId) -> crate::Result> { + let resources_table = webview.resources_table(); let image = resources_table.get::>(rid)?; Ok(image.rgba().to_vec()) } @@ -64,8 +68,8 @@ struct Size { } #[command(root = "crate")] -fn size(app: AppHandle, rid: ResourceId) -> crate::Result { - let resources_table = app.resources_table(); +fn size(webview: Webview, rid: ResourceId) -> crate::Result { + let resources_table = webview.resources_table(); let image = resources_table.get::>(rid)?; Ok(Size { width: image.width(), diff --git a/core/tauri/src/lib.rs b/core/tauri/src/lib.rs index b06b9458d..bdf398b5a 100644 --- a/core/tauri/src/lib.rs +++ b/core/tauri/src/lib.rs @@ -895,10 +895,8 @@ pub trait Manager: sealed::ManagerBase { self.manager().state.try_get() } - /// Get a reference to the resources table. - fn resources_table(&self) -> MutexGuard<'_, ResourceTable> { - self.manager().resources_table() - } + /// Get a reference to the resources table of this manager. + fn resources_table(&self) -> MutexGuard<'_, ResourceTable>; /// Gets the managed [`Env`]. fn env(&self) -> Env { diff --git a/core/tauri/src/manager/mod.rs b/core/tauri/src/manager/mod.rs index 7a742fa74..f3f7a72b9 100644 --- a/core/tauri/src/manager/mod.rs +++ b/core/tauri/src/manager/mod.rs @@ -558,7 +558,6 @@ impl AppManager { self.webview.webviews_lock().clone() } - /// Resources table managed by the application. pub(crate) fn resources_table(&self) -> MutexGuard<'_, ResourceTable> { self .resources_table diff --git a/core/tauri/src/menu/plugin.rs b/core/tauri/src/menu/plugin.rs index 9b1536a34..2d0a69ed2 100644 --- a/core/tauri/src/menu/plugin.rs +++ b/core/tauri/src/menu/plugin.rs @@ -2,10 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use std::{ - collections::HashMap, - sync::{Mutex, MutexGuard}, -}; +use std::{collections::HashMap, sync::Mutex}; use serde::{Deserialize, Serialize}; use tauri_runtime::dpi::Position; @@ -16,9 +13,9 @@ use crate::{ image::JsImage, ipc::{channel::JavaScriptChannelId, Channel}, plugin::{Builder, TauriPlugin}, - resources::{ResourceId, ResourceTable}, + resources::ResourceId, sealed::ManagerBase, - AppHandle, Manager, RunEvent, Runtime, State, Webview, Window, + Manager, RunEvent, Runtime, State, Webview, Window, }; use tauri_macros::do_menu_item; @@ -49,12 +46,12 @@ pub(crate) struct AboutMetadata { } impl AboutMetadata { - pub fn into_metdata>( + pub fn into_metadata>( self, - app: &M, + manager: &M, ) -> crate::Result> { let icon = match self.icon { - Some(i) => Some(i.into_img(app)?.as_ref().clone()), + Some(i) => Some(i.into_img(manager)?.as_ref().clone()), None => None, }; @@ -105,11 +102,7 @@ struct SubmenuPayload { } impl SubmenuPayload { - pub fn create_item( - self, - webview: &Webview, - resources_table: &MutexGuard<'_, ResourceTable>, - ) -> crate::Result> { + pub fn create_item(self, webview: &Webview) -> crate::Result> { let mut builder = if let Some(id) = self.id { SubmenuBuilder::with_id(webview, id, self.text) } else { @@ -119,7 +112,7 @@ impl SubmenuPayload { builder = builder.enabled(enabled); } for item in self.items { - builder = item.with_item(webview, resources_table, |i| Ok(builder.item(i)))?; + builder = item.with_item(webview, |i| Ok(builder.item(i)))?; } builder.build() @@ -286,7 +279,7 @@ impl PredefinedMenuItemPayload { Predefined::Quit => PredefinedMenuItem::quit(webview, self.text.as_deref()), Predefined::About(metadata) => { let metadata = match metadata { - Some(m) => Some(m.into_metdata(webview)?), + Some(m) => Some(m.into_metadata(webview)?), None => None, }; PredefinedMenuItem::about(webview, self.text.as_deref(), metadata) @@ -311,14 +304,14 @@ impl MenuItemPayloadKind { pub fn with_item) -> crate::Result>( self, webview: &Webview, - resources_table: &MutexGuard<'_, ResourceTable>, f: F, ) -> crate::Result { match self { Self::ExistingItem((rid, kind)) => { + let resources_table = webview.resources_table(); do_menu_item!(resources_table, rid, kind, |i| f(&*i)) } - Self::Submenu(i) => f(&i.create_item(webview, resources_table)?), + Self::Submenu(i) => f(&i.create_item(webview)?), Self::Predefined(i) => f(&i.create_item(webview)?), Self::Check(i) => f(&i.create_item(webview)?), Self::Icon(i) => f(&i.create_item(webview)?), @@ -343,7 +336,7 @@ struct NewOptions { #[command(root = "crate")] fn new( - app: AppHandle, + app: Webview, webview: Webview, kind: ItemKind, options: Option, @@ -361,7 +354,7 @@ fn new( } if let Some(items) = options.items { for item in items { - builder = item.with_item(&webview, &resources_table, |i| Ok(builder.item(i)))?; + builder = item.with_item(&webview, |i| Ok(builder.item(i)))?; } } let menu = builder.build()?; @@ -378,7 +371,7 @@ fn new( enabled: options.enabled, items: options.items.unwrap_or_default(), } - .create_item(&webview, &resources_table)?; + .create_item(&webview)?; let id = submenu.id().clone(); let rid = resources_table.add(submenu); @@ -461,13 +454,13 @@ fn append( ItemKind::Menu => { let menu = resources_table.get::>(rid)?; for item in items { - item.with_item(&webview, &resources_table, |i| menu.append(i))?; + item.with_item(&webview, |i| menu.append(i))?; } } ItemKind::Submenu => { let submenu = resources_table.get::>(rid)?; for item in items { - item.with_item(&webview, &resources_table, |i| submenu.append(i))?; + item.with_item(&webview, |i| submenu.append(i))?; } } _ => return Err(anyhow::anyhow!("unexpected menu item kind").into()), @@ -488,13 +481,13 @@ fn prepend( ItemKind::Menu => { let menu = resources_table.get::>(rid)?; for item in items { - item.with_item(&webview, &resources_table, |i| menu.prepend(i))?; + item.with_item(&webview, |i| menu.prepend(i))?; } } ItemKind::Submenu => { let submenu = resources_table.get::>(rid)?; for item in items { - item.with_item(&webview, &resources_table, |i| submenu.prepend(i))?; + item.with_item(&webview, |i| submenu.prepend(i))?; } } _ => return Err(anyhow::anyhow!("unexpected menu item kind").into()), @@ -516,14 +509,14 @@ fn insert( ItemKind::Menu => { let menu = resources_table.get::>(rid)?; for item in items { - item.with_item(&webview, &resources_table, |i| menu.insert(i, position))?; + item.with_item(&webview, |i| menu.insert(i, position))?; position += 1 } } ItemKind::Submenu => { let submenu = resources_table.get::>(rid)?; for item in items { - item.with_item(&webview, &resources_table, |i| submenu.insert(i, position))?; + item.with_item(&webview, |i| submenu.insert(i, position))?; position += 1 } } @@ -535,12 +528,12 @@ fn insert( #[command(root = "crate")] fn remove( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, item: (ResourceId, ItemKind), ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let (item_rid, item_kind) = item; match kind { ItemKind::Menu => { @@ -574,12 +567,12 @@ macro_rules! make_item_resource { #[command(root = "crate")] fn remove_at( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, position: usize, ) -> crate::Result> { - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); match kind { ItemKind::Menu => { let menu = resources_table.get::>(rid)?; @@ -601,11 +594,11 @@ fn remove_at( #[command(root = "crate")] fn items( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, ) -> crate::Result> { - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); let items = match kind { ItemKind::Menu => resources_table.get::>(rid)?.items()?, ItemKind::Submenu => resources_table.get::>(rid)?.items()?, @@ -622,12 +615,12 @@ fn items( #[command(root = "crate")] fn get( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, id: MenuId, ) -> crate::Result> { - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); match kind { ItemKind::Menu => { let menu = resources_table.get::>(rid)?; @@ -649,7 +642,7 @@ fn get( #[command(root = "crate")] async fn popup( - app: AppHandle, + webview: Webview, current_window: Window, rid: ResourceId, kind: ItemKind, @@ -657,11 +650,11 @@ async fn popup( at: Option, ) -> crate::Result<()> { let window = window - .map(|w| app.manager().get_window(&w)) + .map(|w| webview.manager().get_window(&w)) .unwrap_or(Some(current_window)); if let Some(window) = window { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); match kind { ItemKind::Menu => { let menu = resources_table.get::>(rid)?; @@ -679,8 +672,11 @@ async fn popup( } #[command(root = "crate")] -fn create_default(app: AppHandle) -> crate::Result<(ResourceId, MenuId)> { - let mut resources_table = app.resources_table(); +fn create_default( + app: AppHandle, + webview: Webview, +) -> crate::Result<(ResourceId, MenuId)> { + let mut resources_table = webview.resources_table(); let menu = Menu::default(&app)?; let id = menu.id().clone(); let rid = resources_table.add(menu); @@ -689,10 +685,10 @@ fn create_default(app: AppHandle) -> crate::Result<(ResourceId, M #[command(root = "crate")] async fn set_as_app_menu( - app: AppHandle, + webview: Webview, rid: ResourceId, ) -> crate::Result> { - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); let menu = resources_table.get::>(rid)?; if let Some(menu) = menu.set_as_app_menu()? { let id = menu.id().clone(); @@ -704,17 +700,17 @@ async fn set_as_app_menu( #[command(root = "crate")] async fn set_as_window_menu( - app: AppHandle, + webview: Webview, current_window: Window, rid: ResourceId, window: Option, ) -> crate::Result> { let window = window - .map(|w| app.manager().get_window(&w)) + .map(|w| webview.manager().get_window(&w)) .unwrap_or(Some(current_window)); if let Some(window) = window { - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); let menu = resources_table.get::>(rid)?; if let Some(menu) = menu.set_as_window_menu(&window)? { let id = menu.id().clone(); @@ -726,40 +722,40 @@ async fn set_as_window_menu( } #[command(root = "crate")] -fn text(app: AppHandle, rid: ResourceId, kind: ItemKind) -> crate::Result { - let resources_table = app.resources_table(); +fn text(webview: Webview, rid: ResourceId, kind: ItemKind) -> crate::Result { + let resources_table = webview.resources_table(); do_menu_item!(resources_table, rid, kind, |i| i.text()) } #[command(root = "crate")] fn set_text( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, text: String, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); do_menu_item!(resources_table, rid, kind, |i| i.set_text(text)) } #[command(root = "crate")] fn is_enabled( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, ) -> crate::Result { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); do_menu_item!(resources_table, rid, kind, |i| i.is_enabled(), !Predefined) } #[command(root = "crate")] fn set_enabled( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, enabled: bool, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); do_menu_item!( resources_table, rid, @@ -771,12 +767,12 @@ fn set_enabled( #[command(root = "crate")] fn set_accelerator( - app: AppHandle, + webview: Webview, rid: ResourceId, kind: ItemKind, accelerator: Option, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); do_menu_item!( resources_table, rid, @@ -788,62 +784,69 @@ fn set_accelerator( #[command(root = "crate")] fn set_as_windows_menu_for_nsapp( - app: AppHandle, + webview: Webview, rid: ResourceId, ) -> crate::Result<()> { #[cfg(target_os = "macos")] { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let submenu = resources_table.get::>(rid)?; submenu.set_as_help_menu_for_nsapp()?; } let _ = rid; - let _ = app; + let _ = webview; Ok(()) } #[command(root = "crate")] -fn set_as_help_menu_for_nsapp(app: AppHandle, rid: ResourceId) -> crate::Result<()> { +fn set_as_help_menu_for_nsapp( + webview: Webview, + rid: ResourceId, +) -> crate::Result<()> { #[cfg(target_os = "macos")] { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let submenu = resources_table.get::>(rid)?; submenu.set_as_help_menu_for_nsapp()?; } let _ = rid; - let _ = app; + let _ = webview; Ok(()) } #[command(root = "crate")] -fn is_checked(app: AppHandle, rid: ResourceId) -> crate::Result { - let resources_table = app.resources_table(); +fn is_checked(webview: Webview, rid: ResourceId) -> crate::Result { + let resources_table = webview.resources_table(); let check_item = resources_table.get::>(rid)?; check_item.is_checked() } #[command(root = "crate")] -fn set_checked(app: AppHandle, rid: ResourceId, checked: bool) -> crate::Result<()> { - let resources_table = app.resources_table(); +fn set_checked( + webview: Webview, + rid: ResourceId, + checked: bool, +) -> crate::Result<()> { + let resources_table = webview.resources_table(); let check_item = resources_table.get::>(rid)?; check_item.set_checked(checked) } #[command(root = "crate")] fn set_icon( - app: AppHandle, + webview: Webview, rid: ResourceId, icon: Option, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let icon_item = resources_table.get::>(rid)?; match icon { Some(Icon::Native(icon)) => icon_item.set_native_icon(Some(icon)), - Some(Icon::Icon(icon)) => icon_item.set_icon(Some(icon.into_img(&app)?.as_ref().clone())), + Some(Icon::Icon(icon)) => icon_item.set_icon(Some(icon.into_img(&webview)?.as_ref().clone())), None => { icon_item.set_icon(None)?; icon_item.set_native_icon(None)?; diff --git a/core/tauri/src/resources/mod.rs b/core/tauri/src/resources/mod.rs index 63dcd6ae5..fcf8982e3 100644 --- a/core/tauri/src/resources/mod.rs +++ b/core/tauri/src/resources/mod.rs @@ -7,7 +7,6 @@ pub(crate) mod plugin; -use crate::error::Error; use std::{ any::{type_name, Any, TypeId}, borrow::Cow, @@ -75,10 +74,15 @@ pub type ResourceId = u32; #[derive(Default)] pub struct ResourceTable { index: BTreeMap>, - next_rid: ResourceId, } impl ResourceTable { + fn new_random_rid() -> u32 { + let mut bytes = [0_u8; 4]; + getrandom::getrandom(&mut bytes).expect("failed to get random bytes"); + u32::from_ne_bytes(bytes) + } + /// Inserts resource into the resource table, which takes ownership of it. /// /// The resource type is erased at runtime and must be statically known @@ -107,10 +111,9 @@ impl ResourceTable { /// /// Returns a unique resource ID, which acts as a key for this resource. pub fn add_arc_dyn(&mut self, resource: Arc) -> ResourceId { - let rid = self.next_rid; + let rid = Self::new_random_rid(); let removed_resource = self.index.insert(rid, resource); assert!(removed_resource.is_none()); - self.next_rid += 1; rid } @@ -121,24 +124,24 @@ impl ResourceTable { /// Returns a reference counted pointer to the resource of type `T` with the /// given `rid`. If `rid` is not present or has a type different than `T`, - /// this function returns [`Error::BadResourceId`]. - pub fn get(&self, rid: ResourceId) -> Result, Error> { + /// this function returns [`Error::BadResourceId`](crate::Error::BadResourceId). + pub fn get(&self, rid: ResourceId) -> crate::Result> { self .index .get(&rid) .and_then(|rc| rc.downcast_arc::()) .cloned() - .ok_or_else(|| Error::BadResourceId(rid)) + .ok_or_else(|| crate::Error::BadResourceId(rid)) } /// Returns a reference counted pointer to the resource of the given `rid`. /// If `rid` is not present, this function returns [`Error::BadResourceId`]. - pub fn get_any(&self, rid: ResourceId) -> Result, Error> { + pub fn get_any(&self, rid: ResourceId) -> crate::Result> { self .index .get(&rid) + .ok_or_else(|| crate::Error::BadResourceId(rid)) .cloned() - .ok_or_else(|| Error::BadResourceId(rid)) } /// Replaces a resource with a new resource. @@ -161,7 +164,7 @@ impl ResourceTable { /// assume that `Arc::strong_count(&returned_arc)` is always equal to 1 on success. /// In particular, be really careful when you want to extract the inner value of /// type `T` from `Arc`. - pub fn take(&mut self, rid: ResourceId) -> Result, Error> { + pub fn take(&mut self, rid: ResourceId) -> crate::Result> { let resource = self.get::(rid)?; self.index.remove(&rid); Ok(resource) @@ -175,11 +178,11 @@ impl ResourceTable { /// we cannot assume that `Arc::strong_count(&returned_arc)` is always equal to 1 /// on success. In particular, be really careful when you want to extract the /// inner value of type `T` from `Arc`. - pub fn take_any(&mut self, rid: ResourceId) -> Result, Error> { + pub fn take_any(&mut self, rid: ResourceId) -> crate::Result> { self .index .remove(&rid) - .ok_or_else(|| Error::BadResourceId(rid)) + .ok_or_else(|| crate::Error::BadResourceId(rid)) } /// Returns an iterator that yields a `(id, name)` pair for every resource @@ -199,17 +202,11 @@ impl ResourceTable { /// counted, therefore pending ops are not automatically cancelled. A resource /// may implement the `close()` method to perform clean-ups such as canceling /// ops. - pub fn close(&mut self, rid: ResourceId) -> Result<(), Error> { + pub fn close(&mut self, rid: ResourceId) -> crate::Result<()> { self .index .remove(&rid) - .ok_or_else(|| Error::BadResourceId(rid)) + .ok_or_else(|| crate::Error::BadResourceId(rid)) .map(|resource| resource.close()) } - - /// Removes and frees all resources stored. Note that the - /// resource's `close()` method is *not* called. - pub(crate) fn clear(&mut self) { - self.index.clear() - } } diff --git a/core/tauri/src/resources/plugin.rs b/core/tauri/src/resources/plugin.rs index f0cc45009..7786fe74e 100644 --- a/core/tauri/src/resources/plugin.rs +++ b/core/tauri/src/resources/plugin.rs @@ -5,14 +5,14 @@ use crate::{ command, plugin::{Builder, TauriPlugin}, - AppHandle, Manager, Runtime, + Manager, Runtime, Webview, }; use super::ResourceId; #[command(root = "crate")] -fn close(app: AppHandle, rid: ResourceId) -> crate::Result<()> { - app.resources_table().close(rid) +fn close(webview: Webview, rid: ResourceId) -> crate::Result<()> { + webview.resources_table().close(rid) } pub(crate) fn init() -> TauriPlugin { diff --git a/core/tauri/src/tray/plugin.rs b/core/tauri/src/tray/plugin.rs index 8113a3be0..8b6c09cae 100644 --- a/core/tauri/src/tray/plugin.rs +++ b/core/tauri/src/tray/plugin.rs @@ -14,7 +14,7 @@ use crate::{ plugin::{Builder, TauriPlugin}, resources::ResourceId, tray::TrayIconBuilder, - AppHandle, Manager, Runtime, + AppHandle, Manager, Runtime, Webview, }; use super::TrayIcon; @@ -34,7 +34,7 @@ struct TrayIconOptions { #[command(root = "crate")] fn new( - app: AppHandle, + webview: Webview, options: TrayIconOptions, handler: Channel, ) -> crate::Result<(ResourceId, String)> { @@ -48,7 +48,7 @@ fn new( let _ = handler.send(e); }); - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); if let Some((rid, kind)) = options.menu { match kind { @@ -64,7 +64,7 @@ fn new( }; } if let Some(icon) = options.icon { - builder = builder.icon(icon.into_img(&app)?.as_ref().clone()); + builder = builder.icon(icon.into_img(&webview)?.as_ref().clone()); } if let Some(tooltip) = options.tooltip { builder = builder.tooltip(tooltip); @@ -82,7 +82,7 @@ fn new( builder = builder.menu_on_left_click(menu_on_left_click); } - let tray = builder.build(&app)?; + let tray = builder.build(&webview)?; let id = tray.id().as_ref().to_string(); let rid = resources_table.add(tray); @@ -90,10 +90,14 @@ fn new( } #[command(root = "crate")] -fn get_by_id(app: AppHandle, id: &str) -> crate::Result> { +fn get_by_id( + app: AppHandle, + webview: Webview, + id: &str, +) -> crate::Result> { let tray = app.tray_by_id(id); let maybe_rid = tray.map(|tray| { - let mut resources_table = app.resources_table(); + let mut resources_table = webview.resources_table(); resources_table.add(tray) }); Ok(maybe_rid) @@ -110,14 +114,14 @@ fn remove_by_id(app: AppHandle, id: &str) -> crate::Result<()> { #[command(root = "crate")] fn set_icon( - app: AppHandle, + webview: Webview, rid: ResourceId, icon: Option, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; let icon = match icon { - Some(i) => Some(i.into_img(&app)?.as_ref().clone()), + Some(i) => Some(i.into_img(&webview)?.as_ref().clone()), None => None, }; tray.set_icon(icon) @@ -125,11 +129,11 @@ fn set_icon( #[command(root = "crate")] fn set_menu( - app: AppHandle, + webview: Webview, rid: ResourceId, menu: Option<(ResourceId, ItemKind)>, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; if let Some((rid, kind)) = menu { match kind { @@ -151,62 +155,66 @@ fn set_menu( #[command(root = "crate")] fn set_tooltip( - app: AppHandle, + webview: Webview, rid: ResourceId, tooltip: Option, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; tray.set_tooltip(tooltip) } #[command(root = "crate")] fn set_title( - app: AppHandle, + webview: Webview, rid: ResourceId, title: Option, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; tray.set_title(title) } #[command(root = "crate")] -fn set_visible(app: AppHandle, rid: ResourceId, visible: bool) -> crate::Result<()> { - let resources_table = app.resources_table(); +fn set_visible( + webview: Webview, + rid: ResourceId, + visible: bool, +) -> crate::Result<()> { + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; tray.set_visible(visible) } #[command(root = "crate")] fn set_temp_dir_path( - app: AppHandle, + webview: Webview, rid: ResourceId, path: Option, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; tray.set_temp_dir_path(path) } #[command(root = "crate")] fn set_icon_as_template( - app: AppHandle, + webview: Webview, rid: ResourceId, as_template: bool, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; tray.set_icon_as_template(as_template) } #[command(root = "crate")] fn set_show_menu_on_left_click( - app: AppHandle, + webview: Webview, rid: ResourceId, on_left: bool, ) -> crate::Result<()> { - let resources_table = app.resources_table(); + let resources_table = webview.resources_table(); let tray = resources_table.get::>(rid)?; tray.set_show_menu_on_left_click(on_left) } diff --git a/core/tauri/src/webview/mod.rs b/core/tauri/src/webview/mod.rs index 792b8c37d..d6efe7abe 100644 --- a/core/tauri/src/webview/mod.rs +++ b/core/tauri/src/webview/mod.rs @@ -34,14 +34,14 @@ use crate::{ }, manager::{webview::WebviewLabelDef, AppManager}, sealed::{ManagerBase, RuntimeOrDispatch}, - AppHandle, Event, EventId, EventLoopMessage, Manager, Runtime, Window, + AppHandle, Event, EventId, EventLoopMessage, Manager, ResourceTable, Runtime, Window, }; use std::{ borrow::Cow, hash::{Hash, Hasher}, path::PathBuf, - sync::{Arc, Mutex}, + sync::{Arc, Mutex, MutexGuard}, }; pub(crate) type WebResourceRequestHandler = @@ -786,6 +786,7 @@ pub struct Webview { pub(crate) app_handle: AppHandle, /// The webview created by the runtime. pub(crate) webview: DetachedWebview, + pub(crate) resources_table: Arc>, } impl std::fmt::Debug for Webview { @@ -804,6 +805,7 @@ impl Clone for Webview { manager: self.manager.clone(), app_handle: self.app_handle.clone(), webview: self.webview.clone(), + resources_table: self.resources_table.clone(), } } } @@ -832,6 +834,7 @@ impl Webview { manager: window.manager.clone(), app_handle: window.app_handle.clone(), webview, + resources_table: Default::default(), } } @@ -1502,7 +1505,14 @@ tauri::Builder::default() } } -impl Manager for Webview {} +impl Manager for Webview { + fn resources_table(&self) -> MutexGuard<'_, ResourceTable> { + self + .resources_table + .lock() + .expect("poisoned window resources table") + } +} impl ManagerBase for Webview { fn manager(&self) -> &AppManager { diff --git a/core/tauri/src/webview/webview_window.rs b/core/tauri/src/webview/webview_window.rs index e62628be0..90c483536 100644 --- a/core/tauri/src/webview/webview_window.rs +++ b/core/tauri/src/webview/webview_window.rs @@ -4,12 +4,17 @@ //! [`Window`] that hosts a single [`Webview`]. -use std::{borrow::Cow, path::PathBuf, sync::Arc}; +use std::{ + borrow::Cow, + path::PathBuf, + sync::{Arc, MutexGuard}, +}; use crate::{ event::EventTarget, runtime::dpi::{PhysicalPosition, PhysicalSize}, window::Monitor, + ResourceTable, }; #[cfg(desktop)] use crate::{ @@ -1790,7 +1795,15 @@ tauri::Builder::default() } } -impl Manager for WebviewWindow {} +impl Manager for WebviewWindow { + fn resources_table(&self) -> MutexGuard<'_, ResourceTable> { + self + .webview + .resources_table + .lock() + .expect("poisoned window resources table") + } +} impl ManagerBase for WebviewWindow { fn manager(&self) -> &AppManager { diff --git a/core/tauri/src/window/mod.rs b/core/tauri/src/window/mod.rs index 4c20a78d4..9df2fc711 100644 --- a/core/tauri/src/window/mod.rs +++ b/core/tauri/src/window/mod.rs @@ -25,11 +25,10 @@ use crate::{ window::{DetachedWindow, PendingWindow, WindowBuilder as _}, RuntimeHandle, WindowDispatch, }, - sealed::ManagerBase, - sealed::RuntimeOrDispatch, + sealed::{ManagerBase, RuntimeOrDispatch}, utils::config::{WindowConfig, WindowEffectsConfig}, webview::WebviewBuilder, - EventLoopMessage, Manager, Runtime, Theme, Webview, WindowEvent, + EventLoopMessage, Manager, ResourceTable, Runtime, Theme, Webview, WindowEvent, }; #[cfg(desktop)] use crate::{ @@ -51,7 +50,7 @@ use tauri_macros::default_runtime; use std::{ fmt, hash::{Hash, Hasher}, - sync::Arc, + sync::{Arc, Mutex, MutexGuard}, }; /// Monitor descriptor. @@ -876,7 +875,8 @@ pub struct Window { pub(crate) app_handle: AppHandle, // The menu set for this window #[cfg(desktop)] - pub(crate) menu: Arc>>>, + pub(crate) menu: Arc>>>, + pub(crate) resources_table: Arc>, } impl std::fmt::Debug for Window { @@ -913,6 +913,7 @@ impl Clone for Window { app_handle: self.app_handle.clone(), #[cfg(desktop)] menu: self.menu.clone(), + resources_table: self.resources_table.clone(), } } } @@ -932,7 +933,14 @@ impl PartialEq for Window { } } -impl Manager for Window {} +impl Manager for Window { + fn resources_table(&self) -> MutexGuard<'_, ResourceTable> { + self + .resources_table + .lock() + .expect("poisoned window resources table") + } +} impl ManagerBase for Window { fn manager(&self) -> &AppManager { @@ -974,6 +982,7 @@ impl Window { app_handle, #[cfg(desktop)] menu: Arc::new(std::sync::Mutex::new(menu)), + resources_table: Default::default(), } } diff --git a/core/tauri/src/window/plugin.rs b/core/tauri/src/window/plugin.rs index 58a445d04..639dee9a2 100644 --- a/core/tauri/src/window/plugin.rs +++ b/core/tauri/src/window/plugin.rs @@ -20,7 +20,7 @@ mod desktop_commands { utils::config::{WindowConfig, WindowEffectsConfig}, window::{ProgressBarState, WindowBuilder}, AppHandle, CursorIcon, Monitor, PhysicalPosition, PhysicalSize, Position, Size, Theme, - UserAttentionType, Window, + UserAttentionType, Webview, Window, }; #[command(root = "crate")] @@ -132,13 +132,14 @@ mod desktop_commands { #[command(root = "crate")] pub async fn set_icon( + webview: Webview, window: Window, label: Option, value: crate::image::JsImage, ) -> crate::Result<()> { let window = get_window(window, label)?; window - .set_icon(value.into_img(&window)?.as_ref().clone()) + .set_icon(value.into_img(&webview)?.as_ref().clone()) .map_err(Into::into) } diff --git a/examples/api/src-tauri/Cargo.lock b/examples/api/src-tauri/Cargo.lock index a3806a653..ee9d8069d 100644 --- a/examples/api/src-tauri/Cargo.lock +++ b/examples/api/src-tauri/Cargo.lock @@ -706,6 +706,15 @@ dependencies = [ "syn 2.0.52", ] +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + [[package]] name = "dtoa" version = "1.0.9" @@ -753,15 +762,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -1239,25 +1239,6 @@ dependencies = [ "syn 2.0.52", ] -[[package]] -name = "h2" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1304,9 +1285,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -1315,12 +1296,24 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", "pin-project-lite", ] @@ -1336,34 +1329,43 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.28" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", - "h2", "http", "http-body", "httparse", - "httpdate", "itoa 1.0.10", "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", "socket2", "tokio", + "tower", "tower-service", "tracing", - "want", ] [[package]] @@ -1780,12 +1782,13 @@ dependencies = [ [[package]] name = "muda" -version = "0.12.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e27c56b8cb9b3214d196556227b0eaa12db8393b4f919a0a93ffb67ed17d185" +checksum = "f428b4e9db3d17e2f809dfb1ff9ddfbbf16c71790d1656d10aee320877e1392f" dependencies = [ "cocoa", "crossbeam-channel", + "dpi", "gtk", "keyboard-types", "objc", @@ -2136,6 +2139,26 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -2447,19 +2470,19 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "2d66674f2b6fb864665eea7a3c1ac4e3dfacd2fda83cf6f935a612e01b0e3338" dependencies = [ "base64 0.21.7", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", "http", "http-body", + "http-body-util", "hyper", + "hyper-util", "ipnet", "js-sys", "log", @@ -2471,7 +2494,6 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-util", "tower-service", @@ -2925,27 +2947,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "system-deps" version = "6.2.0" @@ -2961,9 +2962,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.26.1" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccba570365293ca309d60f30fdac2c5271b732dc762e6154e59c85d2c762a0a1" +checksum = "bd5b6ec2c43abd15155f040c765001098f50f425414b679225d471a1cd782753" dependencies = [ "bitflags 1.3.2", "cocoa", @@ -2972,10 +2973,10 @@ dependencies = [ "crossbeam-channel", "dispatch", "dlopen2", + "dpi", "gdkwayland-sys", "gdkx11-sys", "gtk", - "image", "instant", "jni", "lazy_static", @@ -2987,14 +2988,12 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "png", "raw-window-handle 0.6.0", "scopeguard", "tao-macros", "unicode-segmentation", "url", - "windows 0.52.0", - "windows-implement 0.52.0", + "windows 0.54.0", "windows-version", "x11-dl", ] @@ -3018,7 +3017,7 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tauri" -version = "2.0.0-beta.12" +version = "2.0.0-beta.13" dependencies = [ "anyhow", "bytes", @@ -3154,6 +3153,7 @@ dependencies = [ name = "tauri-runtime" version = "2.0.0-beta.10" dependencies = [ + "dpi", "gtk", "http", "jni", @@ -3429,6 +3429,28 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -3441,6 +3463,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3498,9 +3521,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "454035ff34b8430638c894e6197748578d6b4d449c6edaf8ea854d94e2dd862b" +checksum = "8713f74e697917aa794800289e15bce534fc91450312ab2d3edf5b8907f7301a" dependencies = [ "cocoa", "core-graphics", @@ -3878,8 +3901,8 @@ dependencies = [ "webview2-com-sys", "windows 0.54.0", "windows-core 0.54.0", - "windows-implement 0.53.0", - "windows-interface 0.53.0", + "windows-implement", + "windows-interface", ] [[package]] @@ -3948,18 +3971,6 @@ dependencies = [ "windows-version", ] -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-implement 0.52.0", - "windows-interface 0.52.0", - "windows-targets 0.52.4", -] - [[package]] name = "windows" version = "0.53.0" @@ -3977,8 +3988,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" dependencies = [ "windows-core 0.54.0", - "windows-implement 0.53.0", - "windows-interface 0.53.0", + "windows-implement", + "windows-interface", "windows-targets 0.52.4", ] @@ -4011,17 +4022,6 @@ dependencies = [ "windows-targets 0.52.4", ] -[[package]] -name = "windows-implement" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - [[package]] name = "windows-implement" version = "0.53.0" @@ -4033,17 +4033,6 @@ dependencies = [ "syn 2.0.52", ] -[[package]] -name = "windows-interface" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.52", -] - [[package]] name = "windows-interface" version = "0.53.0" @@ -4302,9 +4291,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.38.2" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741261f2571990873d0dd5953cff8087f39a16fb37550edd0acf7221b9c8d65b" +checksum = "4eca9d50437c04fc67e82c196ddd31d8e35794150713ae2d647f3a58c7f45d1a" dependencies = [ "base64 0.21.7", "block", @@ -4312,6 +4301,7 @@ dependencies = [ "cocoa", "core-graphics", "crossbeam-channel", + "dpi", "dunce", "gdkx11", "gtk",