Skip to content

Commit 4b2aa35

Browse files
authored
Add back WebDriver support (#2324)
1 parent af3cc7d commit 4b2aa35

16 files changed

Lines changed: 1000 additions & 7 deletions

File tree

.changes/config.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,11 @@
274274
"create-tauri-app": {
275275
"path": "./tooling/create-tauri-app",
276276
"manager": "javascript"
277+
},
278+
"tauri-driver": {
279+
"path": "./tooling/webdriver",
280+
"manager": "rust",
281+
"postversion": "node ../../.scripts/sync-prerelease.js ${ pkg.pkg } ${ release.type }"
277282
}
278283
}
279284
}

.changes/tauri-driver.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri-driver": minor
3+
---
4+
5+
Initial release including Linux and Windows support.

.changes/webdriver.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri-runtime-wry": patch
3+
---
4+
5+
Add webdriver support to Tauri.

core/tauri-runtime-wry/src/lib.rs

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,13 @@ pub use wry::application::window::{Window, WindowBuilder as WryWindowBuilder};
6464
use wry::webview::WebviewExtWindows;
6565

6666
use 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::*;
8387
mod mime_type;
8488
use mime_type::MimeType;
8589

90+
type WebContextStore = Mutex<HashMap<Option<PathBuf>, WebContext>>;
8691
type WindowEventHandler = Box<dyn Fn(&WindowEvent) + Send>;
8792
type WindowEventListenersMap = Arc<Mutex<HashMap<Uuid, WindowEventHandler>>>;
8893
type 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

20692089
fn 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

tooling/webdriver/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/target
2+
.DS_Store
3+
*.rs.bk
4+
*~
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// Copyright {20\d{2}(-20\d{2})?} Tauri Programme within The Commons Conservancy
2+
// SPDX-License-Identifier: Apache-2.0
3+
// SPDX-License-Identifier: MIT

0 commit comments

Comments
 (0)