use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum PermissionType {
AccessibilityEvents,
AudioCapture,
BackgroundSync,
BackgroundFetch,
CapturedSurfaceControl,
ClipboardReadWrite,
ClipboardSanitizedWrite,
DisplayCapture,
DurableStorage,
Flash,
Geolocation,
IdleDetection,
LocalFonts,
Midi,
MidiSysex,
Nfc,
Notifications,
PaymentHandler,
PeriodicBackgroundSync,
ProtectedMediaIdentifier,
Sensors,
SpeakerSelection,
StorageAccess,
TopLevelStorageAccess,
VideoCapture,
VideoCaptureGenericPanTiltZoom,
WakeLockScreen,
WakeLockSystem,
WebAppInstallation,
WindowManagement,
}
impl PermissionType {
pub fn as_str(&self) -> &'static str {
match self {
Self::AccessibilityEvents => "accessibilityEvents",
Self::AudioCapture => "audioCapture",
Self::BackgroundSync => "backgroundSync",
Self::BackgroundFetch => "backgroundFetch",
Self::CapturedSurfaceControl => "capturedSurfaceControl",
Self::ClipboardReadWrite => "clipboardReadWrite",
Self::ClipboardSanitizedWrite => "clipboardSanitizedWrite",
Self::DisplayCapture => "displayCapture",
Self::DurableStorage => "durableStorage",
Self::Flash => "flash",
Self::Geolocation => "geolocation",
Self::IdleDetection => "idleDetection",
Self::LocalFonts => "localFonts",
Self::Midi => "midi",
Self::MidiSysex => "midiSysex",
Self::Nfc => "nfc",
Self::Notifications => "notifications",
Self::PaymentHandler => "paymentHandler",
Self::PeriodicBackgroundSync => "periodicBackgroundSync",
Self::ProtectedMediaIdentifier => "protectedMediaIdentifier",
Self::Sensors => "sensors",
Self::SpeakerSelection => "speakerSelection",
Self::StorageAccess => "storageAccess",
Self::TopLevelStorageAccess => "topLevelStorageAccess",
Self::VideoCapture => "videoCapture",
Self::VideoCaptureGenericPanTiltZoom => "videoCaptureGenericPanTiltZoom",
Self::WakeLockScreen => "wakeLockScreen",
Self::WakeLockSystem => "wakeLockSystem",
Self::WebAppInstallation => "webAppInstallation",
Self::WindowManagement => "windowManagement",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[derive(Default)]
pub enum PermissionSetting {
#[default]
Granted,
Denied,
Prompt,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PermissionDescriptor {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub sysex: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_visible_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_without_gesture: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pan_tilt_zoom: Option<bool>,
}
impl PermissionDescriptor {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
sysex: None,
user_visible_only: None,
allow_without_gesture: None,
pan_tilt_zoom: None,
}
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GrantPermissionsParams {
pub permissions: Vec<PermissionType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub browser_context_id: Option<String>,
}
impl GrantPermissionsParams {
pub fn new(permissions: Vec<PermissionType>) -> Self {
Self {
permissions,
origin: None,
browser_context_id: None,
}
}
#[must_use]
pub fn origin(mut self, origin: impl Into<String>) -> Self {
self.origin = Some(origin.into());
self
}
#[must_use]
pub fn browser_context_id(mut self, id: impl Into<String>) -> Self {
self.browser_context_id = Some(id.into());
self
}
}
#[derive(Debug, Clone, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ResetPermissionsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub browser_context_id: Option<String>,
}
impl ResetPermissionsParams {
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn browser_context_id(mut self, id: impl Into<String>) -> Self {
self.browser_context_id = Some(id.into());
self
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetPermissionParams {
pub permission: PermissionDescriptor,
pub setting: PermissionSetting,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub browser_context_id: Option<String>,
}
impl SetPermissionParams {
pub fn new(permission: PermissionDescriptor, setting: PermissionSetting) -> Self {
Self {
permission,
setting,
origin: None,
browser_context_id: None,
}
}
#[must_use]
pub fn origin(mut self, origin: impl Into<String>) -> Self {
self.origin = Some(origin.into());
self
}
#[must_use]
pub fn browser_context_id(mut self, id: impl Into<String>) -> Self {
self.browser_context_id = Some(id.into());
self
}
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct CloseParams {}
#[derive(Debug, Clone, Serialize, Default)]
pub struct GetVersionParams {}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetVersionResult {
pub protocol_version: String,
pub product: String,
pub revision: String,
pub user_agent: String,
pub js_version: String,
}
#[cfg(test)]
mod tests;