cbf-chrome 0.1.0-alpha.7

Chromium-specific safe API layer for CBF.
Documentation
//! Chrome transport capability policy models and conversions.

/// Allow or deny a Chrome-specific capability.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ChromeCapabilityPolicy {
    #[default]
    Allow,
    Deny,
}

impl From<cbf::data::policy::CapabilityPolicy> for ChromeCapabilityPolicy {
    fn from(value: cbf::data::policy::CapabilityPolicy) -> Self {
        match value {
            cbf::data::policy::CapabilityPolicy::Allow => Self::Allow,
            cbf::data::policy::CapabilityPolicy::Deny => Self::Deny,
        }
    }
}

impl From<ChromeCapabilityPolicy> for cbf::data::policy::CapabilityPolicy {
    fn from(value: ChromeCapabilityPolicy) -> Self {
        match value {
            ChromeCapabilityPolicy::Allow => Self::Allow,
            ChromeCapabilityPolicy::Deny => Self::Deny,
        }
    }
}

/// IPC policy transported through the Chrome backend boundary.
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum ChromeIpcPolicy {
    #[default]
    Deny,
    Allow {
        allowed_origins: Vec<String>,
    },
}

impl From<cbf::data::policy::IpcPolicy> for ChromeIpcPolicy {
    fn from(value: cbf::data::policy::IpcPolicy) -> Self {
        match value {
            cbf::data::policy::IpcPolicy::Deny => Self::Deny,
            cbf::data::policy::IpcPolicy::Allow { allowed_origins } => {
                Self::Allow { allowed_origins }
            }
        }
    }
}

impl From<ChromeIpcPolicy> for cbf::data::policy::IpcPolicy {
    fn from(value: ChromeIpcPolicy) -> Self {
        match value {
            ChromeIpcPolicy::Deny => Self::Deny,
            ChromeIpcPolicy::Allow { allowed_origins } => Self::Allow { allowed_origins },
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct ChromeBrowsingContextPolicy {
    pub ipc: ChromeIpcPolicy,
    pub extensions: ChromeCapabilityPolicy,
}

impl From<cbf::data::policy::BrowsingContextPolicy> for ChromeBrowsingContextPolicy {
    fn from(value: cbf::data::policy::BrowsingContextPolicy) -> Self {
        Self {
            ipc: value.ipc.into(),
            extensions: value.extensions.into(),
        }
    }
}

impl From<ChromeBrowsingContextPolicy> for cbf::data::policy::BrowsingContextPolicy {
    fn from(value: ChromeBrowsingContextPolicy) -> Self {
        Self {
            ipc: value.ipc.into(),
            extensions: value.extensions.into(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::{ChromeBrowsingContextPolicy, ChromeCapabilityPolicy, ChromeIpcPolicy};

    #[test]
    fn browsing_context_policy_round_trip_with_generic() {
        let policy = ChromeBrowsingContextPolicy {
            ipc: ChromeIpcPolicy::Allow {
                allowed_origins: vec!["app://simpleapp".to_string()],
            },
            extensions: ChromeCapabilityPolicy::Deny,
        };

        let generic: cbf::data::policy::BrowsingContextPolicy = policy.clone().into();
        let round_trip = ChromeBrowsingContextPolicy::from(generic);

        assert_eq!(round_trip, policy);
    }
}