Skip to content

Commit 284eca9

Browse files
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 <[email protected]>
1 parent 8276ab7 commit 284eca9

File tree

17 files changed

+357
-295
lines changed

17 files changed

+357
-295
lines changed

.changes/resources_table_access.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'tauri': 'patch:breaking'
3+
---
4+
5+
`Manager::resources_table` is now scoped so each `App/AppHandle/Window/Webview/WebviewWindow` has its own resource collection.

core/tauri-macros/src/lib.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,19 @@ pub fn default_runtime(attributes: TokenStream, input: TokenStream) -> TokenStre
9494
/// Accepts a closure-like syntax to call arbitrary code on a menu item
9595
/// after matching against `kind` and retrieving it from `resources_table` using `rid`.
9696
///
97-
/// You can optionally pass a third parameter to select which item kinds
97+
/// You can optionally pass a 5th parameter to select which item kinds
9898
/// to match against, by providing a `|` separated list of item kinds
9999
/// ```ignore
100-
/// do_menu_item!(|i| i.set_text(text), Check | Submenu);
100+
/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), Check | Submenu);
101101
/// ```
102102
/// You could also provide a negated list
103103
/// ```ignore
104-
/// do_menu_item!(|i| i.set_text(text), !Check);
105-
/// do_menu_item!(|i| i.set_text(text), !Check | !Submenu);
104+
/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), !Check);
105+
/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), !Check | !Submenu);
106106
/// ```
107107
/// but you can't have mixed negations and positive kinds.
108108
/// ```ignore
109-
/// do_menu_item!(|i| i.set_text(text), !Check | Submeun);
109+
/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text), !Check | Submeun);
110110
/// ```
111111
///
112112
/// #### Example
@@ -115,7 +115,7 @@ pub fn default_runtime(attributes: TokenStream, input: TokenStream) -> TokenStre
115115
/// let rid = 23;
116116
/// let kind = ItemKind::Check;
117117
/// let resources_table = app.resources_table();
118-
/// do_menu_item!(|i| i.set_text(text))
118+
/// do_menu_item!(resources_table, rid, kind, |i| i.set_text(text))
119119
/// ```
120120
/// which will expand into:
121121
/// ```ignore

core/tauri-macros/src/menu.rs

+33-15
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,32 @@ pub struct DoMenuItemInput {
2020
}
2121

2222
#[derive(Clone)]
23-
struct NegatedIdent(bool, Ident);
23+
struct NegatedIdent {
24+
negated: bool,
25+
ident: Ident,
26+
}
27+
28+
impl NegatedIdent {
29+
fn new(ident: &str) -> Self {
30+
Self {
31+
negated: false,
32+
ident: Ident::new(ident, Span::call_site()),
33+
}
34+
}
35+
36+
fn is_negated(&self) -> bool {
37+
self.negated
38+
}
39+
}
2440

2541
impl Parse for NegatedIdent {
2642
fn parse(input: ParseStream) -> syn::Result<Self> {
27-
let t = input.parse::<Token![!]>();
28-
let i: Ident = input.parse()?;
29-
Ok(NegatedIdent(t.is_ok(), i))
43+
let negated_token = input.parse::<Token![!]>();
44+
let ident: Ident = input.parse()?;
45+
Ok(NegatedIdent {
46+
negated: negated_token.is_ok(),
47+
ident,
48+
})
3049
}
3150
}
3251

@@ -67,32 +86,31 @@ pub fn do_menu_item(input: DoMenuItemInput) -> TokenStream {
6786
} = input;
6887

6988
let defaults = vec![
70-
NegatedIdent(false, Ident::new("Submenu", Span::call_site())),
71-
NegatedIdent(false, Ident::new("MenuItem", Span::call_site())),
72-
NegatedIdent(false, Ident::new("Predefined", Span::call_site())),
73-
NegatedIdent(false, Ident::new("Check", Span::call_site())),
74-
NegatedIdent(false, Ident::new("Icon", Span::call_site())),
89+
NegatedIdent::new("Submenu"),
90+
NegatedIdent::new("MenuItem"),
91+
NegatedIdent::new("Predefined"),
92+
NegatedIdent::new("Check"),
93+
NegatedIdent::new("Icon"),
7594
];
7695

7796
if kinds.is_empty() {
7897
kinds.extend(defaults.clone());
7998
}
8099

81-
let has_negated = kinds.iter().any(|n| n.0);
82-
100+
let has_negated = kinds.iter().any(|n| n.is_negated());
83101
if has_negated {
84102
kinds.extend(defaults);
85-
kinds.sort_by(|a, b| a.1.cmp(&b.1));
86-
kinds.dedup_by(|a, b| a.1 == b.1);
103+
kinds.sort_by(|a, b| a.ident.cmp(&b.ident));
104+
kinds.dedup_by(|a, b| a.ident == b.ident);
87105
}
88106

89107
let (kinds, types): (Vec<Ident>, Vec<Ident>) = kinds
90108
.into_iter()
91109
.filter_map(|nident| {
92-
if nident.0 {
110+
if nident.is_negated() {
93111
None
94112
} else {
95-
match nident.1 {
113+
match nident.ident {
96114
i if i == "MenuItem" => Some((i, Ident::new("MenuItem", Span::call_site()))),
97115
i if i == "Submenu" => Some((i, Ident::new("Submenu", Span::call_site()))),
98116
i if i == "Predefined" => Some((i, Ident::new("PredefinedMenuItem", Span::call_site()))),

core/tauri/src/app.rs

+14-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::{
1313
AppManager, Asset,
1414
},
1515
plugin::{Plugin, PluginStore},
16+
resources::ResourceTable,
1617
runtime::{
1718
window::{WebviewEvent as RuntimeWebviewEvent, WindowEvent as RuntimeWindowEvent},
1819
ExitRequestedEventAction, RunEvent as RuntimeRunEvent,
@@ -45,7 +46,7 @@ use std::{
4546
borrow::Cow,
4647
collections::HashMap,
4748
fmt,
48-
sync::{mpsc::Sender, Arc},
49+
sync::{mpsc::Sender, Arc, MutexGuard},
4950
};
5051

5152
use crate::{event::EventId, runtime::RuntimeHandle, Event, EventTarget};
@@ -416,7 +417,12 @@ impl<R: Runtime> AppHandle<R> {
416417
}
417418
}
418419

419-
impl<R: Runtime> Manager<R> for AppHandle<R> {}
420+
impl<R: Runtime> Manager<R> for AppHandle<R> {
421+
fn resources_table(&self) -> MutexGuard<'_, ResourceTable> {
422+
self.manager.resources_table()
423+
}
424+
}
425+
420426
impl<R: Runtime> ManagerBase<R> for AppHandle<R> {
421427
fn manager(&self) -> &AppManager<R> {
422428
&self.manager
@@ -457,7 +463,12 @@ impl<R: Runtime> fmt::Debug for App<R> {
457463
}
458464
}
459465

460-
impl<R: Runtime> Manager<R> for App<R> {}
466+
impl<R: Runtime> Manager<R> for App<R> {
467+
fn resources_table(&self) -> MutexGuard<'_, ResourceTable> {
468+
self.manager.resources_table()
469+
}
470+
}
471+
461472
impl<R: Runtime> ManagerBase<R> for App<R> {
462473
fn manager(&self) -> &AppManager<R> {
463474
&self.manager
@@ -743,7 +754,6 @@ macro_rules! shared_app_impl {
743754
pub fn cleanup_before_exit(&self) {
744755
#[cfg(all(desktop, feature = "tray-icon"))]
745756
self.manager.tray.icons.lock().unwrap().clear();
746-
self.resources_table().clear();
747757
}
748758
}
749759

core/tauri/src/image/mod.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,9 @@ pub enum JsImage {
165165

166166
impl JsImage {
167167
/// Converts this intermediate image format into an actual [`Image`].
168-
pub fn into_img<R: Runtime, M: Manager<R>>(self, app: &M) -> crate::Result<Arc<Image<'_>>> {
168+
pub fn into_img<R: Runtime, M: Manager<R>>(self, manager: &M) -> crate::Result<Arc<Image<'_>>> {
169169
match self {
170-
Self::Resource(rid) => {
171-
let resources_table = app.resources_table();
172-
resources_table.get::<Image<'static>>(rid)
173-
}
170+
Self::Resource(rid) => manager.resources_table().get::<Image<'static>>(rid),
174171
#[cfg(any(feature = "image-ico", feature = "image-png"))]
175172
Self::Path(path) => Image::from_path(path).map(Arc::new).map_err(Into::into),
176173

core/tauri/src/image/plugin.rs

+15-11
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,27 @@
55
use serde::Serialize;
66

77
use crate::plugin::{Builder, TauriPlugin};
8-
use crate::{command, image::Image, AppHandle, Manager, ResourceId, Runtime};
8+
use crate::Manager;
9+
use crate::{command, image::Image, ResourceId, Runtime, Webview};
910

1011
#[command(root = "crate")]
1112
fn new<R: Runtime>(
12-
app: AppHandle<R>,
13+
webview: Webview<R>,
1314
rgba: Vec<u8>,
1415
width: u32,
1516
height: u32,
1617
) -> crate::Result<ResourceId> {
1718
let image = Image::new_owned(rgba, width, height);
18-
let mut resources_table = app.resources_table();
19+
let mut resources_table = webview.resources_table();
1920
let rid = resources_table.add(image);
2021
Ok(rid)
2122
}
2223

2324
#[cfg(any(feature = "image-ico", feature = "image-png"))]
2425
#[command(root = "crate")]
25-
fn from_bytes<R: Runtime>(app: AppHandle<R>, bytes: Vec<u8>) -> crate::Result<ResourceId> {
26+
fn from_bytes<R: Runtime>(webview: Webview<R>, bytes: Vec<u8>) -> crate::Result<ResourceId> {
2627
let image = Image::from_bytes(&bytes)?.to_owned();
27-
let mut resources_table = app.resources_table();
28+
let mut resources_table = webview.resources_table();
2829
let rid = resources_table.add(image);
2930
Ok(rid)
3031
}
@@ -37,9 +38,12 @@ fn from_bytes() -> std::result::Result<(), &'static str> {
3738

3839
#[cfg(any(feature = "image-ico", feature = "image-png"))]
3940
#[command(root = "crate")]
40-
fn from_path<R: Runtime>(app: AppHandle<R>, path: std::path::PathBuf) -> crate::Result<ResourceId> {
41+
fn from_path<R: Runtime>(
42+
webview: Webview<R>,
43+
path: std::path::PathBuf,
44+
) -> crate::Result<ResourceId> {
4145
let image = Image::from_path(path)?.to_owned();
42-
let mut resources_table = app.resources_table();
46+
let mut resources_table = webview.resources_table();
4347
let rid = resources_table.add(image);
4448
Ok(rid)
4549
}
@@ -51,8 +55,8 @@ fn from_path() -> std::result::Result<(), &'static str> {
5155
}
5256

5357
#[command(root = "crate")]
54-
fn rgba<R: Runtime>(app: AppHandle<R>, rid: ResourceId) -> crate::Result<Vec<u8>> {
55-
let resources_table = app.resources_table();
58+
fn rgba<R: Runtime>(webview: Webview<R>, rid: ResourceId) -> crate::Result<Vec<u8>> {
59+
let resources_table = webview.resources_table();
5660
let image = resources_table.get::<Image<'_>>(rid)?;
5761
Ok(image.rgba().to_vec())
5862
}
@@ -64,8 +68,8 @@ struct Size {
6468
}
6569

6670
#[command(root = "crate")]
67-
fn size<R: Runtime>(app: AppHandle<R>, rid: ResourceId) -> crate::Result<Size> {
68-
let resources_table = app.resources_table();
71+
fn size<R: Runtime>(webview: Webview<R>, rid: ResourceId) -> crate::Result<Size> {
72+
let resources_table = webview.resources_table();
6973
let image = resources_table.get::<Image<'_>>(rid)?;
7074
Ok(Size {
7175
width: image.width(),

core/tauri/src/lib.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -895,10 +895,8 @@ pub trait Manager<R: Runtime>: sealed::ManagerBase<R> {
895895
self.manager().state.try_get()
896896
}
897897

898-
/// Get a reference to the resources table.
899-
fn resources_table(&self) -> MutexGuard<'_, ResourceTable> {
900-
self.manager().resources_table()
901-
}
898+
/// Get a reference to the resources table of this manager.
899+
fn resources_table(&self) -> MutexGuard<'_, ResourceTable>;
902900

903901
/// Gets the managed [`Env`].
904902
fn env(&self) -> Env {

core/tauri/src/manager/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,6 @@ impl<R: Runtime> AppManager<R> {
558558
self.webview.webviews_lock().clone()
559559
}
560560

561-
/// Resources table managed by the application.
562561
pub(crate) fn resources_table(&self) -> MutexGuard<'_, ResourceTable> {
563562
self
564563
.resources_table

0 commit comments

Comments
 (0)