diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index f63c31e19..95bf8c547 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -43,7 +43,7 @@ pub(crate) fn main_window_title(app: &AppHandle) -> &str { target_os = "netbsd" ) ))] -fn prompt_webview_permission(message: &str) -> bool { +fn prompt_webview_permission(message: &str, resolve: impl FnOnce(bool) + 'static) { use gtk::prelude::*; use gtk::{ButtonsType, DialogFlags, MessageDialog, MessageType, ResponseType}; @@ -55,9 +55,14 @@ fn prompt_webview_permission(message: &str) -> bool { message, ); dialog.set_title("Permission request"); - let response = dialog.run(); - dialog.close(); - matches!(response, ResponseType::Yes) + let resolve = std::cell::Cell::new(Some(resolve)); + dialog.connect_response(move |dialog, response| { + if let Some(resolve) = resolve.take() { + resolve(matches!(response, ResponseType::Yes)); + } + dialog.close(); + }); + dialog.show(); } // Return the remembered decision for a webview permission, or prompt the user @@ -76,7 +81,8 @@ fn resolve_webview_permission( app: &AppHandle, key: &str, message: &str, -) -> bool { + resolve: impl FnOnce(bool) + 'static, +) { use tauri_plugin_store::StoreExt; let store = app.store("permissions.json").ok(); @@ -85,17 +91,18 @@ fn resolve_webview_permission( .and_then(|store| store.get(key)) .and_then(|value| value.as_bool()) { - return allowed; - } - - let allowed = prompt_webview_permission(message); - - if let Some(store) = &store { - store.set(key, allowed); - let _ = store.save(); + resolve(allowed); + return; } - allowed + let key = key.to_owned(); + prompt_webview_permission(message, move |allowed| { + if let Some(store) = &store { + store.set(&key, allowed); + let _ = store.save(); + } + resolve(allowed); + }); } /// Routes in-app notification sounds to the native volume stream on mobile. @@ -233,6 +240,7 @@ pub fn show_or_create_main_window(app: &AppHandle) -> taur gtk_webview.connect_permission_request(move |_wv, request| { // Ask the user (once per permission type, then remember the choice) // for the permissions Sable actually uses; deny anything else. + let request = request.clone(); let decision = if request .downcast_ref::() .is_some() @@ -256,12 +264,17 @@ pub fn show_or_create_main_window(app: &AppHandle) -> taur }; match decision { - Some((key, message)) - if resolve_webview_permission(&app_handle, key, message) => - { - request.allow(); + Some((key, message)) => { + let request = request.clone(); + resolve_webview_permission(&app_handle, key, message, move |allowed| { + if allowed { + request.allow(); + } else { + request.deny(); + } + }); } - _ => request.deny(), + None => request.deny(), } true });