use crate::browser::views::PermissionType;
use crate::error::Result;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct PermissionsManager {
client: Arc<crate::browser::cdp::CdpClient>,
}
impl PermissionsManager {
pub fn new(client: Arc<crate::browser::cdp::CdpClient>) -> Self {
Self { client }
}
pub async fn grant(&self, origin: &str, permissions: Vec<PermissionType>) -> Result<()> {
let perms: Vec<String> = permissions
.into_iter()
.map(|p| serde_json::to_string(&p).unwrap().trim_matches('"').to_string())
.collect();
self.client
.send_command(
"Browser.grantPermissions",
serde_json::json!({
"origin": origin,
"permissions": perms,
}),
)
.await?;
Ok(())
}
pub async fn reset(&self, origin: &str) -> Result<()> {
self.client
.send_command(
"Browser.resetPermissions",
serde_json::json!({ "origin": origin }),
)
.await?;
Ok(())
}
pub async fn grant_camera(&self, origin: &str) -> Result<()> {
self.grant(origin, vec![PermissionType::VideoCapture]).await
}
pub async fn grant_microphone(&self, origin: &str) -> Result<()> {
self.grant(origin, vec![PermissionType::AudioCapture]).await
}
pub async fn grant_camera_and_microphone(&self, origin: &str) -> Result<()> {
self.grant(origin, vec![PermissionType::VideoCapture, PermissionType::AudioCapture])
.await
}
pub async fn grant_notifications(&self, origin: &str) -> Result<()> {
self.grant(origin, vec![PermissionType::Notifications]).await
}
pub async fn grant_geolocation(&self, origin: &str) -> Result<()> {
self.grant(origin, vec![PermissionType::Geolocation]).await
}
pub async fn grant_clipboard(&self, origin: &str) -> Result<()> {
self.grant(origin, vec![PermissionType::ClipboardReadWrite]).await
}
pub async fn grant_all_common(&self, origin: &str) -> Result<()> {
self.grant(
origin,
vec![
PermissionType::VideoCapture,
PermissionType::AudioCapture,
PermissionType::Geolocation,
PermissionType::Notifications,
PermissionType::ClipboardReadWrite,
PermissionType::DisplayCapture,
PermissionType::Sensors,
],
)
.await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_permission_type_serialization() {
let perm = PermissionType::VideoCapture;
let json = serde_json::to_string(&perm).unwrap();
assert_eq!(json, "\"videoCapture\"");
let perm = PermissionType::AudioCapture;
let json = serde_json::to_string(&perm).unwrap();
assert_eq!(json, "\"audioCapture\"");
}
#[test]
fn test_permission_types_roundtrip() {
let types = vec![
PermissionType::VideoCapture,
PermissionType::AudioCapture,
PermissionType::Geolocation,
PermissionType::Notifications,
PermissionType::ClipboardReadWrite,
PermissionType::DisplayCapture,
PermissionType::Sensors,
PermissionType::Nfc,
PermissionType::Midi,
PermissionType::MidiSysex,
PermissionType::WakeLockScreen,
PermissionType::WakeLockSystem,
PermissionType::StorageAccess,
PermissionType::WindowManagement,
PermissionType::BackgroundSync,
PermissionType::PaymentHandler,
];
for t in types {
let json = serde_json::to_string(&t).unwrap();
assert!(!json.is_empty());
}
}
}