@@ -64,9 +64,13 @@ pub use wry::application::window::{Window, WindowBuilder as WryWindowBuilder};
6464use wry:: webview:: WebviewExtWindows ;
6565
6666use std:: {
67- collections:: HashMap ,
67+ collections:: {
68+ hash_map:: Entry :: { Occupied , Vacant } ,
69+ HashMap ,
70+ } ,
6871 convert:: TryFrom ,
6972 fs:: read,
73+ path:: PathBuf ,
7074 sync:: {
7175 atomic:: { AtomicBool , Ordering } ,
7276 mpsc:: { channel, Sender } ,
@@ -83,6 +87,7 @@ use menu::*;
8387mod mime_type;
8488use mime_type:: MimeType ;
8589
90+ type WebContextStore = Mutex < HashMap < Option < PathBuf > , WebContext > > ;
8691type WindowEventHandler = Box < dyn Fn ( & WindowEvent ) + Send > ;
8792type WindowEventListenersMap = Arc < Mutex < HashMap < Uuid , WindowEventHandler > > > ;
8893type WindowEventListeners = Arc < Mutex < HashMap < WindowId , WindowEventListenersMap > > > ;
@@ -752,7 +757,9 @@ pub(crate) enum Message {
752757 #[ cfg( feature = "system-tray" ) ]
753758 Tray ( TrayMessage ) ,
754759 CreateWebview (
755- Box < dyn FnOnce ( & EventLoopWindowTarget < Message > ) -> Result < WindowWrapper > + Send > ,
760+ Box <
761+ dyn FnOnce ( & EventLoopWindowTarget < Message > , & WebContextStore ) -> Result < WindowWrapper > + Send ,
762+ > ,
756763 Sender < WindowId > ,
757764 ) ,
758765 CreateWindow (
@@ -956,7 +963,9 @@ impl Dispatch for WryDispatcher {
956963 . context
957964 . proxy
958965 . send_event ( Message :: CreateWebview (
959- Box :: new ( move |event_loop| create_webview ( event_loop, context, pending) ) ,
966+ Box :: new ( move |event_loop, web_context| {
967+ create_webview ( event_loop, web_context, context, pending)
968+ } ) ,
960969 tx,
961970 ) )
962971 . map_err ( |_| Error :: FailedToSendMessage ) ?;
@@ -1243,6 +1252,7 @@ pub struct Wry {
12431252 is_event_loop_running : Arc < AtomicBool > ,
12441253 event_loop : EventLoop < Message > ,
12451254 windows : Arc < Mutex < HashMap < WindowId , WindowWrapper > > > ,
1255+ web_context : WebContextStore ,
12461256 window_event_listeners : WindowEventListeners ,
12471257 #[ cfg( feature = "menu" ) ]
12481258 menu_event_listeners : MenuEventListeners ,
@@ -1288,7 +1298,9 @@ impl RuntimeHandle for WryHandle {
12881298 . dispatcher_context
12891299 . proxy
12901300 . send_event ( Message :: CreateWebview (
1291- Box :: new ( move |event_loop| create_webview ( event_loop, dispatcher_context, pending) ) ,
1301+ Box :: new ( move |event_loop, web_context| {
1302+ create_webview ( event_loop, web_context, dispatcher_context, pending)
1303+ } ) ,
12921304 tx,
12931305 ) )
12941306 . map_err ( |_| Error :: FailedToSendMessage ) ?;
@@ -1348,6 +1360,7 @@ impl Runtime for Wry {
13481360 is_event_loop_running,
13491361 event_loop,
13501362 windows : Default :: default ( ) ,
1363+ web_context : Default :: default ( ) ,
13511364 window_event_listeners : Default :: default ( ) ,
13521365 #[ cfg( feature = "menu" ) ]
13531366 menu_event_listeners : Default :: default ( ) ,
@@ -1382,6 +1395,7 @@ impl Runtime for Wry {
13821395 let proxy = self . event_loop . create_proxy ( ) ;
13831396 let webview = create_webview (
13841397 & self . event_loop ,
1398+ & self . web_context ,
13851399 DispatcherContext {
13861400 main_thread_id : self . main_thread_id ,
13871401 is_event_loop_running : self . is_event_loop_running . clone ( ) ,
@@ -1497,6 +1511,7 @@ impl Runtime for Wry {
14971511 fn run_iteration < F : Fn ( RunEvent ) + ' static > ( & mut self , callback : F ) -> RunIteration {
14981512 use wry:: application:: platform:: run_return:: EventLoopExtRunReturn ;
14991513 let windows = self . windows . clone ( ) ;
1514+ let web_context = & self . web_context ;
15001515 let window_event_listeners = self . window_event_listeners . clone ( ) ;
15011516 #[ cfg( feature = "menu" ) ]
15021517 let menu_event_listeners = self . menu_event_listeners . clone ( ) ;
@@ -1531,6 +1546,7 @@ impl Runtime for Wry {
15311546 #[ cfg( feature = "system-tray" ) ]
15321547 tray_context : & tray_context,
15331548 } ,
1549+ web_context,
15341550 ) ;
15351551 } ) ;
15361552 self . is_event_loop_running . store ( false , Ordering :: Relaxed ) ;
@@ -1541,6 +1557,7 @@ impl Runtime for Wry {
15411557 fn run < F : Fn ( RunEvent ) + ' static > ( self , callback : F ) {
15421558 self . is_event_loop_running . store ( true , Ordering :: Relaxed ) ;
15431559 let windows = self . windows . clone ( ) ;
1560+ let web_context = self . web_context ;
15441561 let window_event_listeners = self . window_event_listeners . clone ( ) ;
15451562 #[ cfg( feature = "menu" ) ]
15461563 let menu_event_listeners = self . menu_event_listeners . clone ( ) ;
@@ -1567,6 +1584,7 @@ impl Runtime for Wry {
15671584 #[ cfg( feature = "system-tray" ) ]
15681585 tray_context : & tray_context,
15691586 } ,
1587+ & web_context,
15701588 ) ;
15711589 } )
15721590 }
@@ -1590,6 +1608,7 @@ fn handle_event_loop(
15901608 event_loop : & EventLoopWindowTarget < Message > ,
15911609 control_flow : & mut ControlFlow ,
15921610 context : EventLoopIterationContext < ' _ > ,
1611+ web_context : & WebContextStore ,
15931612) -> RunIteration {
15941613 let EventLoopIterationContext {
15951614 callback,
@@ -1892,7 +1911,7 @@ fn handle_event_loop(
18921911 }
18931912 }
18941913 }
1895- Message :: CreateWebview ( handler, sender) => match handler ( event_loop) {
1914+ Message :: CreateWebview ( handler, sender) => match handler ( event_loop, web_context ) {
18961915 Ok ( webview) => {
18971916 let window_id = webview. inner . window ( ) . id ( ) ;
18981917 windows. insert ( window_id, webview) ;
@@ -1936,6 +1955,7 @@ fn handle_event_loop(
19361955 sender. send ( Err ( Error :: CreateWindow ) ) . unwrap ( ) ;
19371956 }
19381957 }
1958+
19391959 #[ cfg( feature = "system-tray" ) ]
19401960 Message :: Tray ( tray_message) => match tray_message {
19411961 TrayMessage :: UpdateItem ( menu_id, update) => {
@@ -2068,6 +2088,7 @@ fn center_window(window: &Window) -> Result<()> {
20682088
20692089fn create_webview (
20702090 event_loop : & EventLoopWindowTarget < Message > ,
2091+ web_context : & WebContextStore ,
20712092 context : DispatcherContext ,
20722093 pending : PendingWindow < Wry > ,
20732094) -> Result < WindowWrapper > {
@@ -2134,13 +2155,27 @@ fn create_webview(
21342155 . map_err ( |_| wry:: Error :: InitScriptError )
21352156 } ) ;
21362157 }
2137- let mut context = WebContext :: new ( webview_attributes. data_directory ) ;
2138- webview_builder = webview_builder. with_web_context ( & mut context) ;
2158+
21392159 for script in webview_attributes. initialization_scripts {
21402160 webview_builder = webview_builder. with_initialization_script ( & script) ;
21412161 }
21422162
2163+ let mut web_context = web_context. lock ( ) . expect ( "poisoned WebContext store" ) ;
2164+ let is_first_context = web_context. is_empty ( ) ;
2165+ let web_context = match web_context. entry ( webview_attributes. data_directory ) {
2166+ Occupied ( occupied) => occupied. into_mut ( ) ,
2167+ Vacant ( vacant) => {
2168+ let mut web_context = WebContext :: new ( vacant. key ( ) . clone ( ) ) ;
2169+ web_context. set_allows_automation ( match std:: env:: var ( "TAURI_AUTOMATION" ) . as_deref ( ) {
2170+ Ok ( "true" ) => is_first_context,
2171+ _ => false ,
2172+ } ) ;
2173+ vacant. insert ( web_context)
2174+ }
2175+ } ;
2176+
21432177 let webview = webview_builder
2178+ . with_web_context ( web_context)
21442179 . build ( )
21452180 . map_err ( |e| Error :: CreateWebview ( Box :: new ( e) ) ) ?;
21462181
0 commit comments