viewpoint_core/context/permissions/
mod.rs

1//! Permission management for BrowserContext.
2//!
3//! This module provides methods for granting and clearing browser permissions.
4
5use tracing::{debug, instrument};
6
7use viewpoint_cdp::protocol::browser::{GrantPermissionsParams, ResetPermissionsParams};
8
9use super::BrowserContext;
10use super::types::Permission;
11use crate::error::ContextError;
12
13impl BrowserContext {
14    /// Grant permissions to the browser context.
15    ///
16    /// # Example
17    ///
18    /// ```no_run
19    /// use viewpoint_core::{BrowserContext, context::Permission};
20    ///
21    /// # async fn example(context: &BrowserContext) -> Result<(), viewpoint_core::CoreError> {
22    /// context.grant_permissions(vec![
23    ///     Permission::Geolocation,
24    ///     Permission::Notifications,
25    /// ]).await?;
26    /// # Ok(())
27    /// # }
28    /// ```
29    ///
30    /// # Errors
31    ///
32    /// Returns an error if granting permissions fails.
33    #[instrument(level = "debug", skip(self, permissions))]
34    pub async fn grant_permissions(
35        &self,
36        permissions: Vec<Permission>,
37    ) -> Result<(), ContextError> {
38        if self.is_closed() {
39            return Err(ContextError::Closed);
40        }
41
42        debug!(count = permissions.len(), "Granting permissions");
43
44        let cdp_permissions: Vec<_> = permissions
45            .into_iter()
46            .map(|p| p.to_cdp_permission())
47            .collect();
48
49        self.connection()
50            .send_command::<_, serde_json::Value>(
51                "Browser.grantPermissions",
52                Some(
53                    GrantPermissionsParams::new(cdp_permissions)
54                        .browser_context_id(self.context_id()),
55                ),
56                None,
57            )
58            .await?;
59
60        Ok(())
61    }
62
63    /// Grant permissions for a specific origin.
64    ///
65    /// # Errors
66    ///
67    /// Returns an error if granting permissions fails.
68    #[instrument(level = "debug", skip(self, permissions, origin))]
69    pub async fn grant_permissions_for_origin(
70        &self,
71        permissions: Vec<Permission>,
72        origin: impl Into<String>,
73    ) -> Result<(), ContextError> {
74        if self.is_closed() {
75            return Err(ContextError::Closed);
76        }
77
78        let origin = origin.into();
79        debug!(count = permissions.len(), origin = %origin, "Granting permissions for origin");
80
81        let cdp_permissions: Vec<_> = permissions
82            .into_iter()
83            .map(|p| p.to_cdp_permission())
84            .collect();
85
86        self.connection()
87            .send_command::<_, serde_json::Value>(
88                "Browser.grantPermissions",
89                Some(
90                    GrantPermissionsParams::new(cdp_permissions)
91                        .origin(origin)
92                        .browser_context_id(self.context_id()),
93                ),
94                None,
95            )
96            .await?;
97
98        Ok(())
99    }
100
101    /// Clear all granted permissions.
102    ///
103    /// # Errors
104    ///
105    /// Returns an error if clearing permissions fails.
106    #[instrument(level = "debug", skip(self))]
107    pub async fn clear_permissions(&self) -> Result<(), ContextError> {
108        if self.is_closed() {
109            return Err(ContextError::Closed);
110        }
111
112        self.connection()
113            .send_command::<_, serde_json::Value>(
114                "Browser.resetPermissions",
115                Some(ResetPermissionsParams::new().browser_context_id(self.context_id())),
116                None,
117            )
118            .await?;
119
120        Ok(())
121    }
122}