diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock index d844e1a..e22d3e3 100644 --- a/apps/desktop/src-tauri/Cargo.lock +++ b/apps/desktop/src-tauri/Cargo.lock @@ -4124,6 +4124,8 @@ dependencies = [ "tempfile", "tokio", "url", + "webview2-com", + "windows-core", "zip", ] diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index d1ee576..c547580 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -49,6 +49,11 @@ reqwest = { version = "0.13", default-features = false, features = ["rustls-no-p rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"] } zip = { version = "4", default-features = false, features = ["deflate-flate2-zlib-rs"] } +# Release builds turn off WebView2's browser context menu and accelerator keys (Back, Refresh, Print, Save as). +[target.'cfg(windows)'.dependencies] +webview2-com = "0.39" +windows-core = "0.62" + [dev-dependencies] tempfile = "3" diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index bac93cd..f6581b7 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -232,6 +232,10 @@ pub fn run() { .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_process::init()) .setup(|app| { + #[cfg(all(windows, not(debug_assertions)))] + if let Some(w) = app.get_webview_window(policy::MAIN) { + harden_webview(&w); + } let data_dir = app.path().app_data_dir()?; logs::init(&data_dir, app.path().home_dir().ok().map(|h| h.to_string_lossy().to_string())); logs::panic_hook(); @@ -381,3 +385,22 @@ pub fn run() { _ => {} }); } + +/// Release builds on Windows: no WebView2 browser context menu (Back, Refresh, Save as, Print, More tools) and no +/// browser accelerator keys (Ctrl+R, Ctrl+P, F5, Ctrl+Shift+I...). The page draws its own menus; dev keeps devtools. +#[cfg(all(windows, not(debug_assertions)))] +fn harden_webview(w: &tauri::WebviewWindow) { + use webview2_com::Microsoft::Web::WebView2::Win32::ICoreWebView2Settings3; + use windows_core::Interface; + let r = w.with_webview(|wv| unsafe { + let Ok(core) = wv.controller().CoreWebView2() else { return }; + let Ok(s) = core.Settings() else { return }; + let _ = s.SetAreDefaultContextMenusEnabled(false); + if let Ok(s3) = s.cast::() { + let _ = s3.SetAreBrowserAcceleratorKeysEnabled(false); + } + }); + if let Err(e) = r { + logs::host("warn", &format!("webview menus not turned off: {e}")); + } +}