use tauri::Runtime;
#[allow(unused_variables)]
pub fn allow_own_media<R: Runtime>(webview: &tauri::Webview<R>) {
#[cfg(target_os = "windows")]
{
let _ = webview.with_webview(|platform| windows_impl::register(&platform));
}
}
#[cfg(target_os = "windows")]
mod windows_impl {
use webview2_com::Microsoft::Web::WebView2::Win32::{
COREWEBVIEW2_PERMISSION_KIND, COREWEBVIEW2_PERMISSION_KIND_CAMERA, COREWEBVIEW2_PERMISSION_KIND_MICROPHONE, COREWEBVIEW2_PERMISSION_STATE_ALLOW,
};
use webview2_com::PermissionRequestedEventHandler;
pub fn own_origin(uri: &str) -> bool {
["http://tauri.localhost", "https://tauri.localhost"].iter().any(|o| uri == *o || uri.starts_with(&format!("{o}/")))
}
pub fn register(platform: &tauri::webview::PlatformWebview) {
unsafe {
let Ok(core) = platform.controller().CoreWebView2() else { return };
let handler = PermissionRequestedEventHandler::create(Box::new(|_, args| {
let Some(args) = args else { return Ok(()) };
let mut kind = COREWEBVIEW2_PERMISSION_KIND::default();
args.PermissionKind(&mut kind)?;
let mut uri = windows::core::PWSTR::null();
args.Uri(&mut uri)?;
let uri = webview2_com::take_pwstr(uri);
if own_origin(&uri) && (kind == COREWEBVIEW2_PERMISSION_KIND_CAMERA || kind == COREWEBVIEW2_PERMISSION_KIND_MICROPHONE) {
args.SetState(COREWEBVIEW2_PERMISSION_STATE_ALLOW)?;
}
Ok(())
}));
let mut token = 0i64;
let _ = core.add_PermissionRequested(&handler, &mut token);
}
}
}