mod error;
mod geolocation;
mod media;
mod notification;
mod outcome;
mod registry;
mod request;
pub use crate::permission_state::{WebPermissionKind, WebPermissionResources};
pub use error::WebPermissionError;
pub use media::WebMediaLease;
pub use outcome::{WebNotificationPermission, WebPermissionOutcome, WebPermissionStatus};
pub use request::WebPermissionRequest;
use registry::Registry;
use std::{io, rc::Rc, time::Duration};
use web_sys::{Document, Window};
#[derive(Clone)]
pub struct WebPermissions {
window: Window,
document: Document,
registry: Rc<Registry>,
}
impl WebPermissions {
pub fn current() -> io::Result<Self> {
let window = web_sys::window().ok_or_else(|| {
io::Error::new(
io::ErrorKind::Unsupported,
"Browser permissions require a Window",
)
})?;
let document = window.document().ok_or_else(|| {
io::Error::new(
io::ErrorKind::Unsupported,
"Browser permissions require a Document",
)
})?;
let registry = registry::for_document(&document);
Ok(Self {
window,
document,
registry,
})
}
pub fn request(
&self,
kind: WebPermissionKind,
wait: Duration,
) -> io::Result<WebPermissionRequest> {
if self.window.document().as_ref() != Some(&self.document) {
return Err(io::Error::new(
io::ErrorKind::NotConnected,
"Permission document is no longer current",
));
}
request::start(&self.window, Rc::clone(&self.registry), kind, wait)
}
#[must_use]
pub fn resource_snapshot(&self) -> WebPermissionResources {
let mut resources = self.registry.state.borrow().resources();
resources.geolocation_dispatchers = geolocation::dispatcher_count();
resources
}
}