use std::sync::Arc;
use cef::*;
wrap_download_handler! {
pub struct TauriCefDownloadHandler {
download_handler: Arc<tauri_runtime::webview::DownloadHandler>,
}
impl DownloadHandler {
fn can_download(
&self,
_browser: Option<&mut Browser>,
_url: Option<&CefStringUtf16>,
_request_method: Option<&CefStringUtf16>,
) -> ::std::os::raw::c_int {
1
}
fn on_before_download(
&self,
_browser: Option<&mut Browser>,
download_item: Option<&mut DownloadItem>,
suggested_name: Option<&CefStringUtf16>,
callback: Option<&mut BeforeDownloadCallback>,
) -> ::std::os::raw::c_int {
let Some(download_item) = download_item else {
return 0;
};
let Some(callback) = callback else {
return 0;
};
let url_str = CefString::from(&download_item.url()).to_string();
let Ok(url) = url::Url::parse(&url_str) else {
return 0;
};
let suggested_path = suggested_name
.map(|s| s.to_string())
.map(std::path::PathBuf::from)
.unwrap_or_default();
let mut destination = suggested_path.clone();
let should_allow =
(self.download_handler)(tauri_runtime::webview::DownloadEvent::Requested {
url: url.clone(),
destination: &mut destination,
});
if should_allow {
let destination_cef = CefStringUtf16::from(destination.to_string_lossy().as_ref());
let show_dialog = destination == suggested_path;
callback.cont(Some(&destination_cef), show_dialog as ::std::os::raw::c_int);
}
1
}
fn on_download_updated(
&self,
_browser: Option<&mut Browser>,
download_item: Option<&mut DownloadItem>,
_callback: Option<&mut DownloadItemCallback>,
) {
let Some(download_item) = download_item else {
return;
};
let url_str = CefString::from(&download_item.url()).to_string();
let Ok(url) = url::Url::parse(&url_str) else {
return;
};
let is_complete = download_item.is_complete() != 0;
let is_canceled = download_item.is_canceled() != 0;
let success = is_complete && !is_canceled;
let full_path = if is_complete || is_canceled {
let path_cef = download_item.full_path();
let path_str = CefString::from(&path_cef).to_string();
if !path_str.is_empty() {
Some(std::path::PathBuf::from(path_str))
} else {
None
}
} else {
None
};
if is_complete || is_canceled {
(self.download_handler)(tauri_runtime::webview::DownloadEvent::Finished {
url,
path: full_path,
success,
});
}
}
}
}